Jeden presenter pro více stránek

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

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

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 :)

xciza
Člen | 194
+
0
-

Děkuji. Odkazuje to tak jak potřebuji.Mám aplikaci rozdělenou na moduly a v když mám routu

new Route("<slug>", ":Front:Page:default");

Tak mám v adresním řádku

/page/?slug=kontakt

Ale potřeboval bych pouze:

/kontakt
David Matějka
Moderator | 6445
+
0
-

A nemas pred tim nejakou obecnou routu, ktera ti to „sezere“? Zkus tuhle routu posunout vyse.

xciza
Člen | 194
+
0
-

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

tu routu samozrejme musis pridat do routelistu.

$router[] = ...
xciza
Člen | 194
+
0
-

Jo díky, jsem blb :). Už to jde.

xciza
Člen | 194
+
0
-

Mohl by jsi ještě prosím nastínit ten FILTER_IN? Samozřejmě mě to žere ostatní odkazování…

David Matějka
Moderator | 6445
+
0
-
$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
+
0
-

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

A to ten _construct jsis predal v routerfactory?

xciza
Člen | 194
+
0
-

Ano. Je to spatne?

wicked
Člen | 290
+
0
-

Ne, jen premyslím jak jsi toho docilil … protoze me to hazi error … Muzes to sem prosim poslat?

xciza
Člen | 194
+
0
-

Tak jak to je v tom příspěvku výše.
A potom v createRouter():

$pageRepository = $this->pages;

A co ti to píše za error? Bez něj ti nikdo nepomůže ;)

wicked
Člen | 290
+
0
-

xciza napsal(a):

Tak jak to je v tom příspěvku výše.
A potom v createRouter():

$pageRepository = $this->pages;

A co ti to píše za error? Bez něj ti nikdo nepomůže ;)

Sorry :-( jsem slepý a přehlédl jsem jeden překlep …

Každopádně děkuji za nakopnutí ;)

wicked
Člen | 290
+
0
-

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…

xciza
Člen | 194
+
0
-

musíš mít

public function getPageBySlug($slug) {
    return $this->findAll()->where("slug", $slug)->fetch();
}
wicked
Člen | 290
+
0
-

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)

Tabetha
Člen | 140
+
0
-

podľa všetkého, to voláš funkciu

<?php
$this->getPageBySlug($slug)
?>

čo je v danom kontexte presenter, a ty potrebuješ volať funkciu modelu, takže asi skôr takto

<?php
$p = $this->page->getPageBySlug($slug);
?>

Editoval Tabetha (5. 6. 2014 9:09)

wicked
Člen | 290
+
0
-

Jasné … jsem po ránu asi trošku debilní …

Děkuji všem :-)