Předávání hodnot z presenteru do selectboxu formuláře pomocí setItems

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

Ahoj, mám takový menší problém s funkcí setItems…

V presenteru si z databáze vytáhnu potřebná data, uložím do pole a toto pole předávám pomocí setItems($pole, TRUE) selectboxu formuláře. Vše proběhne v pořádku – jednotlivé položky selectboxu jsou oindexovány správně – avšak jakmile submitnu formulář a pomocí getValues() získávám hodnoty z formuláře a následně je ukládám do databáze tak mi Laděnka hlásí chybu že selectbox vrací hodnotu ‚null‘…

Setkal jste se s tímto už někdo? Když si u jiného formuláře vytvářím podobně pole hodnot pro selectbox přímo v konstruktoru tak mi to tyto problémy nedělá.

Předem děkuji za odpověď a případné tipy :-)

vvoody
Člen | 910
+
0
-

Ukáž kód presenteru

Glottis
Člen | 129
+
0
-

cao, kde nastavuejs ty itemy? ukaz kod

samic
Člen | 18
+
0
-
<?php

$turnaje = TurnajeModel::getByIDsouteze($id_souteze);
foreach($turnaje as $turnaj)
{
  $fotogalerie = FotogalerieModel::getByIDturnaje($turnaj['ID_turnaje']);
  if(!$fotogalerie) $foto_turnaje[$turnaj['ID_turnaje']] = $turnaj['Nazev'];
}

$this['fotogalerieForm']['id_turnaje']->setItems($foto_turnaje, TRUE);

?>
Glottis
Člen | 129
+
0
-

ale v jake metode to volas

samic
Člen | 18
+
0
-

funkce v presenteru

<?php

public function renderZobrazitFotogalerie($id_souteze) {

  $result = FotogalerieModel::getByIDsouteze($id_souteze);

  foreach($result as $key => $fotogalerie)
  {
    $turnaj = TurnajeModel::getByIDturnaje($fotogalerie['id_turnaje']);
    $result[$key]['Nazev'] = $turnaj['Nazev'];
    $result[$key]['Datum'] = $turnaj['Datum'];
  }

  $this->template->fotogalerie = $result;

  $soutez = SoutezeModel::getByIDsouteze($id_souteze);
  $this['fotogalerieForm']['ID_fotogalerie']->setValue('0');
  $this['fotogalerieForm']['id_souteze']->setValue($id_souteze);

  $turnaje = TurnajeModel::getByIDsouteze($id_souteze);
  foreach($turnaje as $turnaj)
  {
    $fotogalerie = FotogalerieModel::getByIDturnaje($turnaj['ID_turnaje']);
    if(!$fotogalerie) $foto_turnaje[$turnaj['ID_turnaje']] = $turnaj['Nazev'];
  }

  $this['fotogalerieForm']['id_turnaje']->setItems($foto_turnaje, TRUE);
  $this->template->soutez = "". $soutez['Nazev'] ." ". $soutez['Sezona']."";
  $this->template->id_souteze = $id_souteze;
}

?>

v sablone zobrazitFotogalerie potom vypisuji tento formular:

<?php

public function __construct($parent, $name) {
  parent::__construct($parent, $name);

  $this->addHidden('ID_fotogalerie');
  $this->addHidden('id_souteze');

  $this->addSelect('id_turnaje', 'Vyber turnaj:');

  ...

}

?>

a pomoci getValues() získávám jeho hodnoty při jeho zpracování – všechny hodnoty předá správně až na id_turnaje

vvoody
Člen | 910
+
0
-

premenuj ten renderZobrazitFotogalerie na actionZobrazitFotogalerie

Tomáš Kolinger
Člen | 136
+
0
-

Plnit šablonu v action je proti srsti, na to je přeci render.

Takže nejlépe oddělit z render komunikaci s modelem a přesunout pod action, v render nechat jen nastavení dat do šablony.

samic
Člen | 18
+
0
-

tak nakonec pomohlo oddelit komunikaci s modelem + naplneni selectboxu pod action :-)

Díky za rady!!!

samic
Člen | 18
+
0
-

jeste se zeptam – proc to dela takovou neplechu kdyz je to v render?

Tomáš Kolinger
Člen | 136
+
0
-

Formulář se zpracovává před vykreslením. Tím pádem při zpracování formuláře nemá select prvky a Nette kontroluje, zda odeslaná hodnota v selectu existuje, ta ale neexistuje – takže NULL.

Editoval Tomáš Kolinger (26. 2. 2013 7:23)

samic
Člen | 18
+
0
-

ahoj všichni,

obracím se na Vás ještě s jedním dotazem – podobný jako je ten původní – s tím rozdílem že ve FrontPresenteru si plnim ve funkci beforeRender() RadioList hodnotami uloženými v poli a při submitnutí formuláře mi opět předává RadioList NULL – resenim by bylo opět přesunout plnění RadioListu do action – moje otázka tedy zní – existuje neco jako actionBeforeRender()???

Předem děkuji za odpověď, nápady a rady ;-)

Šaman
Člen | 2666
+
0
-

Proč to plníš v beforeRender? BeforeRender nebudeš dlouho potřebovat, ten se provádí před každým renderCokoliv(). Ty to dej do actionXxx().

Editoval Šaman (18. 3. 2013 21:31)

samic
Člen | 18
+
0
-

Jde o to ze ten formular mam v sablone ktera je soucasti vice sablon

Jan Mikeš
Člen | 771
+
0
-

Tak do startupu ;)

samic
Člen | 18
+
0
-

kdyz to dam do startupu tak se mi ten radiolist nenaplni vubec – predtim se alespon naplnil akorat pri zpracovani predaval NULL

Jan Mikeš
Člen | 771
+
0
-

V tom pripade delas neco spatne! Nasledujici kod jsem ted testoval a funguje:
Btw, dalsi moznost je plnit data primo v tovarnicce.

	protected function startup() {
		parent::startup();
		$this["testForm"]["test"]->setItems(array("test" => "test"));
	}

	protected function createComponentTestForm(){
		$form = new Nette\Application\UI\Form;
		$form->addSelect("test");
		return $form;
	}
samic
Člen | 18
+
0
-

nevim proc mi to z toho startupu nenaplni – kazdopadne jsem to naplnil primo v tovarnicce a funguje :-) díky za radu!

Jan Mikeš
Člen | 771
+
0
-

Muzes zkusit poslat uryvek kodu a muzeme se na to podivat, ale plneni primo v tovarnicce je asi nejcistejsi zpusob.

samic
Člen | 18
+
0
-

nechal bych to asi tak, pokud je to jak rikas asi nejcistejsi zpusob tak nema cenu se hrabat v necem co funguje :-)