Nette 2.4 – snippety ve formulari jako komponente
- macosx69
- Člen | 5
Zdravim,
nechci timhle otravovat vlakno Pojďte
otestovat Nette 2.4 RC, ale narazil jsem na podivnost. Pouzivam formular
v komponente (generovany pomoci interface factory). Drive jsem pouzival
v nette 2.3 figl cca jako je uveden zde Dependent select
box. Drive nebyl problem, ale ted jsem si zkusit cvicne nahodit @dev
verzi a zacalo to rvat end() expects parameter 1 to be array, null
given pro:
{* latte kod *}
<form n:name="form">
{snippet selectTime}
<select n:name="time"></select>
{/snippet}
...
</form>
/** vygenerovane latte 2.4 **/
function blockSelectTime($_args)
{
extract($_args);
$this->global->uiControl->redrawControl('selectTime', FALSE);
?> <select<?php
$_input = end($this->global->formsStack)["time"];
echo $_input->getControlPart()->attributes() ?>><?php echo $_input->getControl()->getHtml() ?></select>
<?php
}
Podle dnesni posoboty jsem zkusil pridat snippetArea na obaleni celeho formu. To melo za nasledek zmizeni hlasky, ale vyvstal problem s prazdnou json response:
{
"state": {
"locale": null
},
"snippets": []
}
Snippety invaliduji v handleru komponenty:
/**
* @param $date
*/
public function handleDateChange($date)
{
if ($date) {
$this['form']['time']->setItems($this->getValidTime($date));
}
$this->redrawControl("xform"); // textArea
$this->redrawControl("selectTime");
}
Nema nekdo podobnou zkusenost? Pripadne tuseni, kde muze byt problem?
Edit:
Zkousel jsem hledat, co to vlastne dela – v UIRuntime::renderSnippets
se projede areaSnippet xform
– vysledek
ob_get_clean()
se ale zahodi a v sablone se pri tomto behu zmeni
funkci
$this->global->uiControl->redrawControl('selectTime', FALSE);
promenna v $control->invalidSnippets[‚selectTime‘] na false (Control::redrawControl).
Takze dalsi cyklus, ktery bere z $blockQueue
selectTime uz ji vidi
jako false. Takze ve finale $payload->snippets
je
prazdne pole.
Editoval macosx69 (29. 5. 2016 11:02)
- GEpic
- Člen | 566
Mám pocit že celý TwiGrid http://twigrid.1991.cz/ má stejný problém a kvůli tomu ho není možné využívat na 2.4
- David Matějka
- Moderator | 6445
hmm, asi jsem to mel nejdriv vyzkouset, nez jsem to dal do prezentace :))
snippet uvnitr snippetArea asi nikdy nefungoval (fungovaly pouze pokud snippety byly uvnitr inkludovanych sablon)
@DavidGrudl nemergnem fakt ty predelany snippety? ty by mely resit tyhle nekonzistence. kdyztak teda pripravim nejak vic testu, jak jsme se bavili..
- macosx69
- Člen | 5
Zkusim jsem si hrat s render a template a pokud se pouzije workaround nize,
tak to funguje jako na nette 2.3 (tzn. bez snippet area a nehaze vyjimku
end() expects parameter 1 to be array, null given). Vlastne je
to jen nahrazeni $this->template->_form = $this['form']
.
Je to sice prasecina, ktera muze cinit zlo, ale funguje…
public function render()
{
/** @var Template $template */
$template = $this->getTemplate();
if ($this->presenter->isAjax()) {
$template->getLatte()->addProvider('formsStack', [$this['form']]);
}
$template->setFile(__DIR__ . '/ReservationsForm.latte');
$template->render();
}
- David Grudl
- Nette Core | 8218
@DavidMatějka no klidně, myslel jsem, že to je spíš refactoring, že to neřeší nedostatky.
- David Grudl
- Nette Core | 8218
A nešel by ten side effect snadno přenést do stávajícího kódu? Prostě vydat 2.4 během týdne a snippety nechat do 2.5?
- David Matějka
- Moderator | 6445
myslim, ze to nepujde. jde o to, ze na zacatku kazdeho snippetu se vola enter() a snippet driver pote muze sparavne reagovat, jelikoz zna, co se vsechno volalo.
Muselo by se tam celkem komplikovane dat dovnitr tech snippetu ob_start a nejak to dostat do payloadu – asi podobne, jako se ted resi dynamicke snippety