Skip to content

Instantly share code, notes, and snippets.

@fprochazka
Forked from JanTvrdik/ReplicatingContainer.php
Created April 26, 2011 21:14
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fprochazka/943164 to your computer and use it in GitHub Desktop.
Save fprochazka/943164 to your computer and use it in GitHub Desktop.
Replicator ... $form->addDynamic() ... Více na https://github.com/HosipLan/Nette-addDynamic
<?php
/**
* @see https://github.com/HosipLan/Nette-addDynamic
*/
class CreatePresenter extends BasePresenter
{
protected function startup()
{
parent::startup();
// optionaly: Kdyby\Forms\Containers\Replicator::register('addReplicator');
Kdyby\Forms\Containers\Replicator::register();
}
/**
* @return Nette\Application\UI\Form
*/
protected function createComponentMyForm()
{
$form = new Nette\Application\UI\Form;
// jméno, továrnička, výchozí počet
$replicator = $form->addDynamic('users', function (Nette\Forms\Container $container) {
$container->currentGroup = $container->getForm()->addGroup('skupina', FALSE);
$container->addText('name', 'Jméno');
$container->addText('surname', 'Příjmení');
}, 2);
$replicator->addSubmit('add', 'Přidat dalšího člověka')
->setValidationScope(FALSE)
->onClick[] = callback($this, 'MyFormAddElementClicked');
$form->addGroup();
$form->addSubmit('send', 'Zpracovat')
->onclick[] = callback($this, 'MyFormSubmitted');
return $form;
}
/**
* @param Nette\Forms\Controls\SubmitButton $button
*/
public function MyFormAddElementClicked(Nette\Forms\Controls\SubmitButton $button)
{
$users = $button->form['users'];
// přidá jeden řádek do containeru
// počítá, že identifikátory budou čísla
$users[$users->countFilledWithout(array('add'))]; //touch
}
/**
* @param Nette\Forms\Controls\SubmitButton $button
*/
public function MyFormSubmitted(Nette\Forms\Controls\SubmitButton $button)
{
foreach ($button->form->values['users'] as $user) {
dump($user['name'], $user['surname']);
}
}
}
<?php
/**
* @see https://github.com/HosipLan/Nette-addDynamic
*/
class EditPresenter extends BasePresenter
{
private $ukolModel;
private $ukol;
private $ukolUsers = array();
protected function startup()
{
parent::startup();
// optionaly: Kdyby\Forms\Containers\Replicator::register('addReplicator');
Kdyby\Forms\Containers\Replicator::register();
$this->ukolModel = new UkolModel($this->context->db); // nebo přímo z containeru
}
public function actionDefault($id)
{
$this->ukolUsers = $ukolUsers = $this->ukolModel->findUsersById($id);
$this->ukol = $this->ukolModel->find($id);
$this['form']->setDefaultValues($this->ukol);
foreach ($this['form']['users']->containers as $user) {
$user->setDefaults(array_shift($ukolUsers));
}
}
/**
* @return Nette\Application\UI\Form
*/
protected function createComponentMyForm()
{
$form = new Nette\Application\UI\Form;
// jméno, továrnička, výchozí počet
$replicator = $form->addDynamic('users', function (Nette\Forms\Container $container) {
$container->currentGroup = $container->getForm()->addGroup('skupina', FALSE);
$container->addText('name', 'Jméno');
$container->addText('surname', 'Příjmení');
}, count($this->ukolUsers));
$replicator->addSubmit('add', 'Přidat dalšího člověka')
->setValidationScope(FALSE)
->onClick[] = callback($this, 'MyFormAddElementClicked');
$form->addGroup();
$form->addSubmit('send', 'Zpracovat')
->onclick[] = callback($this, 'MyFormSubmitted');
return $form;
}
/**
* @param Nette\Forms\Controls\SubmitButton $button
*/
public function MyFormAddElementClicked(Nette\Forms\Controls\SubmitButton $button)
{
$users = $button->form['users'];
// přidá jeden řádek do containeru
// počítá, že identifikátory budou čísla
$users[$users->countFilledWithout(array('add'))]; //touch
}
/**
* @param Nette\Forms\Controls\SubmitButton $button
*/
public function MyFormSubmitted(Nette\Forms\Controls\SubmitButton $button)
{
foreach ($button->form->values['users'] as $user) {
dump($user['name'], $user['surname']);
}
}
}
see: https://github.com/Kdyby/ReplicatorExtension
sandbox: https://github.com/HosipLan/Nette-addDynamic
@JakubJarabica
Copy link

Dve otazky.

  1. Co ma robit toto v add handleri?
    $users[$users->countFilledWithout(array('add'))]; // touch
    ... ked to pustam, nic to nerobi. Nahradil som to za $users[count($users->components) + 1]; a zrazu to pekne pridava(aj ked to samozrejme nie je ciste).

Vacsi problem vsak mam s druhou zalezitostou(ktora sa prejavuje aj pri 1 a) aj pri 1 b):
$replicator->addSubmit('add', 'Přidat dalšího člověka')->setValidationScope(FALSE) sice vypne validaciu cloveka(a tak sa mi novy container prida), avsak form errors mi do formulara vypisem, co je samozrejme neziaduce. s TRUE to kontajner nevytvori. Solution?

... a posledna otazka, rozumny sposob setDefaults? Osobne by som si predstavoval v action* to naplnit nejakymi vychozimi hodnotami... ako? ^_^ Diky moc. Foowieho formMacros do Nette 2 beta neprepise asi ani Chuck Norris.

@fprochazka
Copy link
Author

Metodu touch jsem zrušil úplně. Ideálně si aktualizuj Container, mělo by to mimo jiné fixnout užnevimjaky bug :)

@fprochazka
Copy link
Author

Zrušení výpisu chyb bychpořešil asi takto nějak:

{control myForm begin}
{if !$control['myForm']['users']['add']->isSubmittedBy()}
    {control myForm errors}
{/if}
{control myForm body}
{control myForm end}

@michalsvec
Copy link

@fprochazka
Copy link
Author

Ano, trošku nerad, ale dodělal jsem podporu pro smazání Containeru a kompletní zametení stop po něm, pomocí reflexe.

https://github.com/Kdyby/Framework/blob/master/libs/Kdyby/Forms/Containers/Replicator.php#L174

Ukázka: https://github.com/HosipLan/Nette-addDynamic/blob/master/app/presenters/HomepagePresenter.php#L82

@karzac
Copy link

karzac commented Aug 24, 2011

foreach ($this['form']['users'] as $user) v ukázce EditPresenteru mi nefunguje, funguje foreach ($this['form']['users']->containers as $user)

@fprochazka
Copy link
Author

Ano, máš pravdu, je tam chyba. Díky opravím. Koukni raději na sandbox http://github.com/hosiplan/nette-adddynamic

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment