Dynamická routa pro články

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

Zdravím,
problém budu demonstrovat na příkladu:

Databázová struktura článků:

Počítače

--Periferia

---Klávesnice

---Myš

--Komponenty

---HDD

---Procesor

Jde mi o to, jak napsat routu abych mohl použít url: /počítače/komponenty/hdd
Potřebuji to řešit takto, neboť lze mít shodné urlname ⇒ nelze použít /$clanek

Děkuji

Editoval echo (30. 1. 2011 10:58)

h4kuna
Backer | 740
+
0
-

Ahoj, mělo by stačit

<?php
// by být umístěná jako druhá, hned za:  ... Route('index.php', array ...
// možná tam hranatý závorky být nemusí.
$router[] = new Route('pocitace/[<category>/[<subcategory>]]', array(
    Route::PRESENTER_KEY => 'Pocitace',
    Presenter::ACTION_KEY => 'default',
//případně vyplň defaultní hodnoty: category => 'xxx', //ale bacha na duplicitu obsahu, pak by to chtělo ještě jednu routu ONE_WAY
    'id' => NULL,
));

?>

do PocitacePresenter dej

<?php
/** @persistent */
public $category;
/** @persistent */
public $subcategory;
?>

najdes jako

<?php

protected function beforeRender()
{
  dump($this->category);
  dump($this->subcategory);
}

?>

Editoval matata (30. 1. 2011 12:55)

echo
Člen | 134
+
0
-

Myslím, že to nebude řešení na můj problém.
Potřebuji to dynamicky pro n-tý level, takže nemohu takto jednoduše vypsat <category>/<subcategory>.

Napadá mě napsat vlastní router, případně přepsat nějakou metodu. V aplikaci by to mělo vypadat tak, že si stáhnu z url parametr $urldata → pak explode(‚/‘, $urldata) → a postupně od konce vyhledat v databázi příslušný článek.

h4kuna
Backer | 740
+
0
-

tak by mělo stačit

<?php
$router[] = new Route('pocitace/<category .*>', array(
    Route::PRESENTER_KEY => 'Pocitace',
    Presenter::ACTION_KEY => 'default',
    'id' => NULL,
));
?>

a všechno bude v $this->category a na to pužiješ explode()

Editoval matata (30. 1. 2011 13:28)

echo
Člen | 134
+
0
-

Zkouším, ale píše mi to ERROR 404. Zkoušel jsem .* i .*?

h4kuna
Backer | 740
+
0
-

ja to zkoušel a mě to fachčí, dej sem tvuj presenter a jak mas routy po sobe

h4kuna
Backer | 740
+
0
-

teď jsem to ještě vyžkoušel a ta routa jde upravit na

<?php
$router[] = new Route('<presenter pocitace>/<category .*>');
?>

v PocetacePresenter.php mám

<?php
class PocitacePresenter extends BasePresenter{
    /**
     * @persistent
     */
    public $category;

    public function actionDefault()
    {
        dump(explode('/', substr($this->category, 0, -1)));
        exit;
    }

}
?>

Editoval matata (30. 1. 2011 16:50)

echo
Člen | 134
+
0
-

ok, dík za pomoc, už mi to jede. Problém byl, že jsem používal renderDefault namísto actionDefault.

echo
Člen | 134
+
0
-

ještě dotaz, jak s tím operovat? Když se snažím dostat tu proměnnou mimo actionDefault, vyhodí err404

h4kuna
Backer | 740
+
0
-

hm… taky mi to dělá jediné co jsem našel tak do presenteru jsem přidal

<?php
public $autoCanonicalize = FALSE;//špatné řešní, nekopíruj
?>

ale nevěřím tomu že to je nejlepší způsob, pač mi pak zlobilo generování odkazů.

Nevím proč to neprojde kontrolou. Možná jsem zapomněl něco k routam přidat.

Musí někdo další poradit.

Editoval matata (30. 1. 2011 18:46)

h4kuna
Backer | 740
+
0
-

Našel jsem při vykonání metody v Presenter::canonicalize() porovnává

http://127.0.0.1/…tace/kolo%2F === http://127.0.0.1/…ocitace/kolo

myslím že se někde nechá nastavit, aby přidaval nebo nepřidával poslední lomítko, nevím kde jsem to viděl

taky je potřeba do routy přidat

Presenter::ACTION_KEY ⇒ ‚default‘,


EDIT
tak jsem to našel a upravil jsem routu, přidal lomítko nakonec

<?php
$router[] = new Route('<presenter pocitace>[/<category .*>/]', array(
    Route::MODULE_KEY => 'Front',
    'action' => 'default'
));
?>

tak to maká dobře, ale pořád mi to blbě generuje odkazy :( a teď už fakt nevím


EDIT 2
tak to taky nejde pač když máš url pocitace/xxx/yyy, tak to zvýrazněné lomítko encoduje na %2F

Editoval matata (30. 1. 2011 18:50)

cuga
Člen | 210
+
0
-

ja sem hodil do bootstrapu tohle

Route::addStyle('url', NULL);
Route::setStyleProperty('url', Route::PATTERN, '.*?');

...

$router[] = new Route('<url>', array(
    'presenter' => 'Default',
    'action'    => 'view'
));

a pak v actionView si exploduju url a rozhoduju se ktery renderXYZ pouzit

jansfabik
Člen | 193
+
0
-

ten problém s %2F jde vyřešit takto:

<?php

$router[] = new Route('<presenter pocitace>/<category>', array(
        Route::MODULE_KEY => 'Front',
        'action' => 'default',
	'category' => array(
		Route::PATTERN => '.*',
		Route::FILTER_IN => function ($uri) { return $uri; },
		Route::FILTER_OUT => function ($uri) { return $uri; },
		Route::VALUE => ''
	)
));
?>
jansfabik
Člen | 193
+
0
-

PS: a pokud tam nechceš mít to lomítko na konci URL, tak změň Route::PATTERN na '.*?'

h4kuna
Backer | 740
+
0
-

@echo Route::MODULE_KEY ⇒ ‚Front‘, to si odstraň mě se to tam připletlo omylem :) Jak jsem to u sebe zkoušel.

bojovyletoun
Člen | 667
+
0
-

function ($uri) { return $uri; } lze nahradit za null , viz: