Nette 2.4 – snippety ve formulari jako komponente

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

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

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

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

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

@DavidMatějka no klidně, myslel jsem, že to je spíš refactoring, že to neřeší nedostatky.

David Matějka
Moderator | 6445
+
0
-

@DavidGrudl to je side effect :)

David Grudl
Nette Core | 8139
+
0
-

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

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

David Grudl
Nette Core | 8139
+
0
-

Ok