Parametry vyhledávání, kategorie
- Donkeykong
- Člen | 39
Omlouvám se za dotaz, ale pro pochopení principů, se chci zeptat, jak se správně řeší různé parametry. Mám dejme tomu stránku na vyhledávání nemovitostí. HomepagePresenter se stará o vykreslení všech nemovitostí. Poté mám na homepage 2 odkazy s názvem „Prodej“ a „Pronájem“. Při kliknutí chci poté zobrazit jen nemovitost příslušící k danému výběru. Otázka zní. Mám to řešit jako novou metodu v presenteru nebo se to v těchto případech dělá jinak? Zatím jsem si v HomepagePresenter pod metodou renderDefault vytvořil další dvě metody
<?php
public function renderProdej()
{
}
public function renderPronajem()
{
}
?>
A zkopíroval do nich v podstatě vše z metody renderDefault, s tím
rozdílem že v částí kde mám normálně
$this->template->houses = $this->houseRepository->findAll() mám
nyní $this->template->houses =
$this->houseRepository->findAll()->where(‚type_id‘,‚zde bud id
pro pronajem nebo prodej v zavislosti na tom co hledam‘). A url poté
vypadá například takto /homepage/prodej
Je toto správný postup nebo ne? Vše samozřejmě funguje, ale přijde mi to takové krolokomné. Ten samý princip dělám i u ruzných kategorií atd.
Editoval Donkeykong (30. 6. 2013 8:22)
- petr.pavel
- Člen | 535
Řešil bych přes signály.
class HomepagePresenter ... {
private $typ = null;
function renderDefault() {
$nemovitosti = ...findAll();
if ($this->typ !== null) {
$nemovitosti->where('typ', $this->typ);
}
...
}
function handleFiltr($typ) { $this->typ = $typ; }
V šabloně:
<a n:href="filtr! typ=>prodej">Jen prodeje</a>
HomepagePresenter by se ale spíš měl jmenovat NemovitostPresenter, ne?
- Oli
- Člen | 1215
@petr.pavel: Nedělají signály vždycky url v tomhle tvaru?
<presenter>/<action>[/<cokoli>]?do=Filtr
Jestli ne, tak další text je k ničemu. Pokud ano, tak bych tohle řešení použil jen ve spojení s ajaxem a bez ajaxu bych udělal řešení něco ve smyslu:
// psáno z hlavy
class HomepagePresenter ... {
private $doSablony;
function actionDefault($typ = null) {
if ($this->typ !== null) {
$this->doSablony = $nemovitosti->where('typ', $typ);
} else
{
$this->doSablony = ...findAll();
}
}
function renderDefault() {
$this->template->nemovitosti = $this->doSablony;
...
}
Pak při správně nastaveném routování může být routa ve tvaru
třeba: <presenter>/<action>[/<typ>]
- Donkeykong
- Člen | 39
Děkuju za odpovědi. Jestli jsem pochopil správně, tak ale ani můj postup není úplně špatný a můžu ho používat?
- Oli
- Člen | 1215
Tvůj postup je funkční. Blbě je to, že se opakuje stejný kód na dvou místech. To by se mělo co nejvíc omezit.
Si představ, že budeš potřebovat vytvořit třeba 10 dalších typů. V mém a v petr.pavel řešení nemusíš nic měnit a funguje ti to (jen v v db musíš mít odpovídající záznamy ve sloupci ‚typ‘). V tvém řešení musíš vytvořit 10 nových akcí a 10 nových *.latte souborů. ;-)
- Šaman
- Člen | 2666
@Donkeykong: Jenom ty můžeš vědět, jestli se
jedná o dva různé pohledy (typicky pokud se u každého pohledu budou
vypisovat jiné údaje, budou jiné možnosti akce, ..), nebo jestli je to
vpodstatě filtr vyhledávání.
Tvoje řešení je dobře, pokud platí ta první možnost. Ale pokud např.
existuje stránka, kde jsou všechny nemovitosti, tak to spíš ukazuje na to,
že se jedná o jeden pohled a jen filtrovaná data.
Musíš zvážit kolik kódu se ti opakuje (pokud jen načítání dat z db,
tak je to ok), na druhou stranu tvé řešení je čitelné na první pohled.
A program má být co nejčitelnější.