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. Los campos obligatorios están marcados con *