Jak identifikovat stránku v databázi
- Milanov
- Člen | 51
Zdravím. Dříve jsem měl všechny stránky v databázi a identifikoval je podle URL a všechny požadavky jsem přesměrovával na url.php?url=… Kontroloval jsem podle toho oprávnění a mohl mít ke každé stránce komentáře. Rád bych požil Nette, ale narazil jsem, protože detekci podle URL nemohu použít. Napadlo mě stránku identifikovat podle dvojice Presenter-View v presenteru nejvyšší úrovně. Neřešili jste někdo podobný problém? A jak jste ho vyřešili vy? Díky
- _Martin_
- Generous Backer | 679
Ahoj, jestli dobře rozumím tvému požadavu, chceš mít na každé
stránce možnost komentářů, ale může jít o stránky různých
presenterů a akcí? V tom případě by bylo nejjednodušší použít klíč
ve stylu presenter/action
(případně
presenter/action/id
), který můžeš ukládat
do DB.
Pokud by ty stránky byly všechny podobné (šlo by například jen o zobrazování textů z DB), pak by stálo za zvážení používat jen jeden presenter s výchozí akcí a tomu předávat ID článku (nebo URL, záleží na tom, zda bys použil vlastní router) – a komentáře ukládat do DB podle ID článku.
- Patrik Votoček
- Člen | 2221
Moc jsem nepochopil jak přesně to myslíš? Zkus se malinko víc rozepsat.
Ale jinak já pro autorizaci použivám toto:
<?php
class AuthBasePresenter extends BasePresenter
{
public function startup()
{
$user = Environment::getUser();
if (!$user->isAuthenticated())
{
if ($user->getSignOutReason() === User::INACTIVITY)
{
$presenter->flashMessage("Automatické odhlášení po dlouhé neaktivitě", "error");
}
$presenter->redirect(':Auth:login', array('backlink' => $presenter->getApplication()->storeRequest()));
}
$signal = $presenter->getSignal();
if (!empty($signal))
$signal = $signal[1];
if (!$user->isAllowed($presenter->getRequest()->getPresenterName(), $presenter->getView()))
throw new AuthorizatorException("Nemáte dostatečná oprávnění pro [".$presenter->getRequest()->getPresenterName().":".$presenter->getView()."]");
if (!empty($signal) && !$user->isAllowed($presenter->getRequest()->getPresenterName(), "signal_".$signal))
throw new AuthorizatorException("Nemáte dostatečná oprávnění pro [".$presenter->getRequest()->getPresenterName().":".$signal."!]");
}
}
?>
Do Permission ukládám data ve formátu Role ⇒ Klasicky (Admin, User adt.), Resource ⇒ PresenterName nebo ModuleName.„:“.PresenterName, Privilege ⇒ ActionName nebo „signal_“.SignalName .
- PetrP
- Člen | 587
Milanov napsal(a):
… protože detekci podle URL nemohu použít…
Jestli se jedná o dotaz „detekce“ url, tak máme následující možnosti. (když detekcí rozumím převedení url na id)
1] jedná li se o hodně složitou detekci tak napsat si vlastní router: na fóru najdeš pár témat co to řeší. Ale jen v případě že by nešli další možnost.
2] použít SimpleSeoRouter od Jana Tvrdíka
- popis jak ho „nastavit“ je v odkazovaném vlákně.
- má pár nevýhod, ale možná pro tvoje použití bude nejlepší
3] použít překladový slovník:
- nevýhoda je že ti takováto routa schramstne cokoli (takže jich nemůžeš mít více bez nějakého prefixu)
class SeoUrl extends Object
{
public function getId($url)
{
// zištovaní url v databaze, případně vyřešit cachování atd...
return (int) $id;
}
public function getUrl($id)
{
//...
return $url;
}
}
Route::addStyle('adr', NULL);
Route::setStyleProperty('adr', Route::PATTERN, '.*');
$seoUrl = new SeoUrl;
Route::setStyleProperty('adr', Route::FILTER_OUT, array($seoUrl,'getUrl'));
Route::setStyleProperty('adr', Route::FILTER_IN, array($seoUrl,'getId'));
$router[] = new Route('<adr>', array(
'adr' => NULL,
'presenter' => 'Default',
'action' => 'default',
));
4] Při malém množství adres mít pro každou presenter (přibližně to co píšeš)
- dá se použít jen při malém počtu
$router[] = new Route('<presenter (kontakt|historie)>', array(
'presenter' => 'Default',
'action' => 'default',
));
Editoval PetrP (27. 5. 2009 11:03)