Autor Zpráva
MVCJirka
Profil *
Dobrý den, zkouším se naučit MVC a dělám tedka takovou aplikaci. Měl by to být redakční systém, kde bude několik typů administrace administrace pro uživatele, firmy a hlavní administrace.
Zatím to mám udělané tak, že pro každou z nich mám jeden kontroler. takže mám UserAdministrationController, CompanyAdministrationController...
Toto mám ve složce: System/Controller/Admin. tato cesta je i jmenný prostor u kontrolérů: \System\Controller\Admin\UserAdministrationController.
No ale ted mám problém s tím, že v každé té administraci bude hodně možností, hodně formulářů a potřeboval bych to rozdělit do více kontrolérů.
Ted mám url domena.cz/userAdministration a v nové verzi bych chtěl třeba domena.cz/userAdministration/addArticles - zavolal by se kontrolér, který by sloužil pro přidávání článků ale nejdřív by se volal userAdministrationController a ten by vytvářel kontrolery pro všechny akce které tam jsou.
Jasně že by šlo udělat třeba domena.cz/addArticles, ale pak bych potřeboval zabezpečit, aby tento kontrolér šel spustit jenom když budu v uživatelské administraci. navíc v každém takovém kontroléru bych musel přidávat všechny pohledy, které generují stránku. lepší by bylo aby ty kontroléry dědily od hlavního administračního, který vytváří celou administraci.

Jenomže problém je, že třída Router vytváří kontroler pouze z prvního parametru v url, tedy například z userAdministration. Takže ve třídě UserAdministrationController budu muset volat ty další kontrolery, ale to mi nefunguje.

Třída System\Controller\Router:
class Router extends BaseController
{
    protected $controller;

    public function ExecuteAction($params)
    {
       $parseUrl = $this->ParseUrl($params[0]);   
       $c = $this->GetClassName(array_shift($parseUrl));
       $controllerClass = ($c == null ? "HomePageController" : $c."Controller");
       
    /*   if(isset($_SESSION["ID"]))
           $controllerClass = "AdministrationController";
       */
       if(strpos($controllerClass, "Administration") !== false)
               $controllerClass = "Admin/".$controllerClass;
       
       if(strpos($controllerClass, "Registration") !== false)
               $controllerClass = "Reg/".$controllerClass;
       
       if(file_exists("library/System/Controller/". $controllerClass . '.php'))
       {
          if((strpos($controllerClass, "Administration") !== false) || (strpos($controllerClass, "Registration") !== false))
             $controllerClass = "\\System\\Controller\\".  str_replace("/", "\\", $controllerClass);
          else
              $controllerClass = "\\System\\Controller\\".$controllerClass;
          $this->controller = new $controllerClass;
       }
       else{
           header("Location: 404.html");
           exit;
       }
        $this->controller->ExecuteAction($parseUrl);
        
        $header = array("title"=>$this->controller->header["title"], 
            "description" => $this->controller->header["description"],
            "keywords" => $this->controller->header["keywords"]);

        $this->data = $header;
        $this->view[] = "homePage";
}

Třída System\Controller\Administration\UserAdministrationController:
class UserAdministrationController extends BaseController
{
    public function ExecuteAction(params)
    {
        $this->view = array("header", "menu", "content", "footer");
        if(isset($params[0])){ //Pokus o volání třeba addArticlesControlleru - nefunguje
            $controller = "\\System\\Controller\\Admin\\".ucfirst($params[0])."Controller";
            $controller = new $controller;
            $controller->ExecuteAction(array_splice($params, 1)); //Metoda má vkládat formulář do pohledu content, ale nic se nestane
        }
    }
}


Třída System\Controller\Administration\User\AddArticlesController:
class AddArticlesController extends CompanyAdministrationController
{
    public function ExecuteAction($params)
    {
        $this->data["form"] = "addArticlesForm";
    }
}


Pokud by se našel někdo kdo by byl ochotný poradit, nebo měl nějaký kod na ukázku jak se to dá řešit jinak a lépe, budu moc rád. teprve se to učím, tak mi pomůže jakákoliv rada.
Majkl578
Profil
Router rozhodně není kontroler. Router by měl rozhodovat, jaký kontroler bude spuštěn.

Než se to tu zvrhne v nějakou diskusi o tom, jak každý používá něco jiného, vlastního, zeptám se na jednu věc: Nezvažoval jsi použít nějaký framework, který MVC již implementuje? Dle mého je mnohem snazší se principy MVC (na)učit v prostředí, kde jsou věci již implementovány a na tebe zbývá doplnit samotnou aplikační logiku. Z těch kvalitních mohu doporučit například český Nette Framework nebo Symfony 2, existují samozřejmě i další, různých kvalit.
RockFire
Profil
Vzhledem k tomu, že začínáš, doporučuji CodeIgniter. Je jednoduchý, rychle se do něj dostaneš a má výborný tutoriál ve slovenštině.
martin1312
Profil
RockFire:
To síce má, ale jeho využitie OOP mi nepríde veľmi vhodné. Teda osobne v CI programujem, ale keby som si mal vybrať, siahol by som po inom.
Majkl578
Profil
V začátcích bych považoval za důležité kvalitní zdroj/nástroj, tedy souhlasím, že CodeIgniter není zrovna moc vhodný. Již jsem zmínil Nette, které je kvalitní a (ač možná někteří nebudou souhlasit) relativně jednoduché, má českou dokumentaci, české fórum a českou komunitu. Osobně bych jej bez výčitek doporučil člověku, který rozumí objektovému programování, ale k MVC se třeba ještě nedostal.
MVCJirka
Profil *
Také jsem přemýšlel nad použitím nějakého frameworku, ale myslím si, že je lepší se naučit sám vytvářet MVC než se učit používat cizí třídy a metody. aspon to chci zkusit. dělal jsem to podle tutoriálu na devbook.cz ale tam je to spíše pro jednoduché aplikace a já se snažím ten jejich systém trochu rozvinout, ale moc to zatím nejde...


Hledal jsem na netu různý návody, ale vždycky tam řeší pouze jednoduchou aplikaci, to už umím, chci se naučit i vytvářet složitější. Tak kdybyste někdo věděl o nějakým návodu, nebo byl někdo ochotný poradit mi s mým kodem, budu moc rád
Str4wberry
Profil
Reakce na Majkla578:
českou dokumentaci, české fórum a českou komunitu
Což nemusí být zase takové lákadlo. Pokud člověk umí alespoň trochu anglicky, což programátor většinou stejně potřebuje, a rád řeší problémy tak, že se ptá vyhledávače, tak anglická větší komunita může být lepší než malá česká. U Nette lze až nepříjemně často najít jen řešení problému pro jeho starou nekompatibilní podobu, částečné řešení nebo nic.

Reakce na MVCJirku:
ale vždycky tam řeší pouze jednoduchou aplikaci, to už umím, chci se naučit i vytvářet složitější
Tak složitější aplikace je jen skládanka těch jednoduchých aplikací do sebe, ne? :–)
MVCJirka
Profil *
Str4wberry:
To je pravda, ale ve všech řeší třeba jednoduchou situaci: mám třeba url: domena.cz/controller, zavolá se controller předají se data z modelu do pohledu a je hotovo. jasně že to jde rozšířit, ale nevím pořádně jak, potřebuju nějaký nápad. řeším to tak že mám domena.cz/controller/nazev_metody_vcontrolleru, takže mám jeden kontroller na celou administraci a v něm metody jako AddArticles, CreateGallery, ShowGallery, ShowArticles...přitom by mohli být dva kontrollery Articles a Gallery...což udělat umím: domena.cz/acrticles...problém je ten, že ve všech kontrolerech bych musel nastavovat pohledy pro vytvoření stránky, ted mi to dělá jeden kontroler...a přijde mi zbytečný ve všech sestavovat stejnou stránku
Str4wberry
Profil
Protože tohle může řešit ten router. Tomu se dá informace, pro jakou URL se má volat jaká metoda v jakém controlleru (a naopak lze vygenerovat URL pro metodu z controlleru). Mohu si přidat pravidlo, že /articles/123 zavolá metodu showArticles s parametrem 123 v controlleru Admin. Aplikace je tedy na adresách naprosto nezávislá.
MVCJirka
Profil *
No jo, ale jak by ten controller měl vypadat? já tam mám tedka if, že pokud v prvním parametru za doménou je slovo administration, volá se kontroller ze složky controller/administration ale to zrovna není moc pěkné řešení.
Když budu mít domena.cz/userAdministration -> vytvoří se userAdministrationController a sestaví celou stránku administrace.
pak bude doména domena.cz/userAdministration/articles -> vytvoří se ArticleCOntroller ze složky controller/administration/user(user je administrace pro uživatele). navíc názvy složek odpovídají jmenným prostorům. a ten articleController bude dědit z userAdministration, takže vždy bude mít stránku sestavenu a bude ho zajímat pouze vykreslení konkrétního formuláře do pohledu content.phtml...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: