propojení handle a render
- Jan Endel
- Člen | 1016
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
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');
}
}