29 de enero de 2012

Sistema de posteo en PHP - Introducción

Ejemplo usando PostSystem
Les quiero compartir este código reutilizable que realizé en PHP en una clase, este tema está hecho para personas con conocimientos intermedios en PHP y MySQL.
Antes de comenzar con este rollo, quisiera que observarán un ejemplo que muestra las funcionalidades que tiene esta clase, el ejemplo se realizó de forma muy fácil utilizando la clase. Pueden ver el ejemplo, AQUÍ.

INTRODUCCIÓN

Me he dedicado a realizar una clase llamada PostSystem en PHP que funciona con MySQL, con el fin de facilitar el desarrollo de una interfaz para un sistema de posteo.

Con esta clase pueden ingeniarselas para realizar desde una simple página de comentarios, un blog, hasta uno o  más foros llenos de temas que responder o comentar, depende tu dedicación y experiencia.

La forma como funciona el sistema de posteo es familiarizando a los posts como padres e hijos y "los hijos de los hijos..." usando dos indentificadores por post, uno el cuál identifica al post y otro para hacer referencia a un post superior (si es que lo hay). En resumen, usa métodos recursivos para llegar hasta el final de cada nodo mediante la jerarquía entre padres e hijos.

Esta clase básicamente se encarga de realizar INSERT, SELECT, UPDATE y DELETE usando métodos recursivos.

Los posts se guardan en una tabla de la base de datos creada automáticamente si esque no existe.
Requiere de la conexión y selección a una base de datos MySQL previamente. La tabla es llamada "tb_posts", las columnas son: "id", "author", "title", "snippet", "content", "type", "parent_id", "date_created" y "date_modified".

Logicamente debería entenderse el propósito de cada columna por el nombre que tienen. A excepción, explicaré la columna "parent_id" y "type" ya que son la base de como trabaja este sistema de posteo.

La columna "parent_id" es un identificador el cual hace referencia al "id" de otro post, así es como se familiarizan como padres e hijos.
Ejemplo:
Si tengo un post con id=1 y parent_id=2, entonces el post con id=1 es "hijo" del post con id=2.

La columan "type" representa el tipo de post que se está publicando. Por ejemplo, en un blog generalmente hay: entrada, comentario y cita; En un foro: tema, respuesta y cita.
Puede ponerse cualquier cosa en "type", ya que ustedes son los que decidirán que tipos de post habrá.

Spoiler - Información detallada de la tabla y sus columnas.
- Tabla MySQL
    - tbposts
    Descripción
        Es la única tabla necesaria para que trabaje la clase, en la cual se guardan los datos de los posts.
        El script para la creación de la tabla es:
            CREATE TABLE IF NOT EXISTS tb_posts(
                id INT NOT NULL AUTO_INCREMENT,
                author VARCHAR(50),
                title VARCHAR(100),
                snippet VARCHAR(255),
                content TEXT,
                type VARCHAR(20),
                parent_id INT,
                date_created DATETIME,
                date_modified DATETIME,
                PRIMARY KEY(id, author, parent_id)
            )

    Columnas
    - id: Identificador del post.
    - author: Nombre del creador del post.
    - title: Título del post.
    - snippet: Fragmento del contenido del post.
    - content: Contenido del post.
    - type: Tipo del post definido por el desarrollador. Ejemplo de tipos: entrada, comentario, cita.
    - parent_id: Identificador al que se enlaza el post jerárquicamente. Ejemplo: el id de "X" entrada es 12, el parent_id de "Y" comentario es 12.
    - date_create: fecha de creación del post, la fecha es establecida por PHP no por MySQL.
    - date_modified: fecha de modificación del post, igualmente establecida por PHP.

La clase cuenta con cuatro funciones y tres propiedades, se explica muy genericamente a continuación.

Métodos
  • insert($datos): crea un post llenando con el parámetro $datos que es un array asociativo a las columnas de "tb_posts". Las columnas id, date_created y date_modified, pueden dejarse en blanco para ahorrar código ya que se crean automáticamente si no estan definidas.
  • select($id_tipo, $config): selecciona uno o más posts devolviendolos en u array asociativo, dependiendo de que información haya en $id_tipo y en $config. $id_tipo puede representar un valor a la columna "id", "parent_id" o "type" y con $config se puede saber si se va a identificar por "id", "parent_id" o "type. $config es un array asociativo con el cual se sabrá como obtener los posts. Por ejemplo, se puede exigir que se obtengan todos los posts "hijos" a el post requerido.
  • update($id, $data): modifica el post con el id pasado en $id con los datos de un array asociativo pasado en $data, si no se pone nada en "date_modified" atomáticamente asigna un fecha.
  • delete($id, $borrar_hijos): con esta función se puede borrar un post con el id asignado en $id y también borra a toda su descendencia de posts si $borrar_hijos es pasado como "true".
  • selectParent($id, $parent_type, $campos): devuelve el primer post padre con el tipo pasado en $parent_type en un array asociativo con los campos deseados en $campos, siendo el hijo del post con el id pasado en $id. Si tengo esta jerarquía: post1_tipoA>post2_tipoB>post3_tipoC, y hago un selectParent(3, "A", "*"), entonces me entregará "post1_tipoA".
  • foreachPost($datos_posts, $funcion, &$variable): está función es muy útil, ya que puede procesar recursivamente todos los datos que haya en un array devuelto por select o selectParent. $datos_post es el array con los datos de los posts, $funcion es el nombre de una función la cual se ejecutará cada vez que se mueva a otro post y &$variable es por si se quiere guardar el resultado en una variable antes de ser imprimidas. Notar que se está usando un "&" antes de la variable ya que asi se guardaran los cambios en $variable.

Spoiler - Sobre &$variable
Supongo que algunos no saben para que es el ampersand("&") antes de una variable, bueno es como hacer un global pero en ocasiones no es posible hacer un global, aquí un ejemplo de "&"$variable.
Ejemplo usando "&" antes de una variable:

$A= 1;
function f($parametro) {
    ++$parametro;
}
$f($A);
echo $A; // Resultado: 1
$f(&$A);
echo $A; // Resultado: 2

Propiedades
  • dblink: Enlace al origen de la base de datos creada con mysql_connect().
  • last_post: Contiene toda la información del último post creado en el objeto al llamar ->create() en un array asociativo a las columnas de la tabla de la db.
  • last_error:  Guarda el último error generado al llamar un método. Si el método retorna false se almacena la causa del error en esta propiedad.
Aquí termina la introducción, en las siguientes entradas de este tema se explicará el uso de cada método. Comencemos por insert(), click aquí.

1 comentario:

  1. buenos dias amigos tengo un problema con un migrador de dato al subir el documento al servidor mi sale un ruta que no es C//fakepath pero no se me muestra el contenido. sabra algo sobre esto si le a pasado.

    ResponderEliminar