Jednou z vecí na ktorú som sa tešil pri implementácii Intoru Forms je práve ElasticContainer (asi dočasný názov). V Nette totiž nie je možné urobiť kontajner s dynamickým počtom polí (ochrchlať sa to dá, ale je to škaradé).

Prvým príkladom budiž prílohy. Ak chcem dať užívateľovi možnosť pridať niekoľko príloh do formuláru, neviem vopred počet políčok, ten sa nastaví až u klienta. ElasticContainer to rieši tak, že svoje detské políčka nastaví až pri prijatí hodnôt. Každé políčko je klon nejakého vopred definovaného poľa – tzv. prototypu.

Ak chcem prílohy, urobím:

$form->add( 'files', new ElasticContainer( new File ) );

Ak chcem tagy, urobím:

$form->add( 'tags', new ElasticContainer( new String ) );

Ak chcem na prototype validácie, urobím validácie na prototype:

$form->add( 'emails', new ElasticContainer( new String ) )
  ->getPrototype()
    ->validates('email');

Validátorom count nad ElasticContainer môžem obmedziť počet políčok:

$form->add( 'emails', new ElasticContainer( new String ) )
  ->validates( 'count', 3, 10 )
  ->getPrototype()
    ->validates('email');

Hodnoty získam a nastavím volaním get/setValue:

$c = $form->add( 'tags', new ElasticContainer( new String ) );
//...
$c->setValue( array('apple', '', 'juice', NULL, 'banana') );
//...
$c->getValue(); // => array('apple', 'juice', 'banana')

Šablona je potom jednoduchá:

{foreach $container as $field}
  {form:text $field}
{/foreach}

Vypíše všetky nastavené políčka, minimálne a maximálne však toľko koľko sa nastavilo cez ElasticContainer::setMinimum/setMaximum alebo cez $container->validates( 'count', $minimum, $maximum ).