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















