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());
		}
    }
}