Dynamicky pocet prvku ve formulari
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- MelkorNemesis
- Člen | 36
Ahoj,
prinasim moje funkcni reseni. Tak poprosim o komentare.
<?php
class AddProductForm extends EshopForm {
public function __construct($parent, $name){
parent::__construct($parent, $name);
# hidden prvek - uchovava pocet dynamicky pridanych prvku
$this->addHidden('count');
# vytahneme data formulare uz v konstruktoru
$values = $this->getValues();
# pokud je count null, nastavime nulu
$count = !is_null($values['count']) ? (int) $values['count'] : 0;
# vytvorime si nejaky kontejner, treba na produkty
$wrapper = $this->addContainer('products');
# mozne nahradit for cyklem, vytvori takovy pocet kontejneru, jako je v inputu count, aby si nette nemyslelo, ze mu podstrkavame nejake hack inputy
$i = 0;
while ($i <= $count) {
$container = $wrapper->addContainer($i);
$container->addText('product_code');
$container->addText('product_name')->setRequired("Název nesmí být prázdný!");
$i++;
}
$this->addSubmit('send', 'Uložit');
# pokud jeste nebyl formular odeslan, nastavime count na 0 - jinak se v count udrzuje poslana hodnota z formulare
if (!$this->isSubmitted()) {
$this->setDefaults(array('count' => $count));
}
$this->onSubmit[] = array($this, 'formSubmitted');
}
public function formSubmitted(AppForm $form) {
$values = $form->getValues();
# zpracovani formulare
$this->presenter->flashMessage($this->translator->translate('Zboží bylo upraveno.'), 'success');
$this->presenter->redirect('this');
}
}
?>
<script>
$('.add_row').click(function() {
// prida novy radek do tabulky
$("#new_items").append('<tr>' + $("#new_row").html() + "</tr>");
// nacte a zvysi counter o 1
var counter = parseInt($("#frmaddOrderItemForm-count").val()) + 1;
$("#frmaddOrderItemForm-count").val(counter);
// najde vsechny inputy a selecty v nove pridanem radku a zvysi index o jedna - products[0][product_code] -> products[1][product_code]
$('#new_items tr:last').find('input, select').each(function (){
var str= $(this).attr('name');
var re5=/\d+/;
// replace name with increased id
$(this).attr('name', str.replace(re5, counter));
});
return false;
});
# cast s JS je vicemene subjektivni, zalezi na tom, jak uzivatel formular renderuje
# funguje vse az na JS validaci nove pridanym prvkum - ale to jen protoze je JS validace nactena jeste pred pridanim noveho radku
</script>
Editoval MelkorNemesis (24. 8. 2010 20:22)