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 -->
Más información:
http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder#preparing-query-builder