Zpracování bloku bez načtení – undeffined variable
- 2bfree
- Člen | 248
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
pokud tam nemáš {extends ...}
tak ti to automaticky vykreslí
obsah všechn bloků
- 2bfree
- Člen | 248
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)
- 2bfree
- Člen | 248
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
- 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
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
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
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}