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
+
0
-

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)