Zpracování bloku bez načtení – undeffined variable

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

Mám dotaz, jakto že mi tento kód vrací výjimku „Undefined variable: test“

Template

<?php
{block #test}
    {default test => 'test'}
    {snippet $test}
    {/snippet}
{/block}
?>

Obzvláště, když nikde neincluduju ten blok.

Editoval 2bfree (31. 12. 2010 14:15)

bojovyletoun
Člen | 667
+
0
-

snippety už nemohou mít dynamický název.
viz první tři odkazy
1 2

Nox
Člen | 378
+
0
-

Je tam ale TODO, tak snad se zanedlouho dočkáme…

2bfree
Člen | 248
+
0
-

Tak snad to bude brzy možné. ;)

Smutné je, že se mi ta chyba vyskytuje i v tomto případě, kde se nejedná o dynamický snippet. Navíc, jakto že mi to vypíše tuto chybu, když ten block nikde neincluduju?

<?php
{block #test}
    {default test => 'test'}
    {snippet nazev}
        <h1>{$test}</h1>
    {/snippet}
{/block}
?>
Filip Procházka
Moderator | 4668
+
0
-

pokud tam nemáš {extends ...} tak ti to automaticky vykreslí obsah všechn bloků

2bfree
Člen | 248
+
0
-

HosipLan napsal(a):

pokud tam nemáš {extends ...} tak ti to automaticky vykreslí obsah všechn bloků

Tak tím to nebylo.

@layout.phtml

<?php
{include #content}
?>

@show.phtml

<?php
{extends @layout.phtml}

{block test}
    {default test => 'test'}
    {snippet pokus}
        <h1>{$test}</h1>
    {/snippet}
{/block}
{block content}
?>

Undefined variable: test

Editoval 2bfree (1. 1. 2011 12:13)

redhead
Člen | 1313
+
0
-

Nemá to být s dolarem?

{default $test => 'test'}
2bfree
Člen | 248
+
0
-

redhead napsal(a):

Nemá to být s dolarem?

{default $test => 'test'}

Nemá. Převede se to na extract(array(‚test‘=>‚test‘)); Viz.: http://cz.php.net/….extract.php

Editoval 2bfree (1. 1. 2011 13:48)

bojovyletoun
Člen | 667
+
0
-
  • Sakra! právě jsem psal dlouhý příspěvek a omylem dal refresh. takže en ve krátkosti: spíš jen hrubý popis:
  • ~ znamená názvy v příkladu
  • v přeložené šabloně se volá toto. snipetblok~pokus. Problém je, že se funkci renderujující snippet snip~test (první param fukce _l->blocks[_snip]) předá $template->getparams(), ta ale neobsahuje proměnnou $test.
  • zatímco pokud nahradíme snippet za block, tak je šablona defacto stejná, až na to, že místo $template->getParams() se volá get_defined_vars(). Jelikož $test je def. kousek předtím, tak se tam dostane.
//




// block snipetblok
//
if (!function_exists($_l->blocks['snipetblok'][] = '_lb2897aa2eee_snipetblok')) { function _lb2897aa2eee_snipetblok($_l, $_args) { extract($_args)
?>(((
<?php '$template->test' = 'testttttt' ?><div id="<?php echo $control->getSnippetId('snip') ?>"><?php call_user_func(reset($_l->blocks['_snip']), $_l, $template->getParams()) ?></div>)))
<?php
}}

Workaround: ??je to bug?

{block snipetblok}(((
    {?$template->test = 'testttttt'}
    {snippet snip}
        { { <h1>{$test}</h1> } }
resp lepší je {$template->test} - protože to funguje, i když snippet nahradíme blokem
    {/snippet})))
{/block}

EDIT:
ještě jsem se vrtal v Lattemacros a zjišťoval to výše. zjistil jsem že v LatteMacros.php:line536 : macroinclude má parametr isDefinition, která právě rozhoduje: $params .= $isDefinition ? 'get_defined_vars()' : '$template->getParams()';. Používá se tento třetí parametr zvenčí?

ps:
https://latte.nette.org/cs/tags
https://latte.nette.org/cs/tags

Editoval bojovyletoun (1. 1. 2011 21:46)

2bfree
Člen | 248
+
0
-

bojovyletoun napsal(a):

  • Sakra! právě jsem psal dlouhý příspěvek a omylem dal refresh. takže en ve krátkosti: spíš jen hrubý popis:
  • ~ znamená názvy v příkladu
  • v přeložené šabloně se volá toto. snipetblok~pokus. Problém je, že se funkci renderujující snippet snip~test (první param fukce _l->blocks[_snip]) předá $template->getparams(), ta ale neobsahuje proměnnou $test.
  • zatímco pokud nahradíme snippet za block, tak je šablona defacto stejná, až na to, že místo $template->getParams() se volá get_defined_vars(). Jelikož $test je def. kousek předtím, tak se tam dostane.
//




// block snipetblok
//
if (!function_exists($_l->blocks['snipetblok'][] = '_lb2897aa2eee_snipetblok')) { function _lb2897aa2eee_snipetblok($_l, $_args) { extract($_args)
?>(((
<?php '$template->test' = 'testttttt' ?><div id="<?php echo $control->getSnippetId('snip') ?>"><?php call_user_func(reset($_l->blocks['_snip']), $_l, $template->getParams()) ?></div>)))
<?php
}}

Workaround: ??je to bug?

{block snipetblok}(((
    {?$template->test = 'testttttt'}
    {snippet snip}
        { { <h1>{$test}</h1> } }
resp lepší je {$template->test} - protože to funguje, i když snippet nahradíme blokem
    {/snippet})))
{/block}

EDIT:
ještě jsem se vrtal v Lattemacros a zjišťoval to výše. zjistil jsem že v LatteMacros.php:line536 : macroinclude má parametr isDefinition, která právě rozhoduje: $params .= $isDefinition ? 'get_defined_vars()' : '$template->getParams()';. Používá se tento třetí parametr zvenčí?

ps:
https://latte.nette.org/cs/tags
https://latte.nette.org/cs/tags

Díky moc za workaround. Těším se na vyzkoušení. Jenom pro úplnost je mi stejně ale záhadou, že se ta chyba vyskytne, když by se ten kód vlastně vůbec volat neměl.

bojovyletoun
Člen | 667
+
0
-

doporučuji shlédnout video z Poslední soboty. první půlka nebo třetina se mi zdála taková pomalu proíraná, pak se ale řešily věci ohledně snippetů a závilosí bloků, což bylo dost zajímavé. Sice ne konrétně jak něco naprogramovat, ale spíš jak to funguje pod kapotou.

!! ! ! ! !POZOR: Je to špatně! při ajaxu to nefunguje
právě na tom videu je to vysvětleno. Jelikož snippety jsou bloky a v tomto případě se generuje jako by sám (bez okolního kontextu), takže nemá přítup k lokálním proměnným nadřazeného bloku.

Pokud se stránka kreslila bez ajaxu, tak se** zdálo,** že to funguje.(zpracovaly se všechnybloky). Pokud je ajax zapnutý, tak se přistupuje k nedefinované proměnné.

Takže asi první řešení je používat pouze globální proměnné šablony, protože tak snippety fungují.
Snippet je element, který se renderuje sám o sobě bez přístupu mimo blok. Což je ulehčení serveru ( v rané verzi to bylo tak, že se generovala celá stránka, z ní se vyřízl snippet, poslal a zbytek stránky zahodil, což znamenalo možnost použití celého kontextu, ale zátěž pro server)
pak jsem si prolížel tento hack je inspirace (hack):„zde“:„https://forum.nette.org/cs/viewtopic.php?pid=46660#p46660“, ale nejde,

Editoval bojovyletoun (2. 1. 2011 14:25)

Filip Procházka
Moderator | 4668
+
0
-

nepsal jsem to tu myslím někde :)

nástin, nepamatuju si ty metody přesně:

public function renderDefault($id = NULL)
{
	if ($this->request->isAjax()) {
		$this->template->item = Model::findOne(array('id' => $id));

	} else {
		$this->template->items = Model::findAll();
	}
}
{foreach $items as $item}
	{snippet item}
		{$item->text}
	{/snippet}
{/foreach}