Stránka s formulářem a gridem ve snippetech překreslení

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

V prezenteru mám definovaný formulář a grid, v šabloně je oboje v samostatné snippetu.
Ve formuláři mám závislé selecty. Prvotní vykreslení je v pořádku. Problém nastane, pokud vyberu novou hodnotu v nadřazeném selecty tak při zpracování handlu dojde k tomu, že se mi překreslí zk¨pátky defaultní informace ve formuláři.

použitý kód

	protected function createComponentFilterForm() {
		$form = new Form;

		$this->getUser()->getStorage()->setNamespace('front');
		if ($this->getUser()->isLoggedIn()) {

			$guid = $this->getUser()->storage->getIdentity()->getId();
			$userSelect = $this->getUserSelect($guid);
$users = $userSelect->fetchPairs('UID', 'FullName')
$userSelectKod =  array_keys($users);

			$form->addSelect('userinterpret', 'Jméno uživatele', $users);

$interpretSelect = $this->getInterpretSelect($userSelectKod[0]);

			$form->addSelect('interpret', 'Umělec/soubor', $interpretSelect->fetchPairs('Id', 'Name'));

			$form->addSubmit('filter', 'Filtrovat')
				 ->setAttribute("class", "btn btn-sm btn-primary");

			$form->addSubmit('reset', 'Vymazat filtr')
				 ->setAttribute("class", "btn btn-sm btn-danger");
		}
		return $form;
	}

	public function handleUserChange($userinterpret) {
		if ($userinterpret) {
			$interpretSelect = $this->getInterpretSelect($userinterpret);

			$this['filterForm']['interpret']
				 ->setItems( $interpretSelect->fetchPairs('Id', 'Name')));

			$this['filterForm']['years']->setValue($years);
			$this['filterForm']['userinterpret']->setValue($userinterpret);
		} else {
			$this['filterForm']['interpret']->setPrompt('Vyberte nejdříve umělce')
				 ->setItems(array());
		}

		$this['grid']['filter']->redrawControl();
	}

Když si v tom handleru vypíšu ty hodnoty, které chci změnit tak je mám správně vyplněné
Když se podívám na JSON tak je tam správné jméno snippetu, ale je v něm defaultně vyplněný formulář.
Divné na tom je, že minulý týden mi to fungovalo.

verze PHP 5.5.15, nette 2.2.0

Ot@s
Backer | 476
+
0
-

Chybí tu ukázka kódu, kde navazuješ událost UserChange (ve formuláři). Podle všeho spustíš signál UserChange s hodnotou prvního selektu. To je ale GET request, který ignoruje zbylý obsah formuláře. Řešením je při změně prvního selektu postovat celý formulář. Detekovat to a generovat podle toho obsah druhého selektu. Bonusem automaticky zachováš celý obsah formuláře.

svobodai
Člen | 136
+
0
-

Aha na to jsem zapomněl

ve formuláři je tento javacript

<script type = "text/javascript" >
	$('#frm-filterForm-userinterpret').on('change', function (event) {

		$.ajax({
			type: 'GET',
			url: '/?do=userChange',
			data: {
				'userinterpret': $('#frm-filterForm-userinterpret').val(),
				'interpret': $('#frm-filterForm-interpret').val(),
			}
		});
	});
</script>

v Konzoli firefoxu vidím, že se ty hodnoty správně předají.

Editoval svobodai (12. 11. 2014 9:28)

Ryky
Člen | 14
+
0
-

smaž ten javascript a použíj toto

$form->addSelect('userinterpret', 'Jméno uživatele', $users)
	->setAttribute('class', 'ajax')
	->getControlPrototype()
	->onClick('$(this).closest("form").submit()');

$form->addSelect('interpret', 'Umělec/soubor', $interpretSelect->fetchPairs('Id', 'Name'))
	->setAttribute('class', 'ajax')
	->getControlPrototype()
	->onClick('$(this).closest("form").submit()');

$form->onSuccess[] = callback($this, 'UserChangeFormSubmitted');

a v metodě si pak předáš vlastně celý formulář a můžeš zjístit jak interpret tak userinterpret pak překreslíš :)

svobodai
Člen | 136
+
0
-

To je zajímavé řešení, ale na tom formuláři mám ještě dvě tlačítka a není mi jasné jak by to pracovalo.
Ještě se ten formulář má rozšířit o další položky a vyvstane nutnost volat i jiné funkce, nebo alespoň nějakým parametrem určit co se bude dělat.

Ryky
Člen | 14
+
0
-

ummm tak na to ti poradím jednu věc použíj kdyby/replicator
https://componette.org/search/?…

suprová věcička a tohle se na to bude hodit když máš ve formuláři víc submit tlačítek :)
udělej hlavní formulář(replicator)
a do něj přidej dynamické containery a rozděl si to každej container s formulářem a jedno tlačítko :)

Ryky
Člen | 14
+
0
-

svobodai napsal(a):

To je zajímavé řešení, ale na tom formuláři mám ještě dvě tlačítka a není mi jasné jak by to pracovalo.
Ještě se ten formulář má rozšířit o další položky a vyvstane nutnost volat i jiné funkce, nebo alespoň nějakým parametrem určit co se bude dělat.

btw jedním formulářem tohle neuděláš … :D

svobodai
Člen | 136
+
0
-

Ryky napsal(a):

svobodai napsal(a):

To je zajímavé řešení, ale na tom formuláři mám ještě dvě tlačítka a není mi jasné jak by to pracovalo.
Ještě se ten formulář má rozšířit o další položky a vyvstane nutnost volat i jiné funkce, nebo alespoň nějakým parametrem určit co se bude dělat.

btw jedním formulářem tohle neuděláš … :D

No když tam jsou další závislé selecty tak to udělám.

svobodai
Člen | 136
+
0
-

No nejde v celku o to ajaxové volání to proběhne v pořádku dostanu se i do toho správného handle v něm se provedou správné akce, ale pak dojde k přepsání původními hodnotami formuláře i když to před tím fungovalo.