Existuje lepši LookoutControl?
- Šaman
- Člen | 2659
Ahoj, existuje nějaká nová verze abstraktní komponenty LookoutControl?
Tahle otázka je asi nejvíc určena HosipLanovi.
Používám upravenou verzi (pro dohledání šablony používá
TemplateLocator) a moc se mi líbí že umožňuje pohledy komponent.
Co se mi na ní nelíbí je „ruční“ renderování přes zachytávání výstupu a následné echování. Nejde to udělat nějak čistěji?
- Filip Procházka
- Moderator | 4668
Nejnovější verze je tady. Osobně to považuji za deprecated, tedy jsem to dál nevyvíjel :)
- Šaman
- Člen | 2659
Proč používáš
<?php
ob_start();
call_user_func_array(array($this, $viewMethod), $this->renderParams);
$output = ob_get_clean();
if (!$output && file_exists($file)) { // raw output from function
$output = (string)$this->template;
}
echo $output;
?>
místo
<?php
call_user_func_array(array($this, $viewMethod), $this->renderParams);
if (file_exists($file)) {
$this->template->render();
}
?>
Mě to s obyčejným renderem funguje, má nějaký důvod to zachytávání?
- Vojtěch Dobeš
- Gold Partner | 1316
Osobně bych LookoutControl
zakázal :). Komponenta s více
pohledy mi přijde spíše jako několik podobných komponent, navíc jsou
s tím problémy při nativním neťťáckém zajaxování.
- Šaman
- Člen | 2659
Aha, no už jsem si na to zvykl, ale zase je dost dobrých důvodů to
zrušit..
Více pohledů používám třeba na přihlašovací formulář (jednou nahoře
v liště, podruhé přes celou přihlašovací stránku), ale jestli jsem měl
zatím 3 komponennty kde to dávalo smysl, tak se to dá zapsat, jinak.. Ono
komponenta pohledy podporuje, ale musí se napsat víc renderXxx() metod,
stejně jako v presenteru.
- Filip Procházka
- Moderator | 4668
Vždycky můžeš té komponentě přepínat šablony :)
protected function createComponentLoginFormTop()
{
$login = new LoginControl;
$login->setView('top');
return $login;
}
protected function createComponentLoginForm()
{
$login = new LoginControl;
return $login;
}
class LoginControl extends Nette\Application\UI\Control
{
private $view = 'default';
public function setView($view)
{
$this->view = $view;
}
public function render()
{
$this->template->setFile(__DIR__ . '/login.' . $this->view . '.latte');
$this->template->render();
}
}
- Vojtěch Dobeš
- Gold Partner | 1316
@Šaman Pravda, s obojím, jak s LookoutControl,
tak s různými render metodami. Filipovo řešení je správné, protože
v šabloně může být jen {control loginForm}
. A ne
dvojtečka.
- Šaman
- Člen | 2659
Tak ještě jednou oživím tohle téma, když už tu je začátek diskuze.
Vojto, nefunguje mi ajax (tvoje rozšíření) v komponentě, která
vyžaduje parametry. Myslíš, že to může být tím, co zmiňuješ
výše?
Mám snippetem obalenou celou šablonu komponenty a ta se neobnoví ani když
vyjmenuji ten snippet, ani když invaliduji všechno.
Jediné, co funguje jsou flashMessage (mají svůj snippet) a pokud obalím v @layoutu celý blok content snippetem, invaliduje se mi všechno.
A druhá otázka – mohu nejdřiv vykreslit rychlé věci (flashMessage) a teprve potom čekat na vykreslení pomalých? Teď mám i při ajaxu dlouhou odezvu a v message bych mohl upozornit, že se vše podařilo, jen to není vidět.
A třetí – jak zprovoznit spinner extension? Musí se nějak registrovat, nebo zapnout? Mám ho přilinkovaný, mám pro něj CSS styl a stejně mi nenaběhne
Díky!
- Vojtěch Dobeš
- Gold Partner | 1316
Ad nefunkční invalidace, mohl bys mi ukázat kód?
Ad druhá otázka, asi by to nějak šlo, pokud by se vše neposílalo v JSONu. Ale tak tomu je. Popravdě řečeno nevím, jak bych to řešil.
Ad spinner, zkoušel jsi to nějak prodebugovat? Skutečně se do DOMu spinner nepřidává?
- Šaman
- Člen | 2659
Tak se mi při testování sekla mozilla, takještě jednou a stručně:
- Asi to bude tou komponentou, je dost divoká a vykreslí skutečně MOC dat. Odstranění parametrů nepomáhá, stále se dá překreslit jen když snippetem obalím celou control v nadřízené šabloně
- Díky, šlo mi je o to, jestli není nějaké hotové řešení.
- Otestováno – spinner funguje, ale jen na stránkách, kde není ta výše zmíněná komponenta. Takže to není chyba scriptu.
- Vojtěch Dobeš
- Gold Partner | 1316
Nu, tak tam je zakopaný pes. Je třeba invalidovat snippet na té instanci, v jejíž šabloně je.
- Šaman
- Člen | 2659
Tak postřeh číslo jedna – není možné invalidovat komponentu, která vyžaduje parametry. Když jsem je odstranil, tak teprve bylo možné invalidovat. Předtím to potichu vyhodilo log, že metoda render($param) nemá povinný parametr. Invalidovat to šlo jen z nadřízené šablony, která ty parametry zná.
Druhý zakopaný pes byl v dynamických snippetech. To $this->presenter->invalidate.. jsem volal proto, že, jak jsem psal, měl jsem snippet v nadřazené šabloně, která mi to invalidovala.
Ale v té komponentě jsem měl ještě dynamické snippety a s nimi mi invalidace v komponentě nefungovala (ani celé komponenty). Po jejich odstanění to funguje, i spinner se v konzoli načítá, jen nevím kde je.. :)
Díky, víc se do toho teď šťourat nebudu..