wiki:DesarrolladoresRefactorajeEnVista

Refactoraje en Vistas

Muchas veces la acción "insert" (agregar datos) y la acción "update" (actualizar datos) son casi idénticas. En CakePHP eso significa que tenemos un método admin_add con la vista admin_add.ctp correspondiente y un método admin_edit con la vista admin_edit.ctp correspondiente que como ya dijimos casi es código duplicado. Esto atenta con el principio DRY asi que podemos hacer un refactoraje, refactorar software significa optimizar y simplificar el código sin perder funcionalidades del programa.

Lo que podemos hacer para refactorar es eliminar el método admin_add del controlador y la vista admin_add.ctp, esto lo hacemos modificando la vista admin_edit.ctp para que el formulario funcione tanto para agregar como para editar, sólo debemos alterar algunas líneas del archivo admin_edit.ctp en este sentido:

if (!empty($this->data) && isset($this->data['Wiki']['id'])):
   e($form->hidden('Wiki.id'));
   e($form->hidden('Wiki.revision'));
   $legend = __('Edit Wiki', true);
else:
   $legend = __('New Wiki', true);
endif;
?>
<fieldset>
<legend id="legend"><?php echo $legend; ?></legend>

La línea importante aqui es:

e($form->hidden('Wiki.id'));

Qué es el campo del módelo que le indica al método $Model->save() si es un update o un insert. Ya podemos eliminar la vista:

$svn del views/wikis/admin_add.ctp 
$svn ci -m "Add view removed" 

¡Un archivo menos que mantener!

En el controlador WikisController? el método admin_edit que ahora se encargará de hacer tanto los updates como los inserts es como sigue::

 public function admin_edit($wiki_id=null)
 {
   $this->layout    = 'admin';
   // I need this stuff to build combos on view
   $this->set('subjects', Set::combine($this->Wiki->Subject->find('all', array('order' => 'title')), "{n}.Subject.id","{n}.Subject.title"));
   $this->set('vclassrooms', Set::combine($this->Wiki->Vclassroom->find('all', array('order'=>'name', 'conditions'=>array('Vclassroom.user_id'=>$this->Auth->user('id'), 'Vclassroom.status'=>1))), "{n}.Vclassroom.id","{n}.Vclassroom.name"));

   if ( !empty($this->data['Wiki']) ): // insert or update beggins
        // Always clean your data
        Sanitize::paranoid($this->data['Wiki']['title']);
        Sanitize::html($this->data['Wiki']['content']);
        $this->data['Wiki']['ip']       = $_SERVER['REMOTE_ADDR']; 
        $this->data['Wiki']['modified'] = 'now()';

        if (!isset($this->data['Wiki']['id'])):   // no wiki_id so is insert action
            $this->data['Wiki']['revision'] = (int) 1;
            $this->data['Wiki']['user_id']  = (int) $this->Auth->user('id');
        else:
            $this->data['Wiki']['revision'] = (int) ($this->data['Wiki']['revision'] + 1);  // is an update action, so add 1 to revisions
	endif;

        if ($this->Wiki->save($this->data)):   
           if ($this->data['Wiki']['end'] == 0 && !isset($this->data['Wiki']['id'])):  // continue editing wiki after insert
                $id = $this->Wiki->getLastInsertID();
                $return = '/admin/wikis/edit/'.$id;    
           elseif ($this->data['Wiki']['end'] == 0 && isset($this->data['Wiki']['id'])): // continue editing wiki after update
                $return = '/admin/wikis/edit/'.$this->data['Wiki']['id'];
	   elseif ($this->data['Wiki']['end'] == 1 ):                                     // edit finish
	        $return = '/admin/wikis/listing';
	   endif;
           $this->msgFlash(__('Data saved', true),$return);
	endif; 
   elseif($wiki_id != null && intval($wiki_id)):
     $this->data = $this->Wiki->read(null, $wiki_id);  // load data for admin_edit view
   endif;
 }
 

Después de hacer esto ya podemos borrar el métod admin_add, ¡menos código que mantener!. Este refactoraje hace al código más rápido y más sencillo de mantener.