Ajax a StringTemplate problem

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

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

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)

hizo
Člen | 48
+
0
-

dik moc ten vykricnik vsetko poriesil! inak ten StringTemplate som definoval ako:

<?php
class StringTemplate extends Nette\Templating\Template
?>

musi to teda este pokracovat implements Nette\Templating\ITemplate? to len otazka keby to chcem pouzit niekedy v buducnosti

bojovyletoun
Člen | 667
+
0
-

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

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

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)