Existuje lepši LookoutControl?

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

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

Nejnovější verze je tady. Osobně to považuji za deprecated, tedy jsem to dál nevyvíjel :)

Šaman
Člen | 2659
+
0
-

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í?

norbe
Backer | 405
+
0
-

Předpokládám že to je kvůli komponentám, která nepoužívají template…

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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

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

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();
	}
}
Šaman
Člen | 2659
+
0
-

@vojtech.dobes: S čím jsou problémy s AJAXem? Jen u LookoutControl (tu ruším), nebo i s obyčejnou komponentou, která má několik render(), renderTop() metod?

Mě se pohledy komponent libí víc, než nastavovat v továrničce šablonu.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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

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

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

Tak se mi při testování sekla mozilla, takještě jednou a stručně:

  1. 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ě
  2. Díky, šlo mi je o to, jestli není nějaké hotové řešení.
  3. 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
+
0
-

Ad 1. invaliduješ ten snippet na té komponentě?

Šaman
Člen | 2659
+
0
-
  1. invaliduji v komponentě přes $this->presenter, ale snippet, který je v komponentě.
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nu, tak tam je zakopaný pes. Je třeba invalidovat snippet na té instanci, v jejíž šabloně je.

Šaman
Člen | 2659
+
0
-

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