2011-02-04 14 views
5

Tengo un formulario en CakePHP con algunas docenas de campos en él. De todos los ejemplos que he visto, hay un código de formulario duplicado para una vista de agregar y una vista de edición.Cómo reducir la duplicación de código de formulario en CakePHP

¿Hay algún truco para mantener la duplicación? ¿Cuál es el mejor método en CakePHP para esto?

Respuesta

14

Lo que hago, es poner todos los campos del formulario en un elemento, y luego insertar el elemento en el add.ctp y edit.ctp

no se olvide de añadir el campo oculto con el identificador en el edit.ctp

de esta manera todos los elementos visibles están en un archivo, más fácil de mantener.

View/MyModel/add.ctp 
echo $this->Form->create('MyModel'); 
echo $this->element('my_form'); 
echo $this->Form->end(); 

View/MyModel/edit.ctp 
echo $this->Form->create('MyModel'); 
echo $this->Form->input('id'); 
echo $this->element('my_form'); 
echo $this->Form->end(); 

View/Elements/my_form.ctp 
// your form inputs 
// whatever they are 
+1

+1 Me gusta ... – Leo

+0

¡esto funcionó exactamente! ¡El formulario helper + elements lo hace ridículamente fácil! –

+0

Esta solución es tan obvia que es brillante. Lo que significa que debería haber pensado en esto, ¡pero no lo hice! Tomo en serio las advertencias de otros comentaristas: combinar estas formas completamente puede llevar a un desorden de declaraciones que quiero evitar, pero esto obtiene lo mejor de ambas. Dos formas completamente separadas que se superponen más que no es demasiada duplicación para mi gusto, así que este es un truco perfecto para eliminar la mayor parte y facilitar el mantenimiento en el futuro (actualice un formulario, no dos). –

6

He hecho esto antes, pero volví a tener vistas separadas, principalmente por mi propia cordura.

Es bastante fácil de hacer. La edición requiere una entrada para la identificación de registro. Esto usualmente está oculto. Cualquier valor de formulario predeterminado para el formulario de agregar tendrá que estar contenido en condicionales para que los valores almacenados no se sobrescriban con los valores predeterminados cuando está editando un registro

En el lado controlador, necesitará una instrucción condicional para decida si se debe actuar como un agregar o editar dependiendo de si el $this->data['MyModel']['id'] está configurado.

Creo que lo cubre -. Si pienso en otra cosa voy a añadir en

Mi patrón de trabajo tiende a ser la construcción de la vista de edición, a continuación, copiar y pegar para crear la base para el complemento ver.

+0

puede tener un id en una forma complemento – dogmatic69

+0

@dogmatic - Sí, pero no suele ser . En ese caso, tendría que filtrar de otra manera. No estoy sugiriendo una forma genérica de hacer esto. – Leo

7

Usted debe NO fusionar esos puntos de vista, porque añadir/editar son diferentes acciones y merecen ver archivos separados. A medida que su aplicación crezca, se dará cuenta de que es bueno tener vistas separadas para reducir la complejidad de if else conditions.

Si todavía quiere evitar los archivos separados, utilizar

function add() { 
    ..... 
    $this->render('edit') 
} 
0

este código comprobará si tiene admin_form.ctp o form.ctp que hacer que use el mismo código para añadir/editar

https://github.com/infinitas/infinitas/blob/dev/app_controller.php#L389

1,3 somete las formas automáticamente en donde el son de modo que cuando vaya a/edit/1 se publicará allí, y/add publicará para agregar.

eso es todo lo que necesita hacer. si tiene una edición que es muy diferente al complemento, simplemente crea los 2 archivos. cuando quieras lo mismo, solo haz el uno.

0

en su controlador aplicación

public function render($view = null, $layout = null) { 

    $viewPaths = App::path('View', $this->plugin); 
    $rootPath = $viewPaths[0] . DS . $this->viewPath . DS; 
    $requested = $rootPath . $view . '.ctp'; 
    if (in_array($this->request->action, array('admin_edit', 'admin_add', 'edit', 'add'))) { 
     $viewPath = $rootPath . $this->request->action . '.ctp'; 
     if (!file_exists($requested) && !file_exists($viewPath)) { 
      if (strpos($this->request->action, 'admin_') === false) { 
       $view = 'form'; 
      } else { 
       $view = 'admin_form'; 
      } 
     } 
    } 
    return parent::render($view, $layout); 
} 

y en su opinión, siempre se puede comprobar si su editar o añadir

if ($this->request->params['action'] == 'admin_edit') { 
    //do something 
} 
if ($this->request->params['action'] == 'admin_add') { 
    //do something 
} 
0

en edición.CTP

if($this->data[ModelName]['id']) { 
    $this->Form->input('id'); 
} 

// create rest of the fields 

en Controlador :: add()

$this->autoRender=false; // at the start of function 

$this->render('edit.ctp'); // at the point where you actually want to render 

hay necesidad de crear add.ctp

Cuestiones relacionadas