Strukutra složeku u cms použití submodulu, nebo jen presenteru?
- plasmo
- Člen | 66
Stavím cmsko v nette a používám klasicky modul pro Front a Admin a dále se chci zeptat. Pokud mám v Adminu kategorii nastavení a pod ní x dalších položek. Mám udělat Nastavení jako presenter, který bude mít x akcí, nebo radši jako submodul Adminu a v něm jednotlivé presentery pro všechny části nastavení CMSka? Děkuji :)
BTW: Vím že se to tu několikrát řešilo, ale jako na potvoru když to hledám nemůžu to najít :)
- Blizzy
- Člen | 149
Záleží na tom, jak rozsáhlé je to nastavení a jak se bude rozšiřovat. Já když jsem to naposledy řešil, dal jsem to do presenteru.
Submodul je zřejmě robustnější řešení, ale možná je to zbytečná předčasná optimalizace, pokud v nastavení bude pět věcí…
Editoval Blizzy (24. 10. 2010 23:01)
- plasmo
- Člen | 66
Aha, mno a mohu se zeptat jak potom nastavit routy? Tak aby mi adresa fungovala stylem
/admin/submodul/presenter/akce/id
zkoušel jsem tohle:
$router[] = new Route('admin/<submodule>/<presenter>/<action>/<id>', array(
'module' => 'Admin',
'submodule' => 'Default'
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
ale při tvorbě url přes
{plink :Admin:Settings:Users:Add} // modul:submodule:presenter:akce
to tvořilo následující url:
/admin/settings/user.add/
- Filip Procházka
- Moderator | 4668
snaž se v Presenterech využívat akci „default“ potom budeš mít hezčí url :)
nic jako submodule AFAIK neexistuje
$router[] = new Route('admin/<submodule>/<presenter>/<action>/<id>', array(
'module' => 'Admin:Default', // takhle se dělá submodul
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
- plasmo
- Člen | 66
HosipLan napsal(a):
snaž se v Presenterech využívat akci „default“ potom budeš mít hezčí url :)
nic jako submodule AFAIK neexistuje
$router[] = new Route('admin/<submodule>/<presenter>/<action>/<id>', array( 'module' => 'Admin:Default', // takhle se dělá submodul 'presenter' => 'Default', 'action' => 'default', 'id' => NULL, ));
Aha a potom co s složek týče,
/App/AdminModules/Default/DefaultPresenter.php atd…?
- plasmo
- Člen | 66
Tak to zkouším a objevil se mi tu problém. Strukturu mám následující: Orázek
Routy mám nastaveny takto:
$router[] = new Route('admin/<submodule>/<presenter>/<action>/<id>', array(
'module' => 'Admin:Hlavni',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Frontend',
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
Pokud zavolám administraci na adrese http://localhost/…_root/admin/
Vyskočí tato chyba:
Cannot load presenter 'Frontend:Admin', class 'Frontend_AdminPresenter' was not found in '/var/www/genesiscms-eshop/document_root/../app/FrontendModule/presenters/AdminPresenter.php'.
Jak zajistím aby tuto adresu bralo jako adresu http://localhost/…dmin/hlavni/ ? Při zavolání této url se mi již objeví nálsedující chyba:
No route for Admin:Login:Default(backlink=f17b)
Struktura modulu Admin vypadá následovně:
AdminuModule
- HlavniModule //submodul
- models
- presenters //zde mám umístěn LoginPresenter
- templates
Kód souboru Admin_Hlavni_DefaultPresenter vypadá takto:
<?php
final class Admin_Hlavni_DefaultPresenter extends Admin_BasePresenter
{
public function startup()
{
parent::startup();
$user = Environment::getUser();
if (!$user->isLoggedIn()) {
if ($user->getLogoutReason() === User::INACTIVITY) {
$this->flashMessage('Uplynula doba neaktivity! Systém vás z bezpečnostních důvodů odhlásil444.', 'warning');
}
$backlink = $this->getApplication()->storeRequest();
$this->redirect(':Admin:Login:Default', array('backlink' => $backlink)); //zde se bude asi jednat o správné nastavení cesty
}
else {
if (!$user->isAllowed($this->reflection->name, $this->getAction())) {
$this->flashMessage('Pro vstup do této sekce nemáte potřebné oprávnění!', 'warning');
$this->redirect(':Admin:Login');//zde se bude asi jednat o správné nastavení cesty
}
}
}
public function actionLogout()
{
Environment::getUser()->logout();
$this->flashMessage('Právě jste byl úspěšně odhlášen.');
$this->redirect(':Admin:Login');
}
}
Prosím, kde dělám ještě chybu, nebo co mám upravit? Děkuji
- plasmo
- Člen | 66
Tak jsem se v tom vrtal a routy upravil takto:
$router = $application->getRouter();
$router[] = new Route('index.php', array(
'presenter' => 'Homepage',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('admin/<submodule>/<presenter>/<action>/<id>', array(
'module' => 'Admin:Hlavni',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
$router[] = new Route('admin/<presenter>/<action>/<id>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Frontend',
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
Následně i Admin_Hlavni_DefaultPresenter.php takto:
final class Admin_Hlavni_DefaultPresenter extends Admin_BasePresenter
{
public function startup()
{
parent::startup();
$user = Environment::getUser();
if (!$user->isLoggedIn()) {
if ($user->getLogoutReason() === User::INACTIVITY) {
$this->flashMessage('Uplynula doba neaktivity! Systém vás z bezpečnostních důvodů odhlásil444.', 'warning');
}
$backlink = $this->getApplication()->storeRequest();
$this->redirect(':Admin:Login:', array('backlink' => $backlink));
}
else {
if (!$user->isAllowed($this->reflection->name, $this->getAction())) {
$this->flashMessage('Pro vstup do této sekce nemáte potřebné oprávnění!', 'warning');
$this->redirect(':Admin:Login:');
}
}
}
}
Nyní při přístupu do adminu končím na:
Tato stránka obsahuje smyčku přesměrování.
Webová stránka na adrese http://localhost/genesiscms-eshop/document_root/admin/login/?backlink=9a31 provedla příliš mnoho přesměrování. Chcete-li tento problém vyřešit, zkuste vymazat soubory cookie pro tento web nebo povolit soubory cookie třetích stran. Pokud problém přetrvává, pravděpodobně se jedná o chybu konfigurace serveru a nikoli o problém ve vašem počítači.
Můžu poprosit o nějaké rady? Děkuji
- plasmo
- Člen | 66
To mě taky napadlo, ale nikde jsem tam to přesměrování nenašel. Zde je:
<?php
final class Admin_LoginPresenter extends Admin_BasePresenter
{
/** @persistent */
public $backlink = '';
protected function createComponentLoginForm($name)
{
$form = new AppForm($this, $name);
$form->addText('username', 'Email:')
->addRule(Form::EMAIL, 'Prosím zadejte váš email.');
$form->addPassword('password', 'Password:')
->addRule(Form::FILLED, 'Prosím zadejte heslo.');
$form->addProtection('Prosím odešlete přihlašovací údaje znovu (vypršela platnost tzv. bezpečnostního tokenu).');
$form->addSubmit('send', 'Přihlásit!');
$form->onSubmit[] = array($this, 'loginFormSubmitted');
}
public function loginFormSubmitted($form)
{
try {
$values = $form->values;
if ($values['remember']) {
$this->getUser()->setExpiration('+ 14 days', FALSE);
} else {
$this->getUser()->setExpiration('+ 20 minutes', TRUE);
}
$this->getUser()->login($values['username'], $values['password']);
$this->redirect(':Admin:Hlavni:Default:');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
}