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 | 668
 
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 | 668
 
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 | 668
 
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)