Ajax a StringTemplate problem
- hizo
- Člen | 48
Zdravim, ako prosim v novom Nette pouzijem StringTemplate s AJAXom? ide mi o toto: mam jednoduchu stranku s menu a pri kliku na nejaku polozku menu chcem ajaxom nacitat data z databazi a zobrazit. Toto sa mi podla prikladu Fifteen podarilo, avsak niektore veci ktore taham z DB maju v sebe HTML kod, napriklad na jednej podstranke chcem nacitat z databazi iframe nejakej dalsej stranky a samozrejme namiesto pozadovanej stranky mi to tam hodi kod <iframe>…</iframe>.
K dosiahnutiu AJAXu som pouzil samostatnu komponentu:
<?php
<?php
use Nette\Application\UI;
use Model\DB;
/**
* The Fifteen game control
*
* @author David Grudl
*/
class FifteenControl extends UI\Control
{
public $data;
public function __construct()
{
parent::__construct();
}
public function handleClick($page)
{
//tuto zisti na co sa kliklo a ziskaj data
$this->data = DB::getContent($page);
}
public function render()
{
$template = $this->template;
$template->setFile(__DIR__ . '/FifteenControl.latte');
$template->podnadpis = $this->data['h2_tag'];
$template1 = new StringTemplate();
$template1->presenter = Nette\Environment::getApplication()->getPresenter();
$template1->registerFilter(new Nette\Latte\Engine);
$template1->content = $this->data['content'];
$template->obsah = $template1;
$template->render();
}
?>
pricom FifteenControl.latte vyzera:
<?php
{snippet}
<div id="sidebar">
<h2 class="podnadpis">{$podnadpis}</h2>
</div>
<div id="main">
{$obsah}
</div>
<div class="clear"></div>
{/snippet}
?>
Opakujem este raz – cela zalezitost funguje ale potrebujem sa zbavit HTML kodu ktory mi niekedy vytiahne z db a namiesto neho poslat vyrenderovanu sablonu. snad som to dobre vysvetlil. za pomoc velmi dakujem!
- bojovyletoun
- Člen | 667
asi máš na mysli, že se ti proměnné escapují (podívej se do
zdrojáku). Neescapovaná proměnná se vypíše {!$obsah}
.
Teoreticky by nemělo být nutné toto provést, protože podle tohoto se šablony neescapují, problém tedy může být v tom, že třída StringTemplate neimplementuje Nette\Templating\ITemplate (ach ty namepsace)
Editoval bojovyletoun (27. 6. 2011 13:36)
- bojovyletoun
- Člen | 667
Nette už obsahuje třídu Template, která funguje jako StringTemplate (hádám, že ji máš odsud ) Případně ta stringTemplate je v něčem speciálnější?.
otázka: Není nutné dávat
implements Nette\Templating\ITemplate
, protože Template již
obsahuje implements Nette\Templating\ITemplate
. Myslel jsem, že je
to nějaká speciální třída, která nedědí od Template, tam by to mělo
smysl. Vykřičník zajistí, že se proměnná neescapuje. Kód v předchozím
odkazu by právě měl zajistit, aby se ani ITemplate neescapovalo.Pak tedy ale
nechápu, proč byl výstup escapovaný.
- hizo
- Člen | 48
String template mam odtialto
Pri cistom HTML kode mi stacil vykricnik pred vypisanim premennej, ale co ked mam v databazi link na obrazok s href=„{$basePath}/img/…“. V tom pripade mi vykricnik nepomoze, $basePath sa nicim nenahradi a tym padom nevie najst cestu k obrazku…a pokial si pamatam tak StringTemplate bola v predoslych verziach presne na tento problem, no v novej verzii mi to nejak nefunguje. Subory vyzeraju nasledovne:
<?php
class StringTemplate extends Nette\Templating\Template
{
public $content;
/**
* Renders template to output.
* @return void
*/
public function render()
{
$cache = Nette\Environment::getCache('StringTemplate');
$key = md5($this->content);
$content = $cache[$key];
if ($content === NULL) { // not cached
if (!$this->getFilters()) {
$this->onPrepareFilters($this);
}
$cache[$key] = $content = $this->compile($this->content);
}
$this->__set('template', $this);
Nette\Utils\LimitedScope::evaluate($content, $this->getParams());
}
}
?>
a
<?php
class DefaultPresenter extends \BasePresenter
{
protected $podnadpis;
protected $content;
public function handleClick($page) {
$data = DB::getContent($page);
$this->podnadpis = $data['h2_tag'];
$this->content = $data['content'];
if($this->isAjax()) {
$this->invalidateControl('content');
$this->invalidateControl('script');
}
}
public function renderDefault() {
$this->template->podnadpis = $this->podnadpis;
$sablona = new \StringTemplate();
$sablona->presenter = \Nette\Environment::getApplication()->getPresenter();
$sablona->registerFilter(new \Nette\Latte\Engine);
$sablona->content = $this->content;
$this->template->content = $sablona;
}
}
?>
a Debugger ukazuje ze $this->template->content je prazdna neviem preco, pomozte.
- bojovyletoun
- Člen | 667
Podívej se na Nette\Application\UI\Control::createTemplate(). Pokud tedy nepoužíváš $this->template (která magicky volá getTemplate a následně createTemplate), musíš si do šablony ty proměnné baseUrl dát sám. Proto doporučuji využít toto
$t2=$this->template->obsah=$this->createTemplate('Nette\Templating\Template');
$t2->setSource($this->data);
Editoval bojovyletoun (27. 6. 2011 22:37)