nefunkční $form->setDefaults u addDynamic

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

Ahoj,

mám vytvořený následující formulář pomocí addDynamic od HosipLan ale nedaří se mi do něj načíst hodnoty z databáze. Zkoušel jsem ledacos ale pořád ne a ne to jet. Mohu poprosit prosím o pomoc?

protected function createComponentPollForm() {
		$presenter = $this;

		$poll = $this->getElementByPart( $this->idPart );
		$answers = $this->partModel->getAnswersById( $poll['idPoll'] );
		// $answers obsahuje pole = array( 0 => array( 'idAnswer' => '1', 'answer' => 'a' ), 1 => array( 'idAnswer' => '2',  'answer' => 'b' ), 2 => array( 'idAnswer' => '3', 'answer' => 'c' ))

		$form = new Form;
		$form->addText('question', 'Otázka:')
			->setRequired('Vyplňte prosím otázku.');
		$form->addHidden('boxType', 'poll');

		$replicator = $form->addDynamic('answers', function (Container $container) use ($presenter) {
			$container->addText( 'answer', 'Odpověď:' );
			$container->addHidden( 'idAnswer' );

			$container->addSubmit( 'remove', 'Smazat' )
				->setValidationScope( FALSE )
				->onClick[] = callback( $presenter, 'RemoveElementDynamically' );
		}, count($answers));

		$replicator->addSubmit( 'add', 'Přidat další odpověď' )
			->setValidationScope( FALSE )
			->onClick[] = callback( $this, 'AddElementDynamically' );

		$form->setDefaults( array( 'question' => $poll['question'], 'answers' => $answers ) );

        $form->addSubmit('save', 'Uložit')
			->onClick[] = callback($this, 'pollFormSubmitted');

        $form->addProtection('Odešlete prosím formulář znovu (bezpečnostní token vypršel).');

        return $form;
    }

Editoval Hankill (14. 10. 2011 20:40)

Filip Procházka
Moderator | 4668
+
0
-

Zkusil bych to takto předělat

public function actionDefault()
{
	$this->poll = $this->getElementByPart($this->idPart);

	if (!$this['pollForm']->isSubmitted()) {
		$defaultAnswers = $this->partModel->getAnswersById($this->poll['idPoll']);
		$answers = $this['pollForm']['answers'];
		foreach ($defaultAnswers as $id => $answer) {
			// automatické vytvoření kontejneru při "doteku"
			$answers[$id]->setValues($answer);
		}

		$this['pollForm']['question']->setValue($this->poll['question']);
	}
}


protected function createComponentPollForm()
{
	$form = new Form;
	$form->addText('question', 'Otázka:')
		->setRequired('Vyplňte prosím otázku.');
	$form->addHidden('boxType', 'poll');

	$removeEvent = callback($this, 'RemoveElementDynamically');
	$answers = $form->addDynamic('answers', function (Container $container) use ($removeEvent) {
		$container->addText('answer', 'Odpověď:');
		$container->addHidden('idAnswer');

		$container->addSubmit('remove', 'Smazat')
			->setValidationScope(FALSE)
			->onClick[] = $removeEvent;
	});

	$answers->addSubmit('add', 'Přidat další odpověď')
		->setValidationScope(FALSE)
		->onClick[] = callback($this, 'AddElementDynamically');

        $form->addSubmit('save', 'Uložit')
		->onClick[] = callback($this, 'pollFormSubmitted');

        $form->addProtection('Odešlete prosím formulář znovu (bezpečnostní token vypršel).');

	return $form;
}

Editoval HosipLan (15. 10. 2011 10:27)

Hankill
Člen | 9
+
0
-

Díky moc, vyzkouším.

kycera
Člen | 7
+
0
-

Mám problém používám používám stejný způsob nastavení defaultních hodnot jak prezentuje HosipLan, ale i když některou z defaultně vypsaných změním tak po odeslání formuláře se nezmění (zůstanou stejné jako nastavený default). Jal lze teda nastavit default aby se změna propagovala do výsledků formuláře? Díky.

Filip Procházka
Moderator | 4668
+
0
-

Ukaž svůj kód, pokud jsi mou ukázku nějak upravoval.

kycera
Člen | 7
+
0
-

plnění formuláře daty:

<?php
$specs = $this['taskForm']['specification'];
      foreach ($this->model->findSpecificationsFac($this->id) as $id => $spec) {
         $specs[$id]->setValues($spec);
      }
?>

addDynamic v továrničce:

<?php
$replicator = $form->addDynamic('specification', function (Container $container) use ($presenter) {
	$container->addText('name', 'Název oboru:', 100, 100);
	$container->addText('info', 'Informace o oboru:' , 100, 200);
}, 1);
$replicator->addSubmit('add_spec', 'Přidat obor')
	->setValidationScope(false)
	->onClick[] = callback($this, 'MyFormAddElementClicked');
?>

Při odeslání formuláře data zůstanou stejná jako defaultní ikdyž došlo k jejich změně..

Filip Procházka
Moderator | 4668
+
0
-

A máš to plnění hodnot obalené v

if ( ! $this['taskForm']->isSubmitted()) {

? Protože jestli ne, tak se ti ty hodnoty přepíšou, setValues není setDefaults.

Editoval HosipLan (29. 8. 2012 20:02)

kycera
Člen | 7
+
0
-

HosipLan napsal(a):

A máš to plnění hodnot obalené v

if ( ! $this['taskForm']->isSubmitted()) {

? Protože jestli ne, tak se ti ty hodnoty přepíšou, setValues není setDefaults.

Neměl sem to byla ta chyba. Díky moc!