Dynamická routa pro články
- echo
- Člen | 134
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
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
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
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)
- h4kuna
- Backer | 740
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
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
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
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 => ''
)
));
?>