Strukutra složeku u cms použití submodulu, nebo jen presenteru?

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

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

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)

Filip Procházka
Moderator | 4668
+
0
-

čím míň akcí v presenteru tím lépe :)

plasmo
Člen | 66
+
0
-

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

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

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…?

Aurielle
Člen | 1281
+
0
-

root/app/AdminModule/DefaultModule/DefaultPresenter.php

plasmo
Člen | 66
+
0
-

gmvasek napsal(a):

root/app/AdminModule/DefaultModule/DefaultPresenter.php

Ok, děkuji :-) Zkusím to a pohraju si s tím.

Když už jsme u těch modulů. Jak nejlépe řešit zásuvné moduly?

plasmo
Člen | 66
+
0
-

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

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

jansfabik
Člen | 193
+
0
-

mohl bys ukázat ještě Admin_LoginPresenter, řekl bych že tam někde přesměrovává sám na sebe

plasmo
Člen | 66
+
0
-

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

}
Aurielle
Člen | 1281
+
0
-

Kde máš nějakou render/action metodu?

plasmo
Člen | 66
+
0
-

Nemám, měl jsem za to, že pokud jé prázdná tak se nemusí definovat, nebo jo? Zatím mi to tak funguje u ostatních webů :)

Aurielle
Člen | 1281
+
0
-

Tak dej ještě kód BasePresenteru, nic víc mě už nenapadá…

HanziQ
Člen | 16
+
0
-
<?php
$router[] = new Route('admin/<submodule>/<presenter>/<action>/<id>', array(
    //                         ^^ spíš module než submodule, ne?
    'module' => 'Admin:Hlavni',
     ...
?>
Aurielle
Člen | 1281
+
0
-

Vypadá to, že to odchytla až ta třetí routa, ale je to určitě dobrý postřeh, nevím kde lidi ty submodule pořád berete…

plasmo
Člen | 66
+
0
-

sub module jsem odchytl na fóru, nyní se dostavám do problémů kdy aplikace hledá /app/LoginModule/ místo /app/admin/presenter/LoginPresenter.php

provedl jsem změnu z submodule ⇒ module v route