formulář select odesíla null misto hodnot

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

Nevíte někdo čím to je že když mam metodu na vytvoreni formulare

protected function createComponentZboziDetailDoKosikuForm()
	{
		$form = new Form();
		$form->addHidden('idZb', $this->detailZbozi["id"]);
		$form->addSelect('varianta', 'Varianta', $this->nastavVarianty($this->detailZbozi["varianty"]))->setDefaultValue($this->varianta);
$form->addText('pocet', 'Počet', 5, 3)->addRule(Form::INTEGER, 'Počet zboží musí být číslo od 1 do 100.')->addRule(Form::RANGE, 'Počet zboží musí být číslo od %d do %d.', array(1, 100));
........

metoda nastavVarianty nastavi hodnoty kdyz tuto metodu dumpnu vypise to sprvavne:

array(6) {
   34 => "34 cm" (5)
   40 => "40 cm" (5)
   44 => "44 cm" (5)
   48 => "48 cm" (5)
   52 => "52 cm" (5)
   56 => "56 cm" (5)
}

Když ale pak v metode po odeslani formulare zboziDetailDoKosikuFormSubmited(Form $form)..
provedu takto dump
dump($form->values);
die;
Vypíše to

Nette\ArrayHash(3) {
   idZb => "71" (2)
   varianta => NULL
   pocet => "1"
}

Jak to že promena varianta je null když do ni predavam tamto pole, a i v kodu kdyz se podivam tak je select s option tagy normalne vypsany?
Díky

Edit: ted jsem zjistil ze kdyz misto volani metody tam dam pole array(„34“=>„34“, „40“=>„40“…);
Tak to funguje tak asi je problem v tom kdyz to dela metoda ale kde?

public function nastavVarianty($varianty)
	{
		$jednotliveVar=explode(",", $varianty);
		$i=0;
		$poleVar = array();
		while( isset($jednotliveVar[$i]))
		{
			if( is_numeric(substr($jednotliveVar[$i], 0, 1)) )// kdyz je prvni znak cislo ( 15, 35, 16.5)
			{
			  if($jednotliveVar[$i] < 32)  //na palce
				$znak="\"";
			  else                //na cm
				$znak=" cm";
			}
			else                  //nic - pismena
			  $znak="";

			$poleVar[$jednotliveVar[$i]] = $jednotliveVar[$i].$znak;
			$i++;
		}
		return $poleVar;
	}

Editoval Domki (31. 7. 2012 10:41)

Domki
Člen | 310
+
0
-

Co opravdu nikdo nevíte proč to vrací NULL, když ostatní položky z formuláře se odesílají normálně, a kdyz sem vložim sam pole tak se to odešle taky dobře. Přitom když tam davam položky z dtb tak to do formuláře vkláda stejny položky ale už to odesíla null
? Díky za každou radu

tatyalien
Člen | 239
+
0
-

Nejspíš data do selectboxu dodáváš pozdě. Proto to hodí null, protože data přijdou až po odeslání.

ViPEr*CZ*
Člen | 817
+
0
-

Tak to do té metody asi nevleze… nebo isset($jednotliveVar[$i]) po odeslání formuláře neplatí… těžko říct.

Domki
Člen | 310
+
0
-

Jako ze je tam dam pozde?
Dyt v dokumentaci je ze do selectu se data jako vyber dava jako pole jako třetí parametr.
A ten selectbox se i dobre vypíse, ale kdyz ho vyberu a odeslu tak dostanu null.

tatyalien
Člen | 239
+
0
-

No jestli dáváš data v render metodě, action, handlu… někde se ti vytvoří componenta, ale data v ní ještě nemusejí být.

ViPEr*CZ*
Člen | 817
+
0
-

Funguje to tak, že pokud je v selectu něco vidět… a submitne (odešle) se formulář, pak to ještě neznamená, že nette Vám ve $form->values něco vrátí… pozor na to… $form->values se nerovná klasickému získání dat z POST. Protože když si před $form->values ještě dumpnete hodnotu $_POST, pak se vsadím, že tam data budou. Takže ještě než se to celé dostane do metody pro zpracování odeslání formuláře, tak musí existovat onen odeslaný selectbox a musí být naplněn daty, která očekávate ze submitu.

Domki
Člen | 310
+
0
-

tak ted sem to orezal a zustal tam jen form a hlidac na odeslani
asi takto:

<?php
use Nette\Application\UI\Form;
use Nette\Database\Connection;
use Nette\Image;

/**
 * Presenter na výpis detailu zboží
 *
 * @author     Petr Domkař
 *
 *
 */
class DetailZboziPresenter extends BasePresenter
{

	protected function createComponentZboziDetailDoKosikuForm()
	{
		$id = 74;
		dump($id);
		$varianty = $this->context->createZbozi()->where('id', $id)->fetch();


		$jednotliveVar = explode(",", $varianty["varianty"]);


		$form = new Form();

		$form->addSelect('varianta', 'Varianta', $jednotliveVar);
		$form->addText('pocet', 'Počet');
		$form->addSubmit('doKosiku', 'Do košíku');
		$form->onSuccess[] = callback($this, 'zboziDetailDoKosikuFormSubmited');
		return $form;
	}

	public function zboziDetailDoKosikuFormSubmited(Form $form)
	{

			dump($form->values);

	}


}

Takto to funguje ale kdyz získaní id delam pomoci metody $id = $this->getParameter(‚id‘);
Tak uz to tam haze null

Jak tedy mám získat parametr z url?

Jinak odkaz na toto url je:
<a n:href=„DetailZbozi:detailzbozi id ⇒ $polozkaZb->id“>{$polozkaZb->nazev}</a>
a to url pak vypada takto:
http://localhost/…tailzbozi/74

Editoval Domki (31. 7. 2012 21:56)

Domki
Člen | 310
+
0
-

Aha a jak to mám udelat aby to slo
Zde tento kod na tímto
kdyz dam misto $id = 74;
daám toto: $id = $this->getParameter(‚id‘);
Tak to nejde

Domki
Člen | 310
+
0
-

viper a jinak ano mas pravdu kdyz dumpu POST tak to vypise dobre
i stímto radkem

Co tedy mam udelat aby to bylo v tom $form->values

Domki
Člen | 310
+
0
-

No Tak uz to de
Stacilo ten parametr priradit do promeny a tu oznacit jako /** @persistent */ – tim se sama prenasi na dalsi stranku pri odeslani formulare?

A jestli teda dobre chapu to co psal viper
Tak on se odesle formular ale aby se hodnoty zobrazily v $form->values tak musí byt dostupny i to id pomoci ktery se udela dotaz a vypisou se formulare, i kdyz stejne po odeslani formulare na konci metody presmeruju jinam?

ViPEr*CZ*
Člen | 817
+
0
-

Ahoj… ano… pokud plníte hodnoty do formuláře z databáze, pak se vytáhnou… naplní se formulář… porovnají se hodnoty a vyplní se výstupní pole (zjednodušeně řečeno). Pak si uděláte nějakou vlastní akci v metodě zpracování formuláře.
O persistentních parametrech se píše v dokumentaci. Samozřejmě pokud jste plnil data na základě výběru podle nějakého ID z databáze, pak toto ID se již nepřeneslo z URL při odeslání formuláře a tudíž se do formuláře nic nevyplnilo.