2011-05-13 9 views
5

Estoy buscando maneras de implementar un sistema de módulos en mi marco de aplicación, los módulos serían archivos de clase que cambiarían el diseño de alguna manera para que se integrara automáticamente con la intervención del usuario.Creación de un sistema de módulos dentro de un marco

Mi marco es un marco construido a medida, pero es muy similar a codeigniter, solo un poco más ligero.

La idea que tengo es dentro de los archivos de plantilla es invocar el módulo de posiciones, y tienen módulos de auto carga y se analiza

<html> 
    <head> 
     <title>Welcome to my site</title> 
    </head> 
    <body> 

      <header> 
       .... 
       <?php $this->call_modules('header') ?>; 
      </header> 

      <section> 

       <aside> 
        <?php $this->call_modules('sidebar') ?>; 
       </aside> 

      </section> 

    </body> 
</html> 

Así que los siguientes módulos conseguirían llamado y el contenido entraría ahí lugar:

/system/applications/admin/modules/header/a.php 
/system/applications/admin/modules/header/b.php 
/system/applications/admin/modules/sidebar/a.php 
/system/applications/admin/modules/sidebar/b.php 

Así que me parece que funcionaría bien, pero el problema es que nunca he construido un sistema de módulo antes, y me siento ya que estos son más clasificados como ganchos.

En mi cabeza Básicamente quiero un sistema simple que consiste en 1 archivo de clase, y las plantillas, si es necesario, el archivo calss probablemente se vería así:

class Module_HelloWorld extends Module 
{ 
    public static function info() 
    { 
     return array(
      'name' => 'Hello Word', 
      'version' => '1.0.0', 
      'description' => 'Dispalys "hello World"', 
      'author' => 'Robert Pitt', 
     ); 
    } 

    public function execute($context,$action) 
    { 
      //$context would be the current view at the point of execution for the view 

      //$action would be header/sidebar 
    } 
} 

Así que mi pregunta en pocas palabras, ¿cuál sería ser la mejor manera de diseñar un sistema de módulos para mi framework, permitiendo que los módulos de 3Rd party sean eliminados dentro de un directorio y luego instalados desde el administrador, sin mucha intervención del usuario?

Respuesta

3

buena suerte con su mvc y cms. He implementado el mismo pensamiento hace algún tiempo, mi enfoque fue simple, el primero se me ocurrió.

  1. Base su sistema en páginas y módulos (widgets).
  2. La información de las páginas se guarda en la tabla de la base de datos, por ejemplo, "páginas".
  3. Un módulo (widgets) es una clase que contiene metadatos (definición) y lógica de negocios.
  4. Si agrega un módulo a una página, su información específica se guarda en la base de datos.
  5. La próxima vez, si desea tener su instancia, solo pase los parámetros relacionados a su clase y la tiene.
  6. Para que pueda usar la definición única de un módulo en diferentes lugares y para diferentes instancias.
  7. Puede agregar tantas páginas en la base de datos.
  8. El usuario puede agregar tantos widgets en una sola página.
+0

Gracias por su respuesta, veré lo que puedo encontrar más tarde, aunque el almacenamiento de la base de datos no es la ruta que quiero bajar. – RobertPitt

+0

@RobertPitt, puede funcionar para su escenario tener una correspondencia uno-a-uno entre una clase y un módulo, pero la base de datos funcionó para mí. –

1

No estoy seguro de si esto ayudaría, pero para mí quería un marco que pudiera ampliar con funcionalidades en términos de módulos cuando fuera necesario pero con la cantidad mínima de interacción de base de datos en términos de almacenamiento de información sobre el módulo. Así que tengo una configuración donde tengo módulos en carpetas con archivos para configuración, css, js y la clase real que tienen que seguir convenciones de nomenclatura muy específicas. Al agregar un modulo, necesito agregar la carpeta y luego actualizar una lista de módulos en la configuración base de marcos.

Uno de los ajustes designa la (s) página (s) para la que se debe cargar el módulo. Si el módulo es requerido en cada página, entonces es un (*). El controlador base de mi marco verifica la lista de módulos y luego verifica la configuración de la página para que el módulo vea si debe cargarse.

Mi marco muestra la página cargando una plantilla en el búfer de salida y almacenándola en una var pública a la que se puede acceder mediante cualquier código en todo el marco. Entonces, simplemente puedo usar str_replace para identificar las secciones que necesitan cargarse (por ejemplo, hay una etiqueta de interfaz en la plantilla que designa el contenido principal de la página) y luego reemplazar con el contenido del módulo. Entonces, un módulo de galería reemplazaría la etiqueta de interfaz con la galería en la página de la galería, mientras que un módulo de artículo produciría un artículo sobre la etiqueta de interfaz en la página de artículos.

Aunque no lo hago, creo que la mayoría de la gente usa etiquetas inteligentes para los reemplazos.

Creo que esto funciona bien cuando necesita un marco que está utilizando personalmente para entregar sitios a los clientes. Esto probablemente no funcionaría tan bien si diferentes personas necesitan poder usar su marco.

Cuestiones relacionadas