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.
