propojení handle a render

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Endel
Člen | 1016
+
0
-

Zdravím,

řeším teď už dva dny takový zajímavý problém, klientka si vymyslela, že chce přidávat po kliku na odkaz(tlačítko) další řádek do tabulky kde jsou obsaženy zkoušky. Šel jsem na to AJAXově a to tímto způsobem:

render:

public function renderAdd()
    {
     $this->template->title = "Přidat psa";
     $this->template->form = $this->getComponent('formEdit');
     $exams = $this->getSession('exam');
     $this->template->exam = $exams->count;

     $form = $this->getComponent('formEdit');
        for($i=0;$i<$exams->count;$i++)
        {

            $form->addText('nameExa'.$i, 'Název zkoušky');
            $form['date'.$i] = new DatePicker('Datum zkoušky', 10);
            $form->addText('place'.$i, 'Místo konání');
            $form->addText('pointa'.$i, 'Body A');
            $form->addText('pointb'.$i, 'Body B');
            $form->addText('pointc'.$i, 'Body C');
            $form->addRadioList('evaluation'.$i,'Známka', array(
                '1' =>  'V',
                '2' =>  'VD',
                '3' =>  'D',
                '4' =>  'U',
                '5' =>  'N',
            ))->setSeparatorPrototype('');

        }
    }

handle:

public function handleAddExam()
    {
        $exams = $this->getSession('exam');
        if(!isset($exams->count)||$exams->count!==(int)$exams->count)
            {
                $exams->count = 0;
            }
        else
            {
                $exams->count++;
            }
        $this->invalidateControl('sexams');

        if(!$this->isAjax())
        {
            $this->redirect('this');
        }
    }

uvedený kód funguje s jistým bugem a to tak, že po prvním kliku na odkaz:
<a href="{link addExam!}" class="ajax">Přidat Zkoušku</a> se nic neprovede teprve po druhém kliku se přidají dvě zkoušky naráz, pak už celá aplikace funguje jak má. Debugem jsem přišel na to, že handle se volá až po renderu (logicky). Čili nějak potřebuju zavolat část renderu i v handlu, ale jen poprvé. Jak to tady tak píšu nebylo by řešením vlastní funkce? Ovšem nemám moc představu kde a jak ji volat.

Zkoušel jsem i zadat to přidávání řádku celé do handlu, ovšem to nevykreslilo nikdy nic.

Editoval pilec (12. 3. 2010 14:16)

Etch
Člen | 403
+
0
-

Ono je to logické, že se ti to vypíše až při druhém kliknutí. Máš tam totiž v handlu

	$exams->count = 0;

a pak v renderu máš FOR

for($i=0;$i<$exams->count;$i++)

tedy když poprvé klikneš na odkaz na přidání tak se $exams->count nastaví na 0 invaliduje se snippet provede se render a dojde to až k tomu for kde vlastně je podmínka $i<$exams->count což při prvním průběhu bude 0<0 což logicky neprojde a nic se do formu nepřidá.

řešení je jednoduché nastavit v handlu $exams->count na 1 tedy

public function handleAddExam()
    {
        $exams = $this->getSession('exam');
        if(!isset($exams->count)||$exams->count!==(int)$exams->count)
            {
                $exams->count = 1;
            }
        else
            {
                $exams->count++;
            }
        $this->invalidateControl('sexams');

        if(!$this->isAjax())
        {
            $this->redirect('this');
        }
    }
Jan Endel
Člen | 1016
+
0
-

Tyjo a ja se s tím prcám bůhví jak dlouho, moc díky funguje :) (nemám rád takové blbé chyby)