2011-07-22 18 views
7

Przede wszystkim, przepraszam za wszelkie wygody spowodowane tym postem, ponieważ po raz pierwszy zamieszczam tutaj pytanie i potrzebuję więcej czasu na przyzwyczajenie się do tego.Pytania CodeIgniter i HMVC

Q1. Chcę utworzyć 2 "kontrolerów master" dla frontend i backend jak ten:

  • MY_Controller rozciąga CI_Controller
  • FrontEnd rozciąga MY_Controller a wszystkie kontrolery interfejsu internetowego rozszerzy FrontEnd.
  • backend rozciąga MY_Controller i wszystkie sterowniki backend rozszerzy backend.

Jaki jest najlepszy sposób, aby to zrobić z HMVC (MX)?

Dzięki @Wesley Murch za udzielenie pomysłu na umieszczenie 3 klas MY_Controller, Frontend, Backend do MY_Controller.php, ale myślę, że umieszczenie każdej klasy w jednym pliku php jest lepsze (czystsze). Czy ja się mylę? I myślał tworząc strukturę takiego:

  • ./core/MY_Controller.php (wystaje MX_Controller)
  • ./libraries/Backend.php (wystaje MY_Controller)
  • ./libraries/Frontend. php (rozciąga MY_Controller)
  • Auto obciążenie Backend i Frontend w autoload.php
  • Wszystkie kontrolery interfejsu internetowego rozszerzy Frontend (Np: class Blog extends Frontend)
  • Wszystkie sterowniki backend przedłuży Backend (np class Admin extends Backend)

Will że praca bez narażania jeszcze jedną linię kodu w sterownikach backend/frontend do include_once lub require_once: ./libraries/Backend.php lub ./libraries/Backend.php?


Q2. Jak zaimplementować wiele motywów za pomocą HMVC? Na przykład w MVC, możemy mieć 2 tematy strutured tak:

  • ./application/views/ theme1 /view_files.php
  • ./ Application/views/theme2 /view_files.php

Ale w HMVC, widoki folderów wewnątrz oddzielone foldery i jeśli chcę zaimplementować wiele tematów, normalnie mam zrobić tak:

  • ./application/modules/ module1/views/theme1 /view_files.php
  • ./application/modules/ module1/views/motyw 2 /view_files.php
  • ./application/modules/ module2/views/theme1 /view_files.php
  • ./application/modules/ module2/views/theme2 /view_files.php

To nie jest to, czego chcę, ponieważ chcę umieścić plik wszystkich wyświetleń motywu w jednym folderze, a później, jeśli chcę utworzyć nowy motyw, będę musiał skopiować tylko jeden folder tematyczny. Ale zastanawiam się, jak mogę to zrobić bez łamania modeli HMVC (ponieważ o ile mi wiadomo, w modelu HMVC modele, widoki, kontrolery muszą znajdować się w jednym folderze modułów - przynajmniej z CI). To jest konflikt, w który utknąłem.

Odpowiedz

9

Wystarczy otworzyć lub utworzyć core/MY_Controller.php utworzyć klasę MY_Controller i mieć go przedłużyć MX_Controller, a następnie w tym samym pliku tworzyć inne kontrolery bazowych i je przedłużyć MY_Controller. Oto przykład, można skopiować/wklej aby zacząć:

<?php defined('BASEPATH') OR exit('No direct script access.'); 

class MY_Controller extends MX_Controller { 

    public function __construct() 
    { 
     // do some stuff here that affects all controllers 
    } 

} 

class Frontend_Controller extends MY_Controller { 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

} 

class Backend_Controller extends MY_Controller { 

    public function __construct() 
    { 
     parent::__construct(); 
     // Check admin login, etc. 
    } 

} 

/* end file application/core/MY_Controller.php */ 

miarę „wielu tematów” idź, nie wiem, co trzeba. Arkusze stylów? Szablony HTML? Czy chcesz, aby użytkownicy je przełączali, czy zrobisz to ręcznie? Czy musisz wykrywać urządzenia mobilne i odpowiednio zmieniać temat? Wszystkie powyższe? "Najlepszy" sposób będzie zależał od twojej implementacji.

myślę o tworzeniu bibliotek 2 rozciąga się od MY_Controller.php i auto załadować je. Czy to będzie działało?

Nie wiem, dlaczego potrzebujesz lub chcesz ... po prostu nie rób tego. Rozszerzaj te klasy tylko z innymi kontrolerami.

O tematów, chcę mieć wiele tematów dla widoków takich jak: - /views/theme1/view_files.php - /views/theme2/view_files.php O js/css/obrazów, mogę zorganizować sam. Na początku poprawię motyw, ale później mogę zezwolić użytkownikowi na wybór użytkownika: . W MVC mogę umieścić motywy w podfolderach/views/as/ powyżej, ale z HMVC, muszę znaleźć inny sposób rozmieszczenia ich w motywach , ponieważ foldery widoku są oddzielone (chcę, aby wszystkie pliki widoku z tego samego motywu były takie same, jak w przypadku tylko w 1 folderze) ..

Ponieważ jest zbyt szeroka kwestia do rozwiązania tutaj, i nie wydaje się, że jeszcze nawet nie próbował niczego, ja daje gołą minimalną przykład:

class MY_Controller extends MX_Controller { 

    public function __construct() 
    { 
     // do some stuff here that affects all controllers 
     $this->theme = 'theme1'; // matches your directory name in /views/themes/ 
    } 

} 

od kontrolera:

$this->load->view('themes/'.$this->theme.'/my_view_file'); 

Korzystanie HMVC plik zawsze będzie wyglądał w bieżącym module, a następnie powróci do katalogów domyślnej aplikacji jeśli nie istnieje. Jeśli z jakiegoś powodu musisz być jednoznaczny, możesz powiedzieć, że dodajesz ścieżkę do nazwy modułu (np. Do przeładowywania zasobów między modułami). Przykład:

// From "blog" module 
$this->load->view('events/index'); 
// We just loaded `modules/events/views/index` from the blog module 

W każdym razie nie jest to pełne rozwiązanie, ale mam nadzieję, że zaczyna się od pomysłu. Są miliony sposobów, aby to zrobić, tutaj są dwie biblioteki szablonów, które już obsługują tematy:

+0

Dzięki Wesley, nie zrobił tego spróbować, ale to powinno działać. –

+0

Zastanawiam się nad utworzeniem 2 bibliotek rozszerzonych z MY_Controller.php i ich automatycznego załadowania. Czy to będzie działało? O tematów, chcę mieć wiele tematów dla widoków takich jak: - **/views/theme1/view_files.php ** - **/views/theme2/view_files.php ** O js/css/obrazy, umiem się ułożyć. Na początku poprawię motyw, ale później mogę zezwolić użytkownikowi na wybór. W MVC mogę umieszczać motywy w podfolderach **/views/** jak wyżej, ale z HMVC, muszę znaleźć inny sposób rozmieszczenia ich w tematach, ponieważ foldery widoku są oddzielone (chcę, aby wszystkie pliki widoku o tym samym motywie były być tylko w 1 folderze) .. –

+0

Niestety, zapomniałem wymienić zamiast tworzyć 2 klasy w 1 pliku, chcę utworzyć 2 biblioteki Backend i Frontend rozciąga się od MY_Controller i automatycznie ładują Backend i Frontend w plikach konfiguracyjnych. Następnie w kontrolerach, będę rozciągać się w następujący sposób: 'blog klasy rozszerza Frontend' –