Jeden presenter pro více stránek
- xciza
- Člen | 194
Ahoj,
na stránkách se mě bude opakovat struktura stránek a tak bych nerad ke
každá stránce dělal zvlášť presenter. To by bylo v pohodě to vyřešit,
ale co bych chtěl poradit jak vyřešit, je odkazování na takovéto
stránky.
Dejme tomu že mám PagePresenter
. V něm si vytáhnu data
z db a foreachem je v šabloně vykreslím. Jak ale zajistit jaké data
vykreslit v závislosti na požadované stránce a jak se odkazovat v menu?
Když budu mít šablonu pro všechny page stejné, tak bude v url adrese furt
/page
jak zajistit aby tam bylo třeba /kontakty
?
Díky
- David Matějka
- Moderator | 6445
Routa:
new Route("<slug>", "Page:default");
Presenter:
class PagePresenter extends BasePresenter
{
public function actionDefault($slug)
{
$data = $this->getPageBySlug($slug);
}
}
Odkazovani:
<a n:href="Page:default kontakt">
V route ale asi budes muset pridat FILTER_IN, ktery overi existenci slugu a
pripadne vrati NULL
jako zamitnuti. Aby ti to nesezralo vsechny
pozadavky :)
- David Matějka
- Moderator | 6445
A nemas pred tim nejakou obecnou routu, ktera ti to „sezere“? Zkus tuhle routu posunout vyse.
- xciza
- Člen | 194
Mám to právě nad všemi hozeny.
new Route("<slug>", ":Front:Page:default");
$router = new RouteList();
$router[] = new Route('index.php', 'Front:Default:default', Route::ONE_WAY);
$router[] = $adminRouter = new RouteList('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Default:default');
$router[] = $frontRouter = new RouteList('Front');
$frontRouter[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => array(
Route::VALUE => 'Homepage',
Route::FILTER_TABLE => array(
),
),
'action' => 'default',
'id' => NULL,
));
return $router;;
- David Matějka
- Moderator | 6445
$pageRepository = ...;
$router[] = new Route("<slug>", array(
"presenter" => "Front:Page",
"action" => "default",
"slug" => array(
Route::FILTER_IN => function($slug) use($pageRepository) {
$page = $pageRepository->getPageBySlug($slug);
if(!$page) {
return NULL;
}
return $slug;
}
)
));
Editoval matej21 (28. 5. 2014 14:39)
- xciza
- Člen | 194
Předpokládám, že to té proměnné $pageRepository musím dostat modelovou třídu?
EDIT:
Tak jsem si přes konstruktor předal ten model a pak vložil do té proměnné.
Ale stejně mě všechny odkazy redirecnou na stejnou adresu
/** @var \App\Model\PagesRepository */
public $pages;
public function __construct(\App\Model\PagesRepository $pages) {
$this->pages = $pages;
}
EDIT2:
Tak nevím čím to, ale už to šlape
Editoval xciza (28. 5. 2014 15:22)
- wicked
- Člen | 290
Můžu mít ještě jeden lamerský dotaz?
Jak máš getPageBySlug?
Já to mám takto, ale to nejde
public function findAll() {
return $this->database->table('pages');
}
public function getPageBySlug($slug) {
return $this->findAll()->where($slug)->fetch();
}
Hází to
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'kontakt' in 'where clause'
Chápu z toho, že to nezná sloupec ‚kontakt‘ ale já právě mám DB id|slug|text kde ve slug je kontakt…
- wicked
- Člen | 290
xciza napsal(a):
musíš mít
public function getPageBySlug($slug) { return $this->findAll()->where("slug", $slug)->fetch(); }
Jasný, to mě taky napadlo a zkoušel jsem to, ale to mi zase hází
Call to undefined method App\FrontModule\Presenters\PagePresenter::getPageBySlug().
PagePresenter
<?php
namespace App\FrontModule\Presenters;
use Nette,
App\Model;
/**
* Page presenter.
*/
class PagePresenter extends BasePresenter {
/**
* @autowire
* @var \App\Model\PageModel
*/
protected $page;
public function actionDefault($slug) {
$page = $this->getPageBySlug($slug);
}
}
Editoval wicked (5. 6. 2014 8:59)