Select vraci NULL pokud je ponechana default hodnota

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

Ahoj, ve formulari mam select, ktery, pokud nezmenim jeho hodnotu, nevrati defaultni (podle ktere se ale v poradku nastavi), ale NULL. Pokud pole vymenim za napr. text tak je vse v poradku a vraci default hodnotu i pokud pole nezmenim. Netusite kde muze byt problem? (PHP 5.2.10, Nette 0.9.1)

Honza Marek
Člen | 1664
+
0
-

Ukaž jak ten select definuješ.

musa
Člen | 28
+
0
-

v tovarnicce createComponentServerForm():

if ($user->isAuthenticated()) {
	$disks = disks::getAvailableForVm($this->defaults['id'])->fetchPairs('id', 'name');
	$form->addSelect('disk2_id', 'Select disk', $disks)
          ->getControlPrototype()
            ->class('disk2_existing_group')
            ->onChange = 'setValuesDisk(\'disk2\'); updatePrice();';
}

v sablone pak:

{if $user->isAuthenticated()}
	<li class='disk1_existing_group'>
		{!$form['disk1_id']->label}
		{!$form['disk1_id']->control}
	</li>
{/if}

Editoval musa (7. 10. 2009 10:50)

Honza Marek
Člen | 1664
+
0
-

Co mě napadá je, že po odeslání formuláře nějak není k dispozici to $this->defaults['id'].

Formulář se totiž po submitu znova sestaví a u selectu se kontroluje, jestli přijatá hodnota je jedna z těch, které jsi do něj nastavil.

Klokan
Člen | 47
+
0
-

Nevím, jestli to nemůže nějak souviset, ale v DataGridu od Romana Sklenáře mi po stažení Nette 0.9.1 přestala fungovat změna počtu položek na stránce, která je taktéž umístěná v selectu. Nemáte s tím někdo stejný problém ? (rev 51.)

Omluva, problém je již nahlášený tady

Editoval Klokan (7. 10. 2009 13:23)

musa
Člen | 28
+
0
-

Honzo diky, problem je v tom $this->defaults[‚id‘]. Pravdepodobne spatne pracuju s nastavenim defaults. Aby byl v pripade noveho serveru formular predvyplnen, mam v atributu $defaults ulozeny defaultni $defaults :), ktere nastavuju v render(). Pro editaci ma pak presenter, ktery ServerFormControl pouziva k dispozici metodu initDefaules(), kterou nastavuje editovany server.


class ServerFormControl extends BaseControl (BaseControl je potomek Control)
{

  private $defaults = array(
    'id' => '',
	...
  );

  public function initDefaults($values) {

    $this->defaults = $values;

  }

  /** views *******************************************************************/

  public function render()
  {

      $template = $this->createTemplate();
      $template->setFile(dirname(__FILE__) . '/ServerFormControl.phtml');
      $template->form = $this['serverForm'];
      $template->form->setDefaults($this->defaults);
	...
  }

a v presenteru:

public function createComponentServerForm()
  {

    $form = new ServerFormControl;

    if ($this->getParam('name') != NULL) {
      $server = servers::getByName($this->getParam('name'));
      $form->initDefaults($server);
    }

    return $form;

  }

Ten presenter pak pri submitu uz nema onen parametr ‚name‘ takze neprenastavi defaultni $defaults a problem je na svete. Jaky je tedy obecne platny zpusob jak naklad s defaults aby to po submitu „fungovalo“?

Editoval musa (7. 10. 2009 10:50)

musa
Člen | 28
+
0
-

Tak problem byl v chybejicim persistentnim parametru pro ten presenter. Prave to ‚name‘, kdyz sem dal zpet (uz sem ho tak mel, ale pri nejakem zatmeni mi tam prisel zbytecny a v ramci cisteni kodu sem ho zrusil) a ted se znovu spravne v tom submit pozadavku posila. Bez nej se pouze poslalo /do=serverForm-submit a presenter ho uz pak nemel pro znovusestaveni. Nyni uz se zas posial /name=neco&do=serverForm-submit.

Honza Marek
Člen | 1664
+
0
-

Ok, jinak pro přehlednost příspěvků ve fóru doporučuju nastudovat https://forum.nette.org/…v-tomto-foru#…

musa
Člen | 28
+
0
-

Opraveno, jeste jednou diky za rychlou radu!