Noticias

* Completa este formulario para conocer los temas de tu interes, te tomará unos segundos.
* Nuevos temas en CAKEPHP
* Ahora puedes bajar los proyectos finalizados!
* Sigue a la página para seguir creciendo!!

domingo, 15 de marzo de 2015

CAKEPHP: Modificar datos de una tabla

No hay comentarios :
Introducción

En esta entrada, aprenderemos nuestra última acción básica sobre una base de datos con CAKEPHP. Como repito siempre, estoy trabajando en un proyecto que ya con esta sería la cuarta entrega, por ende, ya el proyecto lleva muchos puntos realizados, por esta razón si desean seguir todos los pasos hasta llegar aquí pueden ir acá y en la sección básico encontrarán los temas.

Sin más que decir, entraremos con el último paso de nuestro proyecto, modificar.

Desarrollo

Primero trabajaremos en la vistas, que es la parte más sencilla, en nuestra vista vamos a añadir un nuevo enlace para modificar nuestro nombre, esto nos enviará a un nuevo formulario donde se desplegará la diferente información de nuestro nombre para lograr modificarla.

Vamos al archivo app/View/nombres/listar.ctp y añadimos lo encerrado con el signo numeral (#).

<?php

echo ('<h1>Nombres de la BASE DE DATOS!</h1>');
// $nombres es la variable a la que le asignábamos el resultado de nuestra consulta en
// la función listar en nuestro controlador
if (empty($nombres)) {
    //Si no tienen nada nos dirá que no existen nombre actualmente
    echo ("Actualmente no hay Nombres.");
} else {

    echo '<table>';
    echo '<tr>';
    echo '<th>id</th>';
    echo '<th>Nombre</th>';
    
    // ---------------------------
    echo '<th>Acciiones</th>';
    // ---------------------------
 
    echo ' </tr>';

    foreach ($nombres as $nombre):
        // recorremos nuestra variable para obtener cada uno de nuestros 
        // nombres individualmente 
        // luego de nuestro nombre sacamos los datos donde 'Nombre' es el nombre
        // de nuestro modelo e 'id' y 'nombre' son los campos de la tabla
        echo '<tr>';
        echo '<td>';
        echo $nombre['Nombre']['id'];
        echo '</td>';
        echo '<td>';
        echo $nombre['Nombre']['nombre'];
        echo '</td>';
        
        // --------------------------- Link que se utiliza para eliminar un nombre
        // de nuestra tabla, Primero se coloca el nombre a mostrar ("Borrar") y 
        // posteriormente la acción del controlador que se desea ejecutar en este 
        // caso delete, además se le concatena el id del nombre que se desea eliminar
        echo '<td>';
        echo $this->Html->link("Borrar", array("action" => "delete/"
                                            . $nombre['Nombre']['id']));
        // ##################################################################
        // --------------------------- Link que se utiliza para actualizar un nombre
        // de nuestra tabla, Primero se coloca el nombre a mostrar ("Actualizar") y 
        // posteriormente la acción del controlador que se desea ejecutar en este 
        // caso update, además se le concatena el id del nombre que se desea actualizar
        echo $this->Html->link("Actualizar", array("action" => "update/"
                                            . $nombre['Nombre']['id']));
        // ##################################################################
        echo '</td>';
        // ---------------------------
        
        echo ' </tr>';
    endforeach;

    echo '</table>';
}

Una vez hecho esto, vamos al controlador ubicado en app/Controller/NombresController.php, para añadir la función que nos ayudará en la tarea de actualizar el nombre.

public function update($id = null) {
        
        // Si la solicitud viene por post, osea desde un formulario
        if ($this->request->is('Post')) {
            // Verifica que la información entrante no este vacía.
            if (!empty($this->data)) {
                // Selecciona el nombre con el id de entrada, este id viene del formulario.
                $this->Nombre->id = $id;
                // Una vez seleccionado el nombre, se le asigna la nueva información y se guarda
                // en la base de datos.
                if ($this->Nombre->save($this->data)) {
                    // mensaje para que el usuario se entere que se guardó correctamente.
                    $this->Session->setFlash('El nombre se actualizó correctamente.');
                    // Una vez guardado redirecciona al listar para ver los cambios
                    $this->redirect('/nombres/listar');
                } else {
                    // mensaje para que el usuario se entere que no se guardó correctamente.
                    $this->Session->setFlash('El nombre no se ha podido actualizar, verifique los
                        datos e inténtelo de nuevo.');
                }
            }
        }
        
        // En caso que la petición no venga de un formulario, es decir cuando seleccionamos el link
        // de nuestra vista listar realizará esta acción.
        // Selecciona de la base de datos todos los nombres que la condición sea la especificada.
        // La función $this->set setea la variable nombre el contenido de la consulta a base de datos
        // y la envía a la vista update.
        $this->set('nombre', $this->Nombre->find('all', array('conditions' => array('Nombre.id' => $id))));
        // la sección array('conditions' => array('Nombre.id' => $id)) es como decir el where de una
        // consulta SQL, sería WHERE Nombre.id = id_de_entrada
        // Además esto nos redireccionará a la vista update.ctp creada en app/View/nombres/
    }

Ahora el último paso, crear la vista update.ctp que estará ubicada en app/View/nombres. Creamos el archivo update.ctp y pegamos el siguiente código.

<?php
// Se crea un formulario de tipo Nombre, cuya acción a realizar es la función add
// del controllador padre, en este caso NombresController.
// Se envía a través del método post hacia la función.
echo $this->Form->create('Nombre', array('action' => 'update', 'request' => 'post', $nombre[0]['Nombre']['id']));
// Las siguientes dos líneas son para mostrar mensajes, por ejemplo si se actualizó
// o no el nombre en la base de datos
echo $this->Session->flash('auth');
echo $this->Session->flash();
echo ("<legend> Actualizar Nombre </legend>");
// Crea un campo tipo input, correspondiente a la columna nombre de la base de datos
// es decir siempre se debe colocar el nombre de la columna de la base de datos.
// Además se setea el valor del nombre que viene del controlador, en el campo.
// Recordar que $nombre, es la variable que se setea en la función update del 
// controlador, cuando seleccionamos de la base de datos. 
echo $this->Form->input('nombre', array('label' => 'Nombre:','value' => $nombre[0]['Nombre']['nombre']));
//Una cosa importante, CakePHP asume que estás editando un modelo si su id está 
//presente en su array de datos. 
//Si no hay un ‘id’ presente, CakePHP asumirá que es un nuevo elemento al llamar 
//a la función save()
echo $this->Form->input('id', array('type' => 'hidden', 'value' => $nombre[0]['Nombre']['id']));
// Crea el botón y cierra el formulario.
echo $this->Form->end('Actualizar');

Con esto ya terminamos nuestra funcionalidad de actualizar.

Conclusiones

Siempre tener en cuenta que al momento de modificar se ocupa un id, para que CAKEPHP reconozca que se está actualizando y no que se está creando uno nuevo.

CAKEPHP facilita mucho al momento de la modificación, ya que con pocas líneas se logra dicha acción.

No hay comentarios :

Publicar un comentario