Jinak řešená URL + kompatibilita s Nette
- pepakriz
- Člen | 246
K Nette jsem se dostal teprve nedávno a potřeboval bych popostrčit
v následujícím problému.
Mám webovou aplikaci, která má pouze jeden presenter. Ten zjistí, které URL
bylo voláno. Dejme tomu „/galerie/leto-2009/“ a k tomuto URL vytáhne
z databáze informaci o tom, které widgety a v jakém pořadí se mají do
stránky umístit. Vytvoří je a následně jsou v šabloně vykresleny.
Problém, který nevím jak řešit souvisí s posíláním proměnných a
volání akcí na widgetech. Např. chci, aby když zadám URL
„/galerie/leto-2009/45/show/54“ , z databáze script zjistí, že
nejbližší vyhovující URL je „/galerie/leto-2009/“ a tudíž parametry
jsou jen „/45/show/54“. 45 by mělo znamenat, že událost je volána ve
widgetu s ID 45. „show“ by mělo znamenat volání akce show atd… .
Zkrátka bych rád dosáhnul plné funkčnosti Nette widgetů v mém projektu.
Nějaký nápad?
- _Martin_
- Generous Backer | 679
pepakriz napsal(a):
Mám webovou aplikaci, která má pouze jeden presenter. Ten zjistí, které URL bylo voláno.
Myslím, že to je ten hlavní problém. Vypadá to, že jsi logiku routeru přesunul do presenteru, logiku presenteru do widgetu (částečně mixlou s logikou modelu) a ty akce ve widgetu už ani nechápu.
Na /galerie/leto-2009/45/show/54
je hloupé, že vlastně
neříká uživateli, co se stane. Zkusíme si tu URL rozebrat:
/galerie/
– seznam galerií/galerie/leto-2009/
– seznam galerií za léto 2009/galerie/leto-2009/45/
– divné, že?/galerie/leto-2009/45/show/
– také moc nedává smysl/galerie/leto-2009/45/show/54
– zobrazí galerii 54
takže se nám tím adresa zkrátila na
/galerie/leto-2009/54
.
Já tedy nevím přesně, co vše a jak tam voláš, ale určitě ta adresa není vhodně zvolená, určitě by měl adresy řešit router a nikoliv presenter a určitě bude třeba návrh té aplikace předělat, protože mám pocit, že Nette používáš špatným způsobem.
- lucass
- Člen | 89
Já to pochopil malinko jinak a asi (bez hlubšího prozkoumání možností parametrů u widgetů) bych to řešil takto:
<?php
class TvujPresenter extends Presenter {
protected $id;
public function createComponentTvujWidget() {
require_once ('tvujWidget.php');
return new TvujWidget($this, 'tvujWidget', $this->id);
}
public function show($id) {
$this->id = $id;
}
}
?>
Tím bys měl být zaručeno, že při action=show, jejíž parametrem je id=45, se načte požadovaný widget s daným ID. Jestli je to tedy odpověď na tvou otázku.
UPDATE: Tak jsem to fakt asi pochopil špatně, když to teď čtu znova. Tak toto asi neber v potaz. Alespoň jsem se vykecal:)
Editoval lucass (15. 11. 2009 20:15)
- pepakriz
- Člen | 246
_Martin_ napsal(a):
pepakriz napsal(a):
Mám webovou aplikaci, která má pouze jeden presenter. Ten zjistí, které URL bylo voláno.
Myslím, že to je ten hlavní problém. Vypadá to, že jsi logiku routeru přesunul do presenteru, logiku presenteru do widgetu (částečně mixlou s logikou modelu) a ty akce ve widgetu už ani nechápu.
Na
/galerie/leto-2009/45/show/54
je hloupé, že vlastně neříká uživateli, co se stane. Zkusíme si tu URL rozebrat:
/galerie/
– seznam galerií/galerie/leto-2009/
– seznam galerií za léto 2009/galerie/leto-2009/45/
– divné, že?/galerie/leto-2009/45/show/
– také moc nedává smysl/galerie/leto-2009/45/show/54
– zobrazí galerii 54takže se nám tím adresa zkrátila na
/galerie/leto-2009/54
.Já tedy nevím přesně, co vše a jak tam voláš, ale určitě ta adresa není vhodně zvolená, určitě by měl adresy řešit router a nikoliv presenter a určitě bude třeba návrh té aplikace předělat, protože mám pocit, že Nette používáš špatným způsobem.
Ano, používám ho jinak. V mém příkladu je
/galerie/leto-2009/
pouze stránka, která obsahuje určité
widgety. např widget, který zobrazuje miniatury fotek. Jenže tento widget
bude třeba na stránce vložen 2×.
Pro jistotu popíšu, čeho přesně chci dosáhnout. V databázi v tabulce mám seznam stránek. každá tato stránka má k sobě přiřazené widgety, které se na dané stránce mají zobrazit. Při volání určitého URL se vybere požadovaná stránka a do ní se vloží widgety.
- _Martin_
- Generous Backer | 679
Brání něco tomu, abys měl v DB uloženo u každé stránky její presenter a akci (případně parametry) a udělal si vlastní router, kterej tě bude směrovat na správné „lokace“ s tím, že potřebné widgety si budeš načítat přímo v tom konkrétním presenteru?
Neříkám, že takové sestavení stránky widgety není dobrý nápad. Nenapadá mě ale žádné čisté „Nette“ řešení, kterým by toho šlo dosáhnout. Jistý si jsem jen tím, že to bude chtít vlastní router.