Autor Zpráva
2rec
Profil
Mám formulář v Nette, který uživateli umožňuje dynamicky přidat nebo ubrat pár řádků, ale když to udělá, všechna data, která uživatel doposud zadal, se ztratí a vykreslí se mu prázdný formulář. Potřeboval bych to uložit do session a pak je zadat jako defaultní hodnoty. Co dělám špatně?

public function renderAdd($active = false)
    {
        $session = $this->session->getSection('mySess');
        if ($active != true) 
        {    
            $session->remove();
        }
        else 
        {
            if (isset($session)) 
            {
                $this['myForm']->setDefaults($session->form);
            }
        }
    }
     
    public function createComponentMyForm($name)
    {
        $session = $this->session->getSection("mySess");
        $rows = (isset($session->form['rows'])) ? $session->form['rows'] : 2; //default je 2
     
        $form = new Form;
        $ints = array();
        for($i = 0; $i < 10; $i++)
        {
            $ints[$i] = $i;
        }
     
        $form->addSelect('rows', "Položek faktury:", $ints)->setDefaultValue($rows);
        $form->addSubmit("submit", "Přidat položky")
            ->setValidationScope(NULL)
            ->onClick[] = callback($this, "fillTextboxs");
     
        $textboxs = $form->addContainer('textboxs');
        for($i = 1; $i <= $rows; $i++) 
        {
            $value = (isset($session->form['inp'.$i])) ? $session->form['inp'.$i] : "";
            echo "vypis value: $value<br />\n";
            $sec = $textboxs->addContainer($i);
            $sec->addText('inp'.$i, 'Input ' . $i . ':')
                ->setDefaultValue($value);
        }
     
        return $form;
    }    
     
    public function fillTextboxs(SubmitButton $button)
    {
        $session = $this->session->getSection('mySess');
        $session->form = $this['myForm']->getValues();
        $this->redirect('this', array('active' => TRUE));
    }
Jan Tvrdík
Profil
2rec:
Začal bych tím, že bych zkusil zakomentovat $session->remove(); =)
Taps
Profil
2rec:
přidat nebo ubrat pár řádků, ale když to udělá
a máš to řešeno pomocí AJAXU ? V případě použití ajaxu by totiž nemělo dojít ke znovuobnovení celé stránky a tím ztrátě vyplněných dat
2rec
Profil
Jan Tvrdík:
Tak zakomentování $session->remove nepomohlo.

Taps:
AJAX tam nepoužívám, rád bych to řešil přes Nette a jeho sessions, jen netuším, co mám v kódu špatně.
Antik4
Profil
Nejprve bych si dumpnul proměnou $active, a pokud se rovná true, tak $session u isset, zda-li není prázdný.

PS: Dopručuji dělat formulářové úpravy ve formulářové komponentě. Render k tomu neslouží. Když chceš získat

parametr ze šablony

{control register, $param}

nebo z url v presenteru

$this->getParam("action");
aDAm
Profil
Pokud dobře chápu, chcete mít dynamický form...není tedy lepší využít Kdyby\Replicator ? který je k tomuto určený? http://addons.nette.org/cs/form-container-replicator
2rec
Profil
aDAm:
To je dobrý nápad. Půjdu do toho. Děkuju.


Při řešení tohoto problému jsem ještě zjistil, že si neumím zobrazit dump, pokud to není přímo ve vykreslované části presenteru. Mohl by mi prosím ještě někdo napsat, jak si zobrazit dump z libovolného místa?
aDAm
Profil
Pomocí nette debugeru: Nette\Diagnostics\Debugger::dump($foo) a nebo dump do laděnky: Nette\Diagnostics\Debugger::barDump($foo)
2rec
Profil
aDAm:
Takže když použiju ten dump pro laděnku - Nette\Diagnostics\Debugger::barDump($foo), jak ji potom vyvolám? Když přidám tohle do kódu, kód pokračuje normálně dál, chtěl bych ten dump i hned zobrazit.


Dobrý, už to mám. BarDump, to mě mohlo napadnout :-)
aDAm
Profil
dump - klasický dump, barDump - dump do laděnky

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: