CRUD con Yii Framework

Vamos a ver como hacer un CRUD con Yii Framework (Create,Read,Update,Delete) de una tabla de la BD pruebas llamada usuarios con las columnas id,email,password,nombre,apellido.

El formulario:

<?php
class UsuariosForm extends CFormModel{
    //Campos que tendrá el formulario
    public $nombre;
    public $apellido;
    public $password;
    public $email;
 
    //Reglas de validación
    public function rules(){
        return array(
            //Estos campos serán obligatorios
            array('nombre, email, password,apellido', 
				  'required', 
				  "message"=>"Este campo es obligatorio"),
            
            //Validando el nombre con una expresión regular
            array(
              "nombre, apellido",
              "match",
              "pattern" => "/^[a-zA-Z ñÑáéíóúüç]*$/",
              "message"=>"El nombre solo puede estar formado por letras"
            ),
            
            //Aplicamos la validación de emails
            array('email', 'email','message'=>"El email es incorrecto"),
            
            //Especificamos una longuitud a la contraseña
            array('password', 'length',
                  "min"=>8,
                  'tooShort'=>"La contraseña debe tener como mínimo 8 letras"),

        );
    }
}
?>

El modelo, voy a utilizar el Query Builder para ejecutar las consultas:

<?php
class Usuarios extends CActiveRecord{
    private $connection;
    private $getUsuarios;
    private $getUnUsuario;
    
    public function __construct(){
        //Lanzamos la conexión a la base de datos
        $this->connection=new CDbConnection(
                //Cogemos la configuración asignada en config/main.php
                Yii::app()->db->connectionString,
                Yii::app()->db->username,
                Yii::app()->db->password
                );
        
        //Activamos la conexión
        $this->connection->active=true;
        
   
    }
    
    //Heredamos del modelo
    public static function model($className=__CLASS__){
		return parent::model($className);
    }
    
	//Método para conseguir todos los usuarios
    public function getUsuarios(){
        $this->getUsuarios=$this->connection->createCommand()
                ->select("*")->from('usuarios')->queryAll();
        return $this->getUsuarios;
    }
    
	//Método para conseguir un solo usuario
    public function getUnUsuario($id){
        $this->getUnUsuario=$this->connection->createCommand()
                 ->select("*")->from('usuarios')
			      ->where("id=$id")->queryAll();
        return $this->getUnUsuario;
    }
    
	//Método para eliminar usuarios
    public function eliminar($id){
        $delete=$this->connection->createCommand()->
        delete("usuarios", "id=$id");
        return $delete;
    }
    
	//Método para añadir usuarios
    public function add($nombre,$apellido,$email,$password){
        $insert=$this->connection->createCommand()->
                insert("usuarios",array(
                   "nombre"=>$nombre,
                   "apellido"=>$apellido,
                   "email"=>$email,
                   "password"=>$password
                ));
        return $insert;
    }
    
	//Método para modificar usuarios
    public function mod($id,$nombre,$apellido,$email,$password){
        $update=$this->connection->createCommand()->
                update("usuarios",array(
                   "nombre"=>$nombre,
                   "apellido"=>$apellido,
                   "email"=>$email,
                   "password"=>$password
                ),"id=$id");
        return $update;
    }
 
}
?>

El controlador:

<?php
class CrudController extends Controller{
    public $layout="//layouts/plantilla";
    
    private $usuarios;
    
    public function __construct($id, $module = null) {
        parent::__construct($id, $module);
		
		//Este objeto esta disponible en todos los métodos
        $this->usuarios=new Usuarios;
    }
    
    public function actionIndex(){
            $getUsuarios=$this->usuarios->getUsuarios();
            $this->render('index',array(
                        "usuarios"=>$getUsuarios
                    ));
    }
    
    public function actionAdd(){
        $usuarios_form=new UsuariosForm();
        $title="Añadir nuevos usuarios";
        
        if(isset($_POST['UsuariosForm'])){
            $usuarios_form->attributes=$_POST['UsuariosForm'];
            if($usuarios_form->validate()){
                $nombre=$_POST["UsuariosForm"]["nombre"];
                $apellido=$_POST["UsuariosForm"]["apellido"];
                $email=$_POST["UsuariosForm"]["email"];
                $password=$_POST["UsuariosForm"]["password"];
                
                $this->usuarios->add($nombre, $apellido, $email, $password);
                $this->redirect(Yii::app()->request->baseUrl."/crud");
            }
        }
        
        $this->render('form',array(
                        "title"=>$title,
                        "model"=>$usuarios_form
                    ));
    }
    
    public function actionModificar($id=null){
        if($id==null){
            $this->redirect(Yii::app()->request->baseUrl."/crud");
        }
        
        $usuarios_form=new UsuariosForm();
        $title="Editar usuario ".$id;
        $usuario=$this->usuarios->getUnUsuario($id);
        
        if(isset($_POST['UsuariosForm'])){
            $usuarios_form->attributes=$_POST['UsuariosForm'];
            if($usuarios_form->validate()){
                $nombre=$_POST["UsuariosForm"]["nombre"];
                $apellido=$_POST["UsuariosForm"]["apellido"];
                $email=$_POST["UsuariosForm"]["email"];
                $password=$_POST["UsuariosForm"]["password"];
                
                $this->usuarios->mod($id,$nombre, $apellido, $email, $password);
                $this->refresh();
            }
        }
        
        
        $this->render('form',array(
                        "title"=>$title,
                        "model"=>$usuarios_form,
                        "usuario"=>$usuario[0]
                    ));
    }
    
    public function actionEliminar($id=null){
        $delete=$this->usuarios->eliminar($id);
        $this->redirect(Yii::app()->request->baseUrl."/crud");
    }
}

Las vistas:

index.php

<div class="col-xs-9">
<h2 style="display: inline;">Crud con Yii Framework</h2></div>
<div class="col-xs-3">
<a class="btn btn-success" href="<?=Yii::app()->request->baseUrl?>/crud/add">
    Añadir nuevo usuario
</a>
</div>
<div style="clear:both"></div>
<hr/>
<table class="table table-striped">
    <tr>
        <th>ID</th>
        <th>NOMBRE</th>
        <th>APELLIDOS</th>
        <th>EMAIL</th>
        <th>PASSWORD</th>
        <th>EDITAR</th>
        <th>ELIMINAR</th>
    </tr>
<?php foreach ($usuarios as $usuario) { ?>
    <tr>
        <td><?=$usuario["id"]?></td>
        <td><?=$usuario["nombre"]?></td>
        <td><?=$usuario["apellido"]?></td>
        <td><?=$usuario["email"]?></td>
        <td><?=substr($usuario["password"],0,18)?></td>
        <td>
            <a class="btn btn-primary" href="<?=Yii::app()->
			request->baseUrl?>/crud/modificar/<?=$usuario["id"]?>">
                <span class="glyphicon glyphicon-edit"></span>
            </a>
        </td>
        <td>
            <a class="btn btn-danger" href="<?=Yii::app()->request->baseUrl
					?>/crud/eliminar/<?=$usuario["id"]?>">
                <span class="glyphicon glyphicon-trash"></span>
            </a>
        </td>
    </tr>
<?php } ?>
</table>

form.php Esta vista se reutiliza varias veces, los buenos frameworks permiten hacer esto.

<?php echo $this->setPageTitle($title); ?>
<h2><?=$title?></h2>

<div class="form col-lg-10">
<?php 
//Formulario con validación en frontend y backend
$form=$this->beginWidget('CActiveForm',array(
    "method"=>"POST",
    "action"=>"",
    "enableClientValidation"=>true,
    "clientOptions"=>array(
        "validateOnSubmit"=>true,
        "validateOnChange"=>true,
        "validateOnType"=>true
    )
)); ?>
 
    <?php echo $form->errorSummary($model); ?>

    <div class="row">
        <?php echo $form->label($model,'nombre'); ?>
        <?php 
            if(isset($usuario)){
                echo $form->textField($model,'nombre',
				array("class"=>"form-control","value"=>$usuario["nombre"]));
            }else{
                echo $form->textField($model,'nombre',
								array("class"=>"form-control"));
            }
        ?>
        <?php echo $form->error($model,'nombre') ?>
    </div>
    
    <div class="row">
        <?php echo $form->label($model,'apellido'); ?>
        <?php 
            if(isset($usuario)){
                echo $form->textField($model,'apellido',
			array("class"=>"form-control","value"=>$usuario["apellido"]));
            }else{
                echo $form->textField($model,'apellido',
						array("class"=>"form-control"));
            }
        ?>
        <?php echo $form->error($model,'apellido') ?>
    </div>
    
    <div class="row">
        <?php echo $form->label($model,'email'); ?>
        <?php 
            if(isset($usuario)){
                echo $form->emailField($model,'email',
				array("class"=>"form-control","value"=>$usuario["email"]));
            }else{
                echo $form->emailField($model,'email',
								array("class"=>"form-control"));
            }
        ?>
        <?php echo $form->error($model,'email') ?>
    </div>
    
    <div class="row">
        <?php echo $form->label($model,'password'); ?>
        <?php 
            if(isset($usuario)){
                echo $form->textField($model,'password',
			array("class"=>"form-control","value"=>$usuario["password"]));
            }else{
                echo $form->textField($model,'password',
					array("class"=>"form-control"));
            }
        ?>
        <?php echo $form->error($model,'password') ?>
    </div>
 <br/>
    <div class="row submit">
        <?php echo Chtml::submitButton('Guardar', array("class"=>"btn btn-success")); ?>
    </div>
 
<?php $this->endWidget(); ?>
</div><!-- form -->

El resultado final:
crud con yii framework editar

crud con yii framework 1

Más información:
http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder#preparing-query-builder

Víctor Robles WEB

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post

1 Comentario

  1. Muy interesante. Recien comenzando, como seria la edicion inline, debo utilizar ajax?

    Responder

Poner un comentario

Tu dirección de correo electrónico no será publicada.