Jak identifikovat stránku v databázi

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

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

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

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 .

Milanov
Člen | 51
+
0
-

Některé stránky mají text v DB, některé ne. Např.:

  • Hlavní stránka – DB
  • Historie – DB
  • Kontakt – DB
  • Činnosti – ne DB
    • jednotlivé činnosti – ne DB (činosti mají extra tabulku)
  • Správa – ne DB
    • jednotlivé stránky správy – ne DB

Každopádně všechny stránky mají titulek uložený v DB.

_Martin_
Generous Backer | 679
+
0
-

Milanov napsal(a):

Každopádně všechny stránky mají titulek uložený v DB.

A na základě čeho ví jaká stránka, který titulek jí patří? Nějaké ID? A nebo právě o vyřešení tohohle ID jde?

PetrP
Člen | 587
+
0
-

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)