Form: setDefaults + DB, zvláštní chování

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
besir
Člen | 170
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

besir
Člen | 170
+
0
-

Áááá, děkuji, při změně předávání dat to funguje, ale beztak mi vrtá hlavou že to nešlo, když var_dump vrátil string :D

Každopádně teď to funguje a jsem zas o něco málo Nette znalejší :-)

@vojtech.dobes Díky!
@22 no na Planette se asi podívám :-)

Ascaria
Člen | 187
+
0
-

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)