2009-03-23 26 views
11

Soy relativamente nuevo en MVC y Zend Framework. Habiendo dicho eso, siento que me es difícil descifrar dónde pertenecen los Formularios en mi estructura de directorios. Tengo una estructura de directorio modular, así que no sé si debería haber un único directorio de formularios, o uno dentro de cada directorio de módulos.Uso de formularios con Zend Framework

/application 
    /modules/ 
     /default 
      /controllers 
      /views 
     /admin 
      /controllers 
      /views 

Una vez que haya decidido un directorio para formularios, ¿establece ese directorio en la ruta include del programa de arranque? ¿O incluye el formulario en el controlador en el que se está utilizando?

¿Cómo se forma usted formas de uso con el Zend Framework?

Respuesta

11

Es un poco tarde, pero en la versión actual de este ZF ha sido resuelto:

En la página siguiente http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html El manual:

30.3.2. El Autoloader de recursos de módulo Zend Framework se envía con una implementación concreta de Zend_Loader_Autoloader_Resource que contiene asignaciones de tipos de recursos que cubren la estructura de directorios recomendada por defecto para las aplicaciones de Zend Framework MVC. Este cargador, Zend_Application_Module_Autoloader, viene con las siguientes asignaciones:

api/   => Api 
forms/  => Form 
models/  => Model 
    DbTable/ => Model_DbTable 
plugins/  => Plugin 

A modo de ejemplo, si tiene un módulo con el prefijo "Blog_", y el intento de crear una instancia de la clase "Blog_Form_Entry", que se vería en el subdirectorio "forms /" del directorio de recursos para un archivo llamado "Entry.php". Al usar bootstraps de módulo con Zend_Application, se creará una instancia de Zend_Application_Module_Autoloader por defecto para cada módulo discreto, lo que le permite cargar automáticamente los recursos del módulo.

Esto, sin embargo, requieren el uso de Zend_Application herramienta de comando

+0

¡Es bueno saberlo! No me he mantenido actualizado con los cambios recientes, por lo que es útil saber que esto se ha abordado en las versiones actuales. – Andrew

+0

justo lo que estaba buscando. Fui a la ruta modelo/formularios y actualmente estoy refacturando mi estructura para alinearla con las normas/recomendaciones de zend. – rvdavid

2

A partir de marzo de 2009, los líderes de pensamiento de ZF todavía parecen estar debatiendo las mejores formas de organizar todo. Hay un scaffolding-generator as a part of Zend_Tool programado para su lanzamiento en ZF v1.8. Actualmente está en la incubadora, lo intenté la semana pasada y funciona, pero no hay muchos componentes generados en su estado actual.

A partir de los ejemplos que he visto parece que se manejan mejor por separado a partir de los modelos con los que interactúan (esto es de Zend Framework En Acción):

/application 
    /modules/ 
     /default 
      /controllers 
      /forms 
       ContactForm.php 
       LoginForm.php 
       RegisterForm.php 
       SupportForm.php 
      /models 
       Comment.php 
       User.php 
       Users.php 
      /views 
     /admin 
      /controllers 
      /views 

Sin embargo, también he visto estructurada con los formularios debajo del directorio modelo. Mateo Weier O'Phinney muestra cómo use them for validation on models mismos:

/application 
    /modules/ 
     /default 
      /controllers 
      /models 
       Comment.php 
       User.php 
       /Form 
        Comment.php 
        Login.php 
        Register.php 
      /views 
     /admin 
      /controllers 
      /views 

para tener sus archivos de forma automática incluida asegúrese de asignar nombres a las clases utilizando el modelo de subrayado.

Por ejemplo, cuando Zend_Loader ve

class RegisterController extends Zend_Controller_Action 

Se ve en el include_path de PHP para:

Zend/Controller/Action.php 

Del mismo modo, suponiendo que la primera estructura anterior, si incluimos el módulo de 'default' en nuestro include_path:

# bootstrap.php 
$rootDir = dirname(dirname(__FILE__)); 
define('ROOT_DIR', $rootDir); 
set_include_path(get_include_path() 
    . PATH_SEPARATOR . ROOT_DIR . '/library/' 
    . PATH_SEPARATOR . ROOT_DIR . '/application/modules/default/' 
); 
include 'Zend/Loader.php'; 
Zend_Loader::registerAutoload(); 

el nombre de su clases:

Forms_ContactForm 
Models_User 

Algunos programadores eligen poner la mayor parte de sus archivos en la biblioteca para que no se tienen que añadir el suplemento incluyen rutas de acceso:

/library 
    /My 
     /Form 
      Contact.php 

Suponiendo que la carpeta de la biblioteca se incluye, la clase anterior sería llamado:

My_Form_Contact 

Best of luck! -Matt

+0

He añadido algunas notas adicionales en la respuesta anterior. Déjeme saber si usted tiene preguntas. –

+0

El problema con este método es que debe agregar cada directorio de módulo al include_path. Y también Forms_ContactForm parece redundante y feo. – leek

+0

Acepto completamente, esa estructura de carpetas particular se usó con declaraciones include (no destinadas para Zend Loader). Y en cualquier caso, su sugerencia es de hecho mucho más elegante. :) –

1

Personalmente, me resultó más fácil poner mi directorio de módulos en la ruta de inclusión y nombrar mis clases de formulario en el patrón Zend Loader.

estructura de directorios de ejemplo (copia de la respuesta Matt 's):

/application 
    /modules/ 
     /default 
      /controllers 
      /forms 
       Contact.php 
       Login.php 
       Register.php 
       Support.php 
      /models 
       Comment.php 
       User.php 
       Users.php 
      /views 
     /admin 
      /controllers 
      /views 

Ejemplo nombres de clase formulario:

Default_Forms_Contact 
Default_Forms_Login 
Default_Forms_Register 
Default_Forms_Support 

nombro mis modelos y complementos de manera similar a mantener las cosas simples.

Espero que este problema se aborde correctamente en las versiones posteriores de Zend Framework.

ACTUALIZACIÓN: Esta estructura no funciona en las plataformas * nix. ¡Encuéntralo por la vía difícil! Zend Loader necesita que las carpetas de módulos, formularios y modelos se capitalicen para trabajar en un entorno sensible a las mayúsculas y minúsculas.

+0

Solo para tener en cuenta: también creo que '{Module} _Forms_ {Name}' es feo también. – leek

-1

Puse todos mis modelos en una carpeta de la biblioteca. La noción es el nombre de mi compañía.

/application 
/modules/ 
    /default 
     /controllers 
     /views 
    /admin 
     /controllers 
     /views 
/libray/ 
    /Zend 
    /Notion 
     /Form 

Esto hace que sea fácil de incluir y encontrar archivos ya que la carpeta de la biblioteca está incluida.

Notion_Form_Login 
Notion_Db_Manager_Login 
+1

¿Qué sucede si tiene formularios diferentes para diferentes módulos? – rvdavid

1

personalmente me gusta mantenerlos en mi carpeta de la aplicación, ya que no pienso que pertenecen en la biblioteca y tener una sola carpeta hace que sean más fáciles autoloading.

/application 
/forms 
/modules/ 
    /default 
     /controllers 
     /views 
    /admin 
     /controllers 
     /views 
/libray/ 
    /Zend 

y acabo de agregar la ruta del formulario al includes_path y estoy listo para continuar.

1

el Zend puede crear formularios para que:

ZF crear ventas forma de productos

donde las ventas es el nombre del módulo, la herramienta de comando crea un formulario de directorio dentro de las ventas del módulo y un archivo Producto.PHP con una clase:

class sales_Form_Product extends Zend_Form { 

y hay que agregar una definición de de Zend_Application_Module_Autoloader, para definir el directorio de su módulo de

4

añadir esto en la aplicación/módulos archivo/yourmodule/Bootstrap.php.

class Yourmodule_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

protected function _initAutoload() 
    { 
     $autoloader = new Zend_Application_Module_Autoloader(array(
      'namespace' => 'Yourmodule_', 
      'basePath' => APPLICATION_PATH .'/modules/yourmodule', 
      'resourceTypes' => array (
       'form' => array(
        'path' => 'forms', 
        'namespace' => 'Form', 
       ), 
       'model' => array(
        'path' => 'models', 
        'namespace' => 'Model', 
       ), 
      ) 
     )); 
     return $autoloader; 
    } 

} 
0
$selectexamname = new Admin_Form_examresults_Selectexamname(); 
     $this->view->selectexamname = $selectexamname; 

su clase debería tener que definir de acuerdo con este formato

class Admin_Form_examresults_Selectexamname extends Zend_Form {}