Experimentando con Yii y DAO: manipulando formularios y registros simples

Introducción.

El día de hoy amanecí con ganas de seguir experimentando con Yii.  Al ya tener documentado el acceso a la base de datos a través de DAO y todo el manejo de los formularios es hora de probar la teoría con algo un poco mas elaborado.

El experimento de hoy consiste en crear una tabla de Usuarios (nombre de usuario, contraseña y edad) y un formulario que permita su administración (agregar, editar, listar y remover), utilizando por supuesto formularios basados en CFormModel y el acceso a la base de datos con CDbCommand.

Screenshot_0.1
Vista del formulario de la versión 0.1

Instalación preliminar.

Mi equipo utiliza Linux Ubuntu 9.04 por lo que algunos procedimientos son particulares al estilo *nix, en especial los relacionados con la instalación de paquetes y el manejo de la línea de comando, y será necesario realizar ajustes específicos si se desea utilizarlos en Windows.

  • Realicé la instalación de Apache y PHP (con soporte para SQLite 3.x) de acuerdo con los pasos establecidos anteriormente.
  • Realicé la instalación del framework de Yii versión 1.0.7 sin modificaciones significativas a lo establecido anteriormente.  La estructura inicial de directorios es la siguiente.

/home/web              Directorio base de los archivos relacionados con web.

/yii               Directorio de distribuciones de Yii.

/1.0.7         Distribución 1.0.7 de Yii.

/current       Enlace dinámico a la distribución mas reciente de Yii.

/public Directorio público (Document Root).

/YiiDaoDemo    Directorio base de la aplicación de prueba.

Para facilidad en el acceso de la aplicación yiic se realizó también el siguiente ajuste al final ~/.profile.

PATH=$PATH:/home/web/yii/current/framework
export PATH

Creación de los archivos base de la aplicación.

$ cd /home/web/public

$ yiic webapp YiiDaoDemo

Create a Web application under ‘/home/web/public/YiiDaoDemo’? [Yes|No] Yes
mkdir /home/web/public/YiiDaoDemo
mkdir /home/web/public/YiiDaoDemo/protected
mkdir /home/web/public/YiiDaoDemo/protected/views
mkdir /home/web/public/YiiDaoDemo/protected/views/system
generate protected/views/system/.yii
mkdir /home/web/public/YiiDaoDemo/protected/views/layouts
generate protected/views/layouts/main.php
mkdir /home/web/public/YiiDaoDemo/protected/views/site
generate protected/views/site/login.php
generate protected/views/site/contact.php
generate protected/views/site/index.php
generate protected/yiic.bat
mkdir /home/web/public/YiiDaoDemo/protected/controllers
generate protected/controllers/SiteController.php
generate protected/yiic.php
mkdir /home/web/public/YiiDaoDemo/protected/components
mkdir /home/web/public/YiiDaoDemo/protected/components/views
generate protected/components/views/mainMenu.php
generate protected/components/UserIdentity.php
generate protected/components/MainMenu.php
mkdir /home/web/public/YiiDaoDemo/protected/runtime
generate protected/runtime/.yii
mkdir /home/web/public/YiiDaoDemo/protected/messages
generate protected/messages/.yii
mkdir /home/web/public/YiiDaoDemo/protected/config
generate protected/config/main.php
generate protected/config/console.php
mkdir /home/web/public/YiiDaoDemo/protected/models
generate protected/models/LoginForm.php
generate protected/models/ContactForm.php
mkdir /home/web/public/YiiDaoDemo/protected/extensions
generate protected/extensions/.yii
generate protected/.htaccess
mkdir /home/web/public/YiiDaoDemo/protected/commands
mkdir /home/web/public/YiiDaoDemo/protected/commands/shell
generate protected/commands/shell/.yii
generate protected/yiic
mkdir /home/web/public/YiiDaoDemo/themes
mkdir /home/web/public/YiiDaoDemo/themes/classic
mkdir /home/web/public/YiiDaoDemo/themes/classic/views
mkdir /home/web/public/YiiDaoDemo/themes/classic/views/system
generate themes/classic/views/system/.yii
mkdir /home/web/public/YiiDaoDemo/themes/classic/views/layouts
generate themes/classic/views/layouts/.yii
generate themes/classic/views/.htaccess
mkdir /home/web/public/YiiDaoDemo/themes/classic/views/site
generate themes/classic/views/site/.yii
mkdir /home/web/public/YiiDaoDemo/css
generate css/bg.gif
generate css/form.css
generate css/main.css
mkdir /home/web/public/YiiDaoDemo/images
generate images/.yii
generate index.php
mkdir /home/web/public/YiiDaoDemo/assets
generate assets/.yii

Your application has been created successfully under /home/web/public/YiiDaoDemo.

Creación y configuración de la base de datos.

$ mkdir -p YiiDaoDemo/protected/data

$ cd YiiDaoDemo/protected

$ vi data/script.sql

CREATE TABLE usuario
(
 username        CHAR(16)        NOT NULL,
 contrasena      CHAR(32)        NOT NULL,
 edad            INT             ,

 PRIMARY KEY(username)
);

$ sqlite3 data/basededatos.db < data/script.sql

$ chown -R www-data data

$ ls -l data

-rw-r–r– 1 www-data jimezam 3072 2009-07-20 15:16 basededatos.db
-rw-r–r– 1 www-data jimezam  126 2009-07-20 15:16 script.sql

$ vi config/main.php

return array(
    // ...
    // application components
    'components'=>array(
        //...
        'db'=>array(
            'connectionString'=>'sqlite:protected/data/basededatos.db',
        ),
        //...

Creación del modelo para el formulario (UsuarioForm).

  • Al ser un modelo para manejar la información proveniente de informulario, hereda de CFormModel.
    class UsuarioForm extends CFormModel
    {
        // ...
    }
  • Se almacena en el archivo YiiDaoDemo/protected/models/UsuarioForm.php.
  • Incluye los siguientes atributos de acuerdo con su contenido.
    public $username;     /* Nombre de usuario */
    public $contrasena;   /* Contraseña del usuario */
    public $contrasena2;  /* Confirmación de la contraseña */
    public $edad;         /* Edad del usuario */
  • Se definen las siguientes etiquetas para cada uno de los atributos descritos anteriormente.
    public function attributeLabels()
    {
        return array(
            'username'    => 'Nombre de usuario',
            'contrasena'  => 'Contraseña',
            'contrasena2' => 'Contraseña (repetir)',
            'edad'        => 'Edad'
        );
    }
  • Se establecen las restricciones de validación para cada uno de los atributos.
    public function rules()
    {
        return array (
            array('username, contrasena, contrasena2, edad', 'required'),
            array('edad', 'numerical', 'integerOnly' => true),
            array('contrasena', 'compare', 'compareAttribute' => 'contrasena2'),
            array('username', 'length', 'max' => 16),
            array('contrasena', 'length', 'max' => 16),
            array('contrasena2', 'length', 'max' => 16)
        );
    }

Creación de la vista del formulario.

  • Será manejada por el modelo UsuarioForm.
  • Contiene dos partes generales.
    1. Un formulario que permite ingresar la información del Usuario para después agregarlo o editar su contenido de la base de datos.
    2. Un listado de los usuarios registrados en la base de datos desde el cual es posible remover los usuarios marcados o editar la información del usuario elegido.
  • Es la única vista de la aplicación así que será la vista de la acción index del controlador (AdminUsuario) a definirse próximamente.
  • Se almacena en el archivo YiiDaoDemo/protected/views/adminUsuario/index.php.
  • En la parte superior se muestran los mensajes flash provenientes de otras acciones.  Esto es útil para mostrar mensajes de error o éxito como “registro insertado”.
    <h1>Administración de usuarios</h1>
    
    <?php if(Yii::app() -> user -> hasFlash('mensajeEstado')):?>
    <div style="color: #0000FF">
     <?php echo Yii::app() -> user -> getFlash('mensajeEstado'); ?>
    </div>
    <?php endif; ?>
  • La primera parte del formulario permite manipular la información del Usuario.
    <h2>Datos del usuario</h2>
    
    <!-- Abre el formulario especificando su ACTION y METHOD -->
    <?php echo CHtml::beginForm(CHtml::normalizeUrl(array('adminUsuario/index')), 'post'); ?>  
    
    <div class='formulario'>  
    
     <!-- Muestra los mensajes de error asociados al modelo UsuarioForm -->
     <!-- El objeto $usuarioForm es enviado desde el controlador -->
     <?php echo CHtml::errorSummary($usuarioForm); ?>  
    
     <!-- Se genera el formulario con las etiquetas y valores asociados al modelo UsuarioForm -->
     <table>
     <tr>
         <td><?php echo CHtml::activeLabel($usuarioForm, 'username'); ?></td>
         <td><?php echo CHtml::activeTextField($usuarioForm, 'username'); ?> </td>
     </tr>
     <tr>
         <td><?php echo CHtml::activeLabel($usuarioForm, 'contrasena'); ?></td>
         <td><?php echo CHtml::activePasswordField($usuarioForm, 'contrasena'); ?></td>
     </tr>
     <tr>
         <td><?php echo CHtml::activeLabel($usuarioForm, 'contrasena2'); ?></td>
         <td><?php echo CHtml::activePasswordField($usuarioForm, 'contrasena2'); ?></td>
     </tr>
     <tr>
         <td><?php echo CHtml::activeLabel($usuarioForm, 'edad'); ?></td>
         <td><?php echo CHtml::activeTextField($usuarioForm, 'edad'); ?></td>
     </tr>
     </table>
    
     <br />
    
     <!-- Genera el botón de enviar el cual cumplirá funciones de Agregar y Editar -->
     <!-- según exista o no el registro en la base de datos -->
     <div class='acciones'>
         <?php echo CHtml::submitButton('Enviar', array('id' => 'enviar')); ?>
     </div>  
    
    </div>  
    
    <!-- Cierra el formulario -->
    <?php echo CHtml::endForm(); ?>
  • La segunda parte muestra un listado de los usuarios registrados en la base de datos con botones para las siguientes acciones.
    • Remover: eliminar de la base de datos a los usuarios cuyos registros se encuentren señalados con la marca.
    • Editar: editar la información del usuario correspondiente a la fila elegida.
      <h2>Listado de usuarios registrados</h2>
      
      <!-- Abre el formulario especificando su ACTION y METHOD -->
      <?php echo CHtml::beginForm(CHtml::normalizeUrl(array('adminUsuario/editar')), 'post'); ?>
      
      <!-- Crea un campo oculto para guardar el ID del registro a editarse -->
      <?php echo CHtml::hiddenField('UsuarioForm[elemento]', '', array()); ?>
      
      <!-- Genera el listado de los usuarios registrados -->
      <table style='border: 1px solid #FF0000;'>
      <tr style='background-color: pink; text-align: center; font-weight: bold;'>
          <td>Marcas</td>
          <td>Username</td>
          <td>Edad</td>
          <td>Opciones</td>
      </tr>
      
      <!-- El listado de $usuarios es enviado por el controlador a la vista -->
      <?php $i = 0; ?>
      <?php foreach($usuarios as $usuario): ?>
      <tr>
          <!-- Crea el checkbox marca[$i], no seleccionado y cuyo valor es el nombre del usuario asociado -->
          <td style='text-align: center;'>
              <?= CHtml::checkBox("UsuarioForm[marca][{$i}]", false, array('value' => $usuario['username'])); ?>
          </td>
      
          <!-- Nombre del usuario -->
          <td><?= $usuario['username']; ?></td>
      
          <!-- Edad del usuario -->
          <td style='text-align: center;'><?= $usuario['edad']; ?></td>
      
          <!-- Botón de editar del usuario asociado -->
          <!-- Al presionarse actualiza el valor del campo oculto 'elemento' con el -->
          <!-- el nombre del usuario asociado para la edición -->
          <td><?= CHtml::submitButton('Editar', array(
              'onClick' => "document.getElementById('UsuarioForm_elemento').value = '{$usuario['username']}'"
          )); ?></td>
      </tr>
      <?php $i++; ?>
      <?php endforeach; ?>
      </table>
      
      <br />
      
      <!-- Botón para remover los usuarios seleccionados -->
      <!-- Al presionarse actualiza el ACTION del formulario para ser manejado por la -->
      <!-- acción correcta del controlador -->
      <?= CHtml::submitButton('Remover', array(
          'onClick' => "document.getElementById('formListado').action = '" . CHtml::normalizeUrl(array('adminUsuario/remover')) . "'"
      )); ?>
      
      <!-- Cierra el formulario -->
      <?php echo CHtml::endForm(); ?>

Creación del modelo para el usuario.

  • Al ser un modelo para manejar la persistencia de los datos, hereda de CActiveRecord.  Debe tenerse en cuenta que en este experimento en particular se utilizarán los métodos de  DAO en lugar de las facilidades que el ActiveRecord provee directamente.
    class Usuario extends CActiveRecord
    {
        // ...
    }
  • Se almacena en el archivo YiiDaoDemo/protected/models/Usuario.php.
  • Se definen cuales atributos pueden ser asignados de manera automática.
    public function safeAttributes()  
    {  
        return 'username, contrasena, edad';  
    }
  • Se implementa el agregar el usuario a la base de datos mediante un INSERT de SQL.
       	public function agregar()
    	{
    		$sql = "INSERT INTO Usuario(username, contrasena, edad) " .
    		       "VALUES (:username, :contrasena, :edad)";
    
    		$comando = Yii::app() -> db -> createCommand($sql);
    
    		$comando -> bindParam(":username", $this -> username, PDO::PARAM_STR);
    		$comando -> bindParam(":contrasena", $this -> contrasena, PDO::PARAM_STR);
    		$comando -> bindParam(":edad", $this -> edad, PDO::PARAM_INT);
    
    		$control = $comando -> execute();
    
    		return ($control > 0);
    	}
  • Se implementa el editar el usuario de la base de datos mediante un UPDATE de SQL.
    	public function actualizar()
    	{
    		$sql = "UPDATE Usuario SET contrasena=:contrasena,edad=:edad " .
    		       "WHERE username=:username";
    
    		$comando = Yii::app() -> db -> createCommand($sql);
    
    		$comando -> bindParam(":username", $this -> username, PDO::PARAM_STR);
    		$comando -> bindParam(":contrasena", md5($this -> contrasena), PDO::PARAM_STR);
    		$comando -> bindParam(":edad", $this -> edad, PDO::PARAM_INT);
    
    		$control = $comando -> execute();
    
    		return ($control > 0);
    	}
  • Se implementa el remover el usuario de la base de datos mediante un DELETE de SQL.
    	public function remover()
    	{
    		$sql = "DELETE FROM Usuario WHERE username=:username";
    
    		$comando = Yii::app() -> db -> createCommand($sql);
    
    		$comando -> bindParam(":username", $this -> username, PDO::PARAM_STR);
    
    		$control = $comando -> execute();
    
    		return ($control > 0);
    	}
  • Se implementa el recuperar el usuario de la base de datos mediante un SELECT de SQL.
            public function recuperar()
    	{
    		$sql = "SELECT * FROM usuario WHERE username = :username";
    
    		$comando = Yii::app() -> db -> createCommand($sql);
    
    		$comando -> bindParam(":username", $this -> username, PDO::PARAM_STR);
    
    		$fila = $comando -> queryRow();
    
    		if($fila === false)
    			return false;
    
    		$this -> username   = $fila['username'];
    		$this -> contrasena = $fila['contrasena'];
    		$this -> edad       = $fila['edad'];
    
    		return true;
           }
  • De manera similar se implementa el existe que verifica si el usuario, identificado por su nombre de usuario, ya se encuentra registrado en la base de datos o no.
    	public function existe()
    	{
    		$sql = "SELECT username FROM usuario WHERE username = :username";
    
    		$comando = Yii::app() -> db -> createCommand($sql);
    
    		$comando -> bindParam(":username", $this -> username, PDO::PARAM_STR);
    
    		return ($comando -> queryScalar() == $this -> username);
    	}
  • Se implementa el método estático listarTodos que retorna el listado completo de los usuarios registrados en la base de datos.
    	public static function listarTodos()
    	{
    		$sql = "SELECT * FROM usuario";
    
    		return Yii::app() -> db -> createCommand($sql) ->  query();
    	}

Creación del controlador.

  • Se almacena en el archivo YiiDaoDemo/protected/controllers/AdminUsuarioController.php.
  • Se definen tres acciones diferentes.
    • index: maneja el agregar y editar registros (primer FORM).
    • editar: maneja el presionar el botón de editar para mostrar la información del usuario en el formulario (segundo FORM).
    • remover: maneja el presionar el botón de remover para eliminar de la base de datos a los usuarios seleccionados (segundo FORM).
      class AdminUsuarioController extends CController
      {
          // ...
      }
  • Acción editar: sucede cuando el usuario presiona el botón Editar frente a uno de los registros de los usuarios.  El sistema debe responder mostrando los datos del usuario seleccionado en el primer formulario.
    	public function actionEditar()
    	{
                    /* Verificar que se cuente con información del usuario (request) */
    
    		if(!isset($_POST['UsuarioForm']))
    		{
    			Yii::app() -> request -> redirect(CHtml::normalizeUrl(array('adminUsuario/index')));
    			exit;
    		}
    
                    /* Se obtiene el valor del 'elemento' que deberá tener el nombre del usuario a editar */
    
    		$elemento = $_POST['UsuarioForm']['elemento'];
    
                    /* Se intenta recuperar el usuario solicitado */
    
    		$usuario = new Usuario();
    		$usuario -> username = $elemento;
    		$control = $usuario -> recuperar();
    
    		$usuarioForm = new UsuarioForm();
    
                    /* Si se tiene éxito, se pasa la información del Usuario al UsuarioForm
                       para ser mostrado en la vista */
    
    		if($control)
    		{
    			$usuarioForm -> attributes = array(
    				'username' => $usuario -> username,
    				'edad' => $usuario -> edad
    			);
    		}
    		else
    		{
                            /* Si se fracasa, se muestra en la vista el nombre de usuario y un mensaje flash */
    
    			$usuarioForm -> username = $usuario -> username;
    
    			$usuarioForm -> addError('username', 'El usuario elegido no existe en la base de datos');
    		}
    
                    /* Se muestra la vista del formulario con la información recuperada y el listado
                       de usuarios registrados */
    
    		$this -> render('index',
    			array(
    				'usuarioForm' => $usuarioForm,
    				'usuarios' => Usuario::listarTodos()
    			));
    	}
  • Acción remover: sucede cuando el usuario presiona el botón de remover usuarios en la parte inferior.  El sistema debe responder eliminando de la base de datos a los usuarios seleccionados.
    	public function actionRemover()
    	{
                    /* Verifica que se cuente con información del usuario (request),
                       de lo contrario, redirecciona a la página inicial */
    
    		if(!isset($_POST['UsuarioForm']))
    		{
    			Yii::app() -> request -> redirect(CHtml::normalizeUrl(array('adminUsuario/index')));
    			exit;
    		}
    
                    /* Obtiene las marcas del formulario, los valores de las marcas corresponden a los
                       los nombres de los usuarios a remover */
    
    		$usuarios = array_values($_POST['UsuarioForm']['marca']);
    
    		$total = 0;
    		$borrados = 0;
    
    		foreach($usuarios as $username)
    		{
                            /* Crea un nuevo usuario con el nombre de usuario a remover */
    
    			$usuario = new Usuario();
    			$usuario -> username = $username;
    
                            /* Ejecuta su remoción */
    
    			if($usuario -> remover())
    				$borrados ++;
    
    			$total ++;
    		}
    
                    /* Prepara un mensaje flash con el estado final de la remoción */
    
    		Yii::app() -> user -> setFlash('mensajeEstado', "Se removieron {$borrados} de {$total} registros.");
    
                    /* Redirecciona a la página inicial de la aplicación */
    
    		Yii::app() -> request -> redirect(CHtml::normalizeUrl(array('adminUsuario/index')));
    		exit;
    	}
  • Acción index: sucede cuando la aplicación es invocada por primera vez, el sistema debe responder mostrando el formulario vacío.  También es invocada cuando el usuario presiona el botón Enviar para editar o agregar un nuevo usuario a la base de datos, el sistema debe responder realizando la acción solicitada.
    	public function actionIndex()
    	{
    		$usuarioForm = new UsuarioForm();
    
                    /* Si se cuenta con información del usuario (request) entonces
                       se agregará un nuevo usuario o se realizará una edición del mismo */
    
    		if(isset($_POST['UsuarioForm']))
    		{
                            /* Carga el modelo con la información del formulario */
    
    			$usuarioForm -> attributes = $_POST['UsuarioForm'];
    
                            /* Verifica que su información sea válida */
    
    			if($usuarioForm -> validate())
    			{
                                    /* Crea un Usuario con su información */
    
    				$usuario = new Usuario();
    
    				$usuario -> attributes = $_POST['UsuarioForm'];
    
    				try
    				{
    					$control = false;
    
                                            /* Si el usuario existe ... */
    
    					if(!$usuario -> existe())
    					{
                                                    /* Se intenta agregarlo */
    
    						$control = $usuario -> agregar();
    					}
    					else
    					{
                                                    /* De lo contrario, se intenta actualizar */
    
    						$control = $usuario -> actualizar();
    					}
    
                                            /* Si la acción tuvo éxito ... */
    
    					if($control)
    					{
                                                    /* Muestra un mensaje flash de éxito */
    
    						Yii::app() -> user -> setFlash('mensajeEstado', 'El registro fue incorporado exitosamente ' .
    						                                                'en la base de datos');
    
                                                    /* Limpia los valores del formulario */
    
    						$usuarioForm = new UsuarioForm();
    					}
    					else
    					{
                                                    /* Si falló ... muestra un mensaje flash de fracaso */
    
    						$usuarioForm -> addError('username', 'El registro no pudo ser incorporado en ' .
    						                                     'la base de datos, inténtelo nuevamente');
    					}
    				}
    				catch (Exception $e)
    				{
                                            /* Si se lanzó una excepción durante el proceso, esta se muestra y
                                               considera como un error */
    
    					$usuarioForm -> addError('username', $e -> getMessage());
    				}
    			}
    		}
    
                    /* Se muestra la vista del formulario con la información recuperada y el listado
                       de usuarios registrados */
    
    		$this -> render('index',
    		                array(
    					'usuarioForm' => $usuarioForm,
    					'usuarios' => Usuario::listarTodos()
    				));
    	}

Conclusiones.

  • A pesar de que Yii parece ser un framework muy interesante para el desarrollo con PHP aún no me siento cómodo con él.
  • Aún quedan varios temas para revisar y experimentar de Yii con los que espero se aclare un poco mas el panorama.
  • El acceso a la base de datos mediante los objetos DAO es muy claro y fácil de implementar.
  • Para la implementación del CRUD es mas conveniente utilizar el ActiveRecord que se estará analizando próximamente y utilizar el DAO para las consultas demasiado complejas.
  • En este, mi tercer programita en Yii, se aclararon varias dudas que tenía, sin embargo persisten otras, en particular esta: cómo limpio/filtro la información proveniente del usuario ?

Enlaces.

public function agregar()
{
$sql = “INSERT INTO Usuario(username, contrasena, edad) ” .
“VALUES (:username, :contrasena, :edad)”;

$comando = Yii::app() -> db -> createCommand($sql);

$comando -> bindParam(“:username”, $this -> username, PDO::PARAM_STR);
$comando -> bindParam(“:contrasena”, $this -> contrasena, PDO::PARAM_STR);
$comando -> bindParam(“:edad”, $this -> edad, PDO::PARAM_INT);

$control = $comando -> execute();

return ($control > 0);
}

7 thoughts on “Experimentando con Yii y DAO: manipulando formularios y registros simples”

  1. Perfecto! Lo mejor tutorial sobre DAO con Yii en cualquier idioma (I’m British and there isn’t a good Yii DAO tutorial in english that I can see…)

    Para los que faltan una solucion de la problema de control sobre SQL (si estan utilizando Stored Procedures en PostgreSQL o Oracle por ejemplo), pero quieren seguir con Yii para su buena estructura MVC y automatización UI, aqui lo tienes.

    For anyone in need of a solution of non-ORM’ed control over SQL (e.g. if using Stored Procs in PostgreSQL or Oracle), but want to keep with Yii for its great MVC design and UI automation, here it is (in spanish.)

  2. Seguí paso por paso este mini-tutorial y me topé con un par de problemas, que ya solucioné, pero que quería comentarlos acá.
    Antes aclarar que ayer inicié a aprender Yii, por lo que aún hay muchas cosas que no comprendo. Actualmente estoy utilizando la versión 1.1.7 de Yii con PHP 5.3.

    1. Para hacer que la inserción funcionara, tuve que modificar el seteo de los atributos de Usuario, ya que estos no estaban siendo asignados. Por ejemplo, en el controlador de AdminUsuario tuve que comentar la línea donde se seteaban originalmente los atributos y asignar uno por uno, pero así funcionó.

    //$usuario -> attributes = $_POST[‘UsuarioForm’];
    $usuario->username = $_POST[‘UsuarioForm’][‘username’];
    $usuario->contrasena = $_POST[‘UsuarioForm’][‘contrasena’];
    $usuario->edad = $_POST[‘UsuarioForm’][‘edad’];

    2. Al intentar ejecutar asignar el valor de un parámetro de una sentencia SQL me encontré que se generaba un error que indicaba: “Indirect modification of overloaded property Usuario::$username has no effect”. El problema se presenta donde intentaba hacer:
    $comando -> bindParam(“:username”, $this -> username, PDO::PARAM_STR);

    Por lo que pude leer por encima, al parecer el problema viene el get de atributos creados mediante los métodos mágicos de PHP __set(); aunque la verdad no me quedó muy claro esto.

    La solución que encontré fue asignar previamente una variable con el valor del atributo.

    $usuario = $this -> username;
    $comando -> bindParam(“:username”, $usuario, PDO::PARAM_STR);

    Saludos,

  3. (Agradecería si eliminas los dos comentarios anteriores)
    Hola nuevamente,

    Ante no había probado la función de remover, y no funcionaba. Revisando el código, detecté que esta acción nunca se ejecutaba y era porque en la vista, el botón de remover modificaba la acción del formulario del listado, basado en el ID de este, pero este ID nunca se le asignó al formulario. Lo modifiqué y funcionó.

    Listado de usuarios registrados

    [h2]Listado de usuarios registrados[/h2]
    [comentario] Abre el formulario especificando su ACTION y METHOD [/comentario]
    [php] echo CHtml::beginForm(CHtml::normalizeUrl(array(‘adminUsuario/editar’)), ‘post’, array(‘id’=>’formListado’)); [/php]

    Saludos,

Leave a Reply

Your email address will not be published. Required fields are marked *