Form: setDefaults + DB, zvláštní chování
- besir
- Člen | 170
Zdravím,
řeším formulář pro editaci uživatelských dat, tedy vytáhnu data z DB,
předám metodě ve které vytvářím form a snažím se nastavit defaultní
hodnoty, to se ovšem chová dost podivně…
public function createComponentAddUserForm($user=NULL)
{
$form = new Form;
$form->addText('name')
->setRequired('Zadejte jméno kontaktu')
->setAttribute('placeholder', 'Jméno*')
->setAttribute('class', 'input-half input-left left');
$form->addText('surname')
->setRequired('Zadejte pozici kontaktu')
->setAttribute('placeholder', 'Příjmení*')
->setAttribute('class', 'input-half input-right left');
// ...
$defaults = array(
'name' => 'jméno ne', // vypíše v imputu 'jméno ne'
'surname' => $user['surname'], // vypíše v imputu 'a', ale při var_dump($user['surname']) se jedná o string(7) 'Horáček'
'username' => $user['username'],
// ...
$form->setDefaults($defaults);
$form->onSuccess[] = callback($this, 'addUserFormSubmited');
return $form;
}
Pokud předám ručně string ‚jméno ne'tak se v imputu vypíše v pořádku, pokud předám záznam z DB tak se v imputu vypíše 'a‘, ikdyž se podle var_dump() jedná o string. Děkuju za pomoc
- Vojtěch Dobeš
- Gold Partner | 1316
Pokud data z DB obsahují řetězec "a"
, proč by nebyl
vypsán? Spíše mě děsí ta proměnná $user
, kde si ji
předáváš?
- besir
- Člen | 170
vojtech.dobes napsal(a):
Pokud data z DB obsahují řetězec
"a"
, proč by nebyl vypsán? Spíše mě děsí ta proměnná$user
, kde si ji předáváš?
Neobsahují řetězec ‚a‘. Proměnou user si předívám here:
public function createComponentAddUserForm($user=NULL)
{
//...
public function actionEdit($id)
{
$user = $this->context->createUsers()
->where('id', $id)->limit(1)->fetch();
$this->template->addUser = $this->createComponentAddUserForm($user);
}
- Vojtěch Dobeš
- Gold Partner | 1316
Hm, zatím ti nedokážu odpovědět, ale rozhodně:
NIKDY TAKTO NEVOLEJ
createComponent<Something>
metodu. To se takhle nepoužívá,
framework ji vždy volá interně, kde si vůbec nemůžeš zajistit předání
nějaké tvojí proměnné. Všechny továrničky (tedy metody začínající na
createComponent
) standardně dostávají jako argument název
(řetězec) – nesnaž se to měnit.
Pokud si nutně do šablony potřebuješ předat formulář, udělej to takto:
$this->template->addUser = $this['addUserForm'];
Data o uživateli tam dostaneš takto:
private $userData;
public function actionEdit($id)
{
$this->userData = $this->context->createUsers()
->where('id', $id)->limit(1)->fetch();
}
public function createComponentAddUserForm()
{
$user = $this->userData;
}
- 22
- Člen | 1478
Takhle se proměnná do komponenty předávat nemůže. Konstruktor
je jaksi obsazený jménem komponenty. Musíš si na to udělat
nějaký setter například nebo si upravit konstruktor. Jinak kompeneta do
šablony se předá, když už to musí být,
$this->getComponent('addUserForm')
nebo
`$this[‚addUserForm‘], `takže to máš komplet špatně.
Planette jsi asi ještě zřejmě nepolíbený :-)
edit: dtto jako @vojta
Editoval 22 (29. 5. 2012 8:48)
- Ascaria
- Člen | 187
A udělal sis var dump takto:
public function createComponentAddUserForm($user=NULL)
{
var_dump($user);
// ...
}
a nebo jinak? :)
Já pořád tvrdím, že settery jsou jediná správná volba :) A až je začne podporovat i PHP, tak budou mít i přehlednější zápis.
Jen pro pořádek, zkusím vysvětlit, proč jsi tam měl „a“:
V šabloně jsi měl asi něco jako
{control addUserForm}
to zavolalo
public function createComponentAddUserForm(/* $user = */'addUserForm')
{/* ... */}
tys pak chtěl volat $user[‚surname‘] jenže $user byl string, tak se interně v php přetypovalo ‚surname‘ na 0 a zavolalo se $user[0] a na první pozici bylo ‚a‘.
edit:
řádek
$this->template->addUser = $this->createComponentAddUserForm($user);
pravděpodobně proběhl tak jak jsi chtěl, ale formulář zustal nepřipojený k presenteru čili pokud si v šabloně zavolal {control}, měl jsi formuláře 2.
Btw. jak si ten formulář zavolal v šabloně?
Editoval Ascaria (29. 5. 2012 10:03)