Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

New snippets do not respect template rendering code #160

Closed
ondrejmirtes opened this Issue Dec 1, 2010 · 25 comments

Comments

Projects
None yet
Contributor

ondrejmirtes commented Dec 1, 2010

If I pass some arguments to $control->render() or if I render Control with a different method than render(), new snippets still try to call render() method without any parameters.

For example, if I have this code in template:

{control rating $trip->rating}

And this component has some snippets in it and they are invalidated in AJAX request, the component is still rendered via calling $control->render() in LatteMacros.php, line 1228.

wacco commented Jul 22, 2011

Velmi by mi pomohlo, keby sa toto uz konecne zacalo riesit.

Crempa commented Aug 6, 2011

skutecne otravna chyba, skoda ze i nova dokumentace pocita s tim ze to funguje, moc bych se primlouval za opravu, dekuji

Contributor

raxtor commented Sep 23, 2011

We are calling for fix pls

Chates commented Oct 21, 2011

Taky jsem na to dnes narazil. Řeší se to nějak? Díky moc

Contributor

vojtech-dobes commented Oct 21, 2011

Solution is rendering controls without arguments (as much as possible passing them via constructor). And regarding methods other than render, it is possible to fix this locally in component by this "hack" (#269) suggested by @hrach.

Of course it would be great if someone implemented final solution for the framework.

Contributor

hrach commented Dec 13, 2011

Tento bug není dle mě vůbec třeba řešit. Je to prostě nekompatibilata a změna, který ale přináší i velké zrychlení, díky které se prostě neparsují šablony, ale v ajaxu se přímo volá renrder komponenty. Prosím @dg, zkus napsat na phpfashion nějakéj článek k tomu, proč to jinak nebude. Nemyslím si, že existuje nějaké efektnivní řešení bez vracení se k původní zavináčové implementaci.

Obejít se to dá různými způsoby.

{control rating-$trip->rating}

Je třeba jen vyřešit podružné problémy, velmi jednoduše #269 a pak #390.
Zde můj starý návrh k řešení, který považuji za nepoužitelný a zbytečný: http://forum.nette.org/cs/7069-reseni-dynamickych-snippetu

NoxArt commented Dec 13, 2011

David dnes hřímá nad komunitou, tak sem zkusím něco hodit:

kdysi jsem napsal toto: https://gist.github.com/896127/6039ed448d9d4abdeb0e3e79219a04b967638ff4
(stačí hledat "controlCalls" a dávat 'next')
ale:

  1. je to na starší verzi
  2. nevim jak robustní nebo hezké to je, možná to má nějaké mouchy,
    nemůžu se teď tomu bohužel moc věnovat

každopádně v kódu co jsem to měl, tak to fungovalo

Crempa commented Dec 13, 2011

2hrach: chapes ale ze tu nejde o dynamicke snippety, ale pushovani parametru controlu jo?

Contributor

hrach commented Dec 13, 2011

Crempa: no samozrejme, ten parametr mas prave pushovat z tovarnicky, ne az v kodu. Jinak to neni "control", ale jen nějakej tvuj "include" zabalenej do tridy.

wacco commented Dec 13, 2011

Mne ale napriklad vela krat netreba prenasat samotny parameter, ale pouzit prave iny render. Uplne jednoduchy priklad je komponenta kosika. Interne spravenie je rovnake, len chcem niekde pouzit render maleho kosika do sidebaru a inde render velkeho kosika v procese objednavky povedzme. Bolo naozaj jednoduche pouzit {control basket} pre velky kosik a {control basket:small}. Cize naozaj len pouzitie ineho renderovania.

Contributor

hrach commented Dec 13, 2011

Wacco: toto je stale mozne udelat, ma to jen maly bug #269.

Crempa commented Dec 13, 2011

Hrach: ano jenze pokud si pretizis createComponent a zobecnis nette tovarnicky tak abys mohl specifikovat globalni tovarnicky ktere se rozhodujou treba podle vlastnich konvenci pojmenovani komponent tak skutecne netusim jak jinak tam ty parametry procpat (aniz bych musel stejne delat nejakou presenter based tovarnicku jen kvuli parametrum)

wacco commented Dec 13, 2011

hrach: no jasne ak by som chcel docasne riesnie pojde to, ale naco renderovat obe metody, ked pouzijem len jednu. skor sa jedna o to ze ci sa tento sposob uplne rusi alebo ako to s tym vypada.

Contributor

hrach commented Dec 13, 2011

@Crempa Globalni tovarnicka? uz z toho nazvu neco smrdi. :) Jinak myslim, ze neni problem mit jednu tovarnicku glovalni a pak dalsi, ktere ji "podedi" a doupravi komponentu.

@wacco tu render metodu si prave muzes implementovat jak chces. Jde imho jen o to, aby kdyz ona zavola vic renderu, tak se vsechny snippety prenesli ajaxem.

wacco commented Dec 13, 2011

hrach: no ak by som chcel nejako podmienovat, ktory custom render by sa mal vykonat potreboval by som nejaky parameter zo sablony {control basket small} a ten parameter sa mi zase pri ajaxe neprenesie a sme znova na zaciatku. inak musim volat vsetky custom rendery a vykonam toho teda viacej ako by som potreboval.

Contributor

hrach commented Dec 13, 2011

@wacco On je to dle me spatne zvoleny priklad. Zobrazeni kosiku (a jeho zpracovani) a kosikovy button nahore jsou podle me tedy dve odlisne zalezitosti. Mas pravdu, ze dektce "ktery render" neni nic primocarneho. Mozna by to slo dle toho, ktery handle se vola. Jednodussi bude urcite zavolat oba, coz dle me dava vyznam treba u toho rating controlu, kdy mam hodnotici popisek a hodnotici button, ktery muzu renderovat na jinych mistech, ale pri tom pri kazde zmene chci prekreslit oba.

foglcz commented Dec 18, 2011

Tak jsem si to na lokale zprovoznil. Use case:

template.latte:

    {control $ratCon:$rating}

control.latte:

{snippet snipa}snippet with var: {$var}, time {!time()}{/snippet}
<a href="{link inv!}" id="reload{$var}" class="reload">RELOAD CONTROL</a>

control.php:

class RatingControl extends Nette\Application\UI\Control {
    public function handleInv() {
        $this->invalidateControl('snipa');
    }
    public function render() {
        echo 'render() -- should not happen'; exit;
    }

    public function renderCustom() {
        $this->template->var = 'custom';
        $this->template->setFile(__DIR__ . '/rating.latte');
        $this->template->render();
    }
    public function renderCustom2() {
        $this->template->var = 'custom2';
        $this->template->setFile(__DIR__ . '/rating.latte');
        $this->template->render();
    }
    public function renderCustom3() {
        $this->template->var = 'custom3';
        $this->template->setFile(__DIR__ . '/rating.latte');
        $this->template->render();
    }
}

Testujte! Nepoužívejte! Díky :-)

foglcz commented Dec 18, 2011

a stejným způsobem by tam šlo i dohodit parametry render() metod

edit: done.

@hrach hrach closed this Nov 22, 2012

Contributor

Vrtak-CZ commented Nov 23, 2012

@hrach why you close that without any reasons?

Contributor

Majkl578 commented Nov 23, 2012

@hrach: This is still unresolved, no reason for closing this.

Contributor

hrach commented Nov 24, 2012

Please double check you knowledge about internal template & latte rendering system. Thes issue can't be fixed since it's the purpose to not to render whole page, just blocks (called snippets this time). Please stop trolling and do sth useful, such as learning how it really works and why these can not be fixed.

For others: there is branch (unfortunatelly not rebased) which provides similar functionality for running some parts of template without sending them as a snippet. See https://github.com/hrach/nette/tree/f-snippet-runner.

In the end, not resolved doesn't mean it can't be closed. See some advanced bug trackers how it usually goes.

Contributor

Vrtak-CZ commented Nov 24, 2012

@hrach I'm not tolling and I know how / what's the problem. I have good knowledge about this bug. But this is still (real) bug! Current state is realy WTF. So I see no reason to close this issue.

peldax commented Apr 19, 2017

@hrach Ahoj, prosím o zápis do dokumentace. Teď jsem hledal proč se mi při AJAXu nepředává parametr a ejhle, najdu issue z roku 2010.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment