Preguntas CodeIgniter y HMVC
themes frontend (1)
Simplemente abre o crea core/MY_Controller.php
, crea una clase MY_Controller
y MY_Controller
que extienda MX_Controller
, luego en el mismo archivo crea tus otros controladores base y MY_Controller
extiendan MY_Controller
. Aquí hay un ejemplo que puede copiar / pegar para comenzar:
<?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 */
En cuanto a "temas múltiples", no estoy seguro de lo que necesita. Hojas de estilo? Plantillas HTML? ¿Necesita que los usuarios los cambien o lo hará manualmente? ¿Necesita detectar dispositivos móviles y cambiar el tema en consecuencia? Todas las anteriores? La "mejor" manera dependerá de su implementación.
Estoy pensando en crear 2 bibliotecas desde MY_Controller.php y auto cargarlas. ¿Eso funcionará?
No estoy seguro de por qué necesitarías o quieres ... simplemente no lo hagas. Solo debe extender estas clases con otros controladores.
Sobre los temas, quiero tener múltiples temas para vistas como: - /views/theme1/view_files.php - /views/theme2/view_files.php Sobre js / css / images, puedo arreglarme. Al principio voy a arreglar el tema, pero más tarde, puedo permitir que el usuario elija. Con MVC, puedo poner temas en subcarpetas de / views / como arriba pero con HMVC, tengo que encontrar otra manera de organizarlos en temas porque las carpetas de vista están separadas (quiero que todos los archivos de vista del mismo tema estén en solo 1 carpeta)..
Dado que esta es una pregunta demasiado amplia para abordar aquí, y parece que aún no ha intentado nada, le daré un ejemplo mínimo :
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/
}
}
Desde tu controlador:
$this->load->view(''themes/''.$this->theme.''/my_view_file'');
Usando HMVC, el archivo siempre se buscará en el módulo actual, luego volverá a los directorios de la aplicación predeterminada si no existe. Si por alguna razón necesita ser explícito, puede decir anteponer la ruta con el nombre del módulo (como para cargar recursos entre módulos). Ejemplo:
// From "blog" module
$this->load->view(''events/index'');
// We just loaded `modules/events/views/index` from the blog module
De todos modos, esta no es una solución completa, pero espero que te haga comenzar con una idea. Hay millones de formas de hacerlo, aquí hay dos bibliotecas de plantillas que ya son compatibles con los temas:
Antes que nada, disculpe la conveniencia de esta publicación porque esta es la primera vez que publico una pregunta aquí y necesito más tiempo para acostumbrarme a esto.
Q1. Quiero crear 2 "controladores maestros" para FrontEnd y BackEnd de esta manera:
- MY_Controller extiende CI_Controller
- FrontEnd extiende MY_Controller y todos los controladores de frontend extenderán FrontEnd .
- BackEnd extiende MY_Controller y todos los controladores backend extenderán BackEnd .
¿Cuál es la mejor manera de hacerlo con HMVC (MX)?
Gracias @Wesley Murch por dar la idea de poner 3 clases MY_Controller, Frontend, Backend en MY_Controller.php pero creo que poner cada clase en un archivo php es mejor (más limpio). ¿O estoy equivocado? Estaba pensando en crear una estructura como esta:
- ./core/MY_Controller.php (extiende MX_Controller)
- ./libraries/Backend.php (extiende MY_Controller)
- ./libraries/Frontend.php (extiende MY_Controller)
- Carga automática de Backend y Frontend en autoload.php
- Todos los controladores de frontend extenderán Frontend (Ej: el
class Blog extends Frontend
) - Todos los controladores de back-end extenderán Backend (Ej: la
class Admin extends Backend
)
¿ Funcionará eso sin poner una línea más de código en los controladores backend / frontend a include_once o require_once : ./libraries/Backend.php o ./libraries/Backend.php ?
Q2. ¿Cómo implementar múltiples temas con HMVC? Por ejemplo, en MVC, podemos tener 2 temas estructurados de esta manera:
- ./application/views/ theme1 /view_files.php
- ./application/views/ theme2 /view_files.php
Pero en HMVC, las carpetas de vistas están dentro de carpetas separadas y si quiero implementar múltiples temas, normalmente tengo que hacer esto:
- ./application/modules/ module1 / views / theme1 /view_files.php
- ./application/modules/ module1 / views / theme2 /view_files.php
- ./application/modules/ module2 / views / theme1 /view_files.php
- ./application/modules/ module2 / views / theme2 /view_files.php
Eso no es lo que quiero porque quiero poner todas las vistas del archivo de un tema en una sola carpeta y más adelante, si quiero crear un nuevo tema, necesitaré duplicar una sola carpeta de temas. Pero me pregunto cómo puedo hacerlo sin romper los modelos HMVC (porque, hasta donde yo sé, en el modelo HMVC, Modelos, Vistas, los Controladores deben estar en una carpeta de módulo, al menos con CI). Ese es el conflicto en el que me estoy atascando.