Skip to content
This repository

New snippets do not respect template rendering code #160

Closed
ondrejmirtes opened this Issue · 24 comments

12 participants

Ondřej Mirtes wacco knyttl Crempa raxtor Martin Mates Vojtěch Dobeš Jan Škrášek Jiří Petruželka Pavel Ptacek Patrik Votoček Michael Moravec
Ondřej Mirtes

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
wacco commented

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

Crempa

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

raxtor

We are calling for fix pls

Martin Mates

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

Vojtěch Dobeš

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.

Jan Škrášek
Collaborator

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

Jiří Petruželka

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

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

Jan Škrášek
Collaborator

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

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.

Jan Škrášek
Collaborator

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

Crempa

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

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.

Jan Škrášek
Collaborator

@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

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.

Jan Škrášek
Collaborator

@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.

Pavel Ptacek foglcz referenced this issue from a commit
Commit has since been removed from the repository and is no longer available.
Pavel Ptacek

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

Pavel Ptacek

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

edit: done.

Pavel Ptacek foglcz referenced this issue from a commit
Commit has since been removed from the repository and is no longer available.
Pavel Ptacek foglcz referenced this issue from a commit
Commit has since been removed from the repository and is no longer available.
Pavel Ptacek foglcz referenced this issue from a commit
Commit has since been removed from the repository and is no longer available.
Jan Škrášek hrach closed this
Patrik Votoček

@hrach why you close that without any reasons?

Michael Moravec

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

Jan Škrášek
Collaborator

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.

Patrik Votoček

@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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.