Ejemplo 2 de Ajax con Prototype: creando el modelo de datos

Introducción.

Teniendo lista la capa de acceso a la base de datos se procede entonces a la creación del modelo de datos de la única estructura de persistencia que tiene el proyecto: la tabla Contacto. La utilidad de este modelo es la de abstraer del resto de la aplicación todo lo concerniente a su lógica especifica de negocio, es decir, especificar todo lo relacionado con su conducta, consulta y persistencia para que el resto de la aplicación se pueda desentender de ella y se modularice al estilo DRY

Creación de la clase contacto.

Para hacer esto se crea el archivo contacto.php en el directorio raíz del proyecto.

Los campos de la clase coinciden con los especificados en la tabla de la base de datos con igual nombre. La versión inicial de la clase se describe a continuación.

<?php

class Contacto
{
    private $id;
    private $nombres;
    private $apellidos;
    private $correo;
    private $fechaNacimiento;

    // Resto de la implementación.
}

?>

Se crean los métodos para modificar desde el exterior a los atributos de la instancia: métodos pon o setters.

    public function ponId($valor)
    {
        $this -> id = $valor;
    }

    public function ponNombres($valor)
    {
        $this -> nombres = $valor;
    }

    public function ponApellidos($valor)
    {
        $this -> apellidos = $valor;
    }

    public function ponCorreo($valor)
    {
        $this -> correo = $valor;
    }

    public function ponFechaDeNacimiento($valor)
    {
        $this -> fechaNacimiento = $valor;
    }

De igual manera se crean los métodos que permiten obtener el valor de los atributos de la instancia: métodos obt o getters.

    public function obtId()
    {
        return $this -> id;
    }

    public function obtNombres()
    {
        return $this -> nombres;
    }

    public function obtApellidos()
    {
        return $this -> apellidos;
    }

    public function obtCorreo()
    {
        return $this -> correo;
    }

    public function obtFechaDeNacimiento()
    {
        return $this -> fechaNacimiento;
    }

Estos métodos son el lugar idóneo para establecer restricciones en el dominio de los valores de los atributos como por ejemplo, evitar que al campo $correo se le asignen direcciones que no cumplan con el formato o que al campo $fechaNacimiento se le asignen fechas futuras entre otros. Por simplicidad de la aplicación de demostración este tipo de validaciones se omiten y se dejan libres para ser desarrolladas por el lector.

Implementación del acceso a la base de datos.

Como se mencionó inicialmente, el acceso a la base de datos no se realiza directamente utilizando las función de PDO provistas por PHP sino que por el contrario, se aprovecha la capa adicional de alto nivel implementada en el capítulo pasado.

Todas las operaciones descritas a continuación hacen referencia a como almacenar, editar, remover y recuperar Contactos (operaciones CRUD) a partir de la información de la instancia de la clase del mismo nombre.

Agregando contactos.

    public function agregar($bd)
    {
        $sql = "INSERT INTO contacto ('nombres', 'apellidos', 'correo', 'fnacimiento') " .
               "VALUES ('{$this -> nombres}', '{$this -> apellidos}', '{$this -> correo}', '{$this -> fechaNacimiento}')";

        return $bd -> ejecutar($sql);
    }

Editando contactos.

    public function editar($bd)
    {
        $sql = "UPDATE contacto SET nombres='{$this -> nombres}', " .
               "apellidos='{$this -> apellidos}', correo='{$this -> correo}', " .
               "fnacimiento='{$this -> fechaNacimiento}' WHERE id='{$this -> id}'";

        return $bd -> ejecutar($sql);
    }

Removiendo contactos.

    public function remover($bd)
    {
        $sql = "DELETE FROM contacto WHERE id='{$this -> id}'";

        return $bd -> ejecutar($sql);
    }

Recuperando contactos.

    public function recuperar($bd, $id)
    {
        $sql = "SELECT id, nombres, apellidos, correo, fnacimiento FROM contacto WHERE id='{$id}'";

        $res = $bd -> consultar($sql) -> fetch();

         if($res === false)
            return false;

        $this -> id              = $res['id'];
        $this -> nombres         = $res['nombres'];
        $this -> apellidos       = $res['apellidos'];
        $this -> correo          = $res['correo'];
        $this -> fechaNacimiento = $res['fnacimiento'];

        return true;
    }

Nótese como todos los métodos del modelo Contacto reciben por parámetro a la instancia de BaseDeDatos a la cual se va a acceder, esto quiere decir que es responsabilidad de la acción que los invoca el establecer la conexión y el validar que esta se haya realizado exitosamente.

También se puede observar que el método recuperar recibe un parámetro adicional al resto de los métodos el cual hace referencia al ID del Contacto que se desea recuperar, con él se realiza la consulta a la base de datos y en éxito se actualizan los campos de la instancia con la información obtenida. El resto de los métodos realizan su cometido: agregar, actualizar y borrar, a partir la información encontrada en sus atributos.

Listando contactos.

Un método adicional que requiere del acceso a la base de datos es el que permite obtener un listado de los contactos registrados filtrado de acuerdo a una serie de condiciones especificadas en ejecución. Este método será útil para implementar el listado de contactos con filtro de búsqueda (5 y 6).

	public static function listar($bd, $where=false)
	{
		$sql = "SELECT id, nombres, apellidos, correo, fnacimiento " .
	               "FROM contacto " .
		       (($where !== false) ? "WHERE " . $where . " " : "") .
		       "ORDER BY apellidos, nombres";

		return $bd -> consultar($sql);
	}

Métodos complementarios.

Un último método que se requiere como complemento para facilitar la manipulación del objeto utilizando JSON es el método toArray que convierte los atributos de la instancia a su correspondiente representación de arreglo, algo muy similar a lo realizado por la función get_object_vars.

    public function toArray()
    {
        return array('id'              => $this -> id,
                     'nombres'         => urldecode($this -> nombres),
                     'apellidos'       => urldecode($this -> apellidos),
                     'correo'          => urldecode($this -> correo),
                     'fechaNacimiento' => urldecode($this -> fechaNacimiento));
    }

Conclusiones.

Con la implementación del modelo que recubre a un mayor nivel las operaciones relacionadas con el acceso a la persistencia de los datos y la lógica del negocio se terminan los preparativos de infraestructura para la implementación de las acciones faltantes de la aplicación de ejemplo a través de accesos asíncronos.

Enlaces.

2 thoughts on “Ejemplo 2 de Ajax con Prototype: creando el modelo de datos”

  1. Saludos Dr Meza

    – Al momento de crear el sql para insertar los datos no es posible que se presenten problemas de injeccion de sql ? o la construccion encerrada dentro de llaves ‘{‘ se hace cargo de esto ?

    – No seria mejor un acercamiento a la capa de datos a traves de DAO ?

    gracias

  2. Saludos profe Marlonj,

    La idea principal es la de mostrar el uso de Ajax con su consecuente infraestructura que se debió preparar al rededor de este objetivo. Sin embargo la parte de seguridad es muy importante e interesante ya que uno nunca puede estar seguro de lo infalible de un código.

    Las “{…}” sólo ayudan para que el intérprete no se enrrede cuando uno mezcla variables dentro de cadenas con comillas dobles (las simples se toman tal cual), en especial cuando se ejecutan métodos sobre objetos.

    El filtro lo estoy haciendo en los sitios donde se reciben los valores del POST, es decir, esta clase no es segura por si misma. Estoy lo hago utilizando las funciones de filtro como “filter_var” de http://www.php.net/manual/en/ref.filter.php.

    Cuando estaba desarrollando la aplicación de demostración realicé algunas pruebas muy cortas y no pude inducir ninguna inyección de código, sin embargo, como nunca la seguridad está de sobra podría ser bueno aplicar otras funciones del estilo de “mysql_real_escape_string”. Algún consejo al respecto ?

    De igual manera lo de DAO, me pareció la solución mas simple la propuesta aunque no la mas flexible, como todo en la vida, se gana en algo pero se sacrifica en otra cosa. Sin embargo es una sugerencia muy interesante, ahora que he terminado la demostración voy a mejorarle la persistencia incorporándole el patrón de diseño y se enrriquece con esto el artículo.

    Espero contar con su opinión cuando publique la nueva versión.

Leave a Reply

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