C贸mo crear un blog con PHP Orientado a Objetos

C贸mo crear un blog con PHP Orientado a Objetos Despu茅s de un tiempo, retomamos la publicaci贸n de art铆culos sobre Desarrollo Web con PHP y MySQL. Este art铆culo es uno de los mejores que he encontrado, porque si bien trata de algo interesante como es la creaci贸n de un blog, busca ser una introducci贸n amena y sencilla a la programaci贸n orientada a objetos. A煤n as铆, para la perfecta comprensi贸n del presente tutorial asumimos que el lector tiene conocimientos b谩sicos de PHP, MySQL, XHTML y tambi茅n, Javascript/jQuery.

Al final de art铆culo pueden ver una demostraci贸n y descargar el c贸digo fuente...

Parte 1.- Creando la Base de Datos

Antes de dirigirnos a nuestro cliente MySQL y empezar a crear nuestras tablas, debemos establecer lo que queremos en nuestro blog. Evidentemente, los items que nuestro blog necesita (en cada post) son un t铆tulo, el post, un autor y la fecha en que fue publicado.

Ahora, podr铆amos hacer que nuestra tabla guarde toda esta informaci贸n. Pero, que una tabla maneje toda la informaci贸n de nuestro blog no ser铆a eficiente. Por ejemplo, podr铆a almacenar el nombre del autor en la misma tabla que la de los posts del blog, pero 驴no les gustar铆a almacenar tambi茅n el correo electr贸nico del autor? Si la respuesta es s铆, pues a帽adir otro campo a nuestra tabla 鈥渂log_posts 鈥漵er铆a la soluci贸n obvia.

El problema viene cuando en el camino se desea cambiar la direcci贸n de correo de ese autor. Ahora tenemos que cambiarlo para cada post que hemos creado.

Entonces, 驴qu茅 podemos hacer? Lo mejor es crear una tabla llamada 鈥淧eople鈥 y en ella almacenaremos toda la informaci贸n que necesitemos del autor (como las direcciones de correo electr贸nico, URL, su nombre y su n煤mero de identificaci贸n exclusivo). Luego, en nuestra tabla blog posts apuntaremos al n煤mero de identificaci贸n exclusivo del autor. Este ID es una clave exclusiva y externa a la tabla, pero que nos servir谩 para establecer una relaci贸n entre la tabla blog_post y la tabla People.

Otra cosa que queremos que nuestro blog tenga es una etiqueta para cada post. Una vez m谩s, si queremos que nuestra base de datos sea eficiente, hay que crear una tabla separada para nuestros tags.

Ahora bien, el problema con utilizar la relaci贸n uno a uno con la tabla tags, es que algunas veces los post tienen m谩s de un tag; entonces, lo que debemos realizar es una relaci贸n uno-a-varios. Para realizar esto, debemos crear una tabla adicional, que llamaremos 鈥渂log_post_tags鈥 y que llevar谩 dos claves for谩neas, una ser谩 el ID de los posts y la otra ser谩 la ID de los tags, con la que que la tabla 鈥渂log_post鈥 se asociar谩. De esta manera, podemos asignar un mayor n煤mero de etiquetas a un post del blog; pero donde no podremos recuperar la informaci贸n de la etiqueta espec铆fica con una simple consulta MySQL.

Ahora que hemos esbozado lo que queremos en nuestra base de datos, vamos a crearla. En el tutorial usaremos phpMyAdmin ya que es el cliente MySQL m谩s utilizado. Hay algunas convenciones sobre la creaci贸n de bases de datos, tablas y nombres de los campos. A m铆 personalmente me gusta crearlas todas en min煤sculas (en ingl茅s) y ponerles guiones bajos en lugar de espacios.

Nota: Si usted no utiliza PHP y MySQL en su sistema o servidor, puede descargar e instalar Apache, PHP y MySQL, utilizando MAMP para Mac y WAMP para PC. Son muy buenos.

Como primer paso vamos a crear nuestra base de datos, la llamaremos 鈥渘ettuts_blog鈥.

bd-1

A continuaci贸n, crearemos nuestras tablas, la primera ser谩 鈥渂log_posts鈥.

bd-2

鈥渂log_posts鈥 tendr谩 5 campos "id", "title", "post", "author_id", y "date_posted". "id" ser谩 utilizado como clave primaria y con el atributo auto-increment. Con esto generaremos una clave 煤nica para id. Cada vez que a帽adamos un post se ir谩 incrementando el n煤mero id de cada post.

Ahora necesitamos determinar el tipo de variable de cada campo. El campo id ser谩 int, peque帽o y num茅rico, 煤nicamente puede ser un n煤mero y tendr谩 un l铆mite de 11 d铆gitos. El campo 鈥渢itle鈥 ser谩 varchar, con un m谩ximo de 255 caracteres. El campo 鈥減ost鈥 ser谩 de tipo 鈥渢ext鈥 y no tendr谩 un l铆mite m谩ximo de caracteres, porque los post suelen ser muy largos. 鈥渁utor_id鈥 ser谩 del mismo tipo que el campo 鈥渋d鈥, pero no lo estableceremos como clave primaria ni como auto increment, y finalmente el campo 鈥渄ate_posted鈥 ser谩 del tipo date.

bd-3

Nuestra siguiente tabla ser谩 鈥減eople鈥. No la estamos llamando 鈥渁uthors鈥 porque a煤n no sabemos qu茅 permisos tendr谩n los usuarios registrados del blog. Algunos dejar谩n comentarios a los posts y por ello, no pueden ser considerados como autores.

鈥減eople鈥 contendr谩 cinco campos: 鈥渋d鈥, "first_name", "last_name", "url", e "email".

鈥渋d鈥 ser谩 un campo int, primary key y auto increment, de la misma manera en que lo hicimos con el id de 鈥渂log_posts鈥. "first_name", "last_name", "url", y "email" ser谩n todos del tipo varchar con un n煤mero m谩ximo de 255 caracteres.

Nuestra siguiente tabla ser谩 鈥渢ags鈥 y por ahora contendr谩 煤nicamente dos campos: 鈥渋d鈥 y 鈥渘ame鈥. En futuros tutoriales iremos ampliando esta tabla, haci茅ndola m谩s compleja, a帽adi茅ndole una descripci贸n, pero para este tutorial no ser谩 necesario. Como dijimos antes, 鈥渋d鈥 ser谩 establecido como int, primary key y auto increment. 鈥渘ame鈥 ser谩 del tipo varchar y tendr谩 un m谩ximo de 255 caracteres.

Y nuestra 煤ltima tabla ser谩 鈥渂log_post_tags鈥, y contendr谩 dos campos: 鈥渂log_post_id鈥 y 鈥渢ag_id鈥. Ambos ser谩n del tipo int con un m谩ximo de 11 caracteres. Como comprender谩n, no estableceremos ninguna clave primaria para esta tabla. Esto se debe a que nunca vamos a recibir datos a esta tabla a menos que nos la pida un post espec铆fico o todos los post de una tag ID espec铆fica.

Parte 2.- Creando nuestros objetos en PHP

Antes de empezar a ver nuestro c贸digo PHP necesitamos crear nuestros archivos y carpetas, para este tutorial tendremos nuestro index.php en el directorio ra铆z y luego incluiremos carpetas donde almacenar nuestras hojas de estilo CSS, nuestros archivos JavaScript, el fichero includes.php que har谩 referencia a nuestros objetos y a la conexi贸n MySQL, y blogspot.php que contendr谩 nuestro objeto BlogPost.

Ahora que tenemos lista nuestra base de datos, necesitamos crear los objetos en PHP que recuperen la data para nosotros. Objetos en programaci贸n son la manera de agrupar atributos (o variables) y m茅todos, todos relacionados a una misma cosa. Los objetos nos ayudan a organizar nuestros programas de una manera m谩s eficiente Antes de dar el salto a los objetos para nuestro blog, perm铆tanme solamente crear un simple objeto, a fin de ilustrar lo que son en t茅rminos de la 鈥渧ida real鈥.

Nuestro objeto ser谩 llamado 鈥淏icicleta鈥; ahora bien, son dos tipos de cosas las que cada objeto tiene, propiedades y m茅todos. Las Propiedades definen el objeto y los m茅todos son lo que el objeto hace. Por ejemplo, nuestro objeto Bicicleta tendr谩 propiedades como el 鈥渢ama帽o鈥, 鈥渘煤mero de llantas鈥, etc. Para los m茅todos podr铆amos tener algo as铆 como el 鈥淧edal鈥.

Regresando a nuestro blog, s贸lo necesitamos un objeto , al cual llamaremos 鈥淏logPost鈥. BlogPost tendr谩 seis propiedades: id, el t铆tulo, post, el autor, las etiquetas y la fecha de publicaci贸n. Por lo que podemos hacerlo en PHP.

Para definir un objeto en PHP, lo definimos como una 鈥渃lase鈥. Una clase es la estructura de cada objeto, o como la wikipedia lo describe, 鈥淓n la programaci贸n orientada a objetos, una clase es un lenguaje de programaci贸n que se utiliza como un plan detallado para crear un objeto concreto. Este plan detallado incluye atributos y m茅todos que todos los objetos creados comparten (http://en.wikipedia.org/wiki/Concrete_class). Ahora pasemos a abrir nuestra p谩gina blogspost.php y definir nuestro primer objeto.

Nota: En cada secci贸n del tutorial, ir茅 abriendo y cerrando las etiquetas PHP, para que puedan incluirlas directamente al inicio o final de cada documento.

class BlogPost
{
}

En nuestra clase necesitamos definer nuestras propiedades. Para hacer esto, necesitamos crear variables pero como p煤blicas (鈥減ublic鈥). S贸lo una peque帽a anotaci贸n, si estamos utilizando PHP4 necesitaremos usar 鈥渧ar鈥 en vez de 鈥減ublic鈥.

<?php
class BlogPost
{
   
public $id;
   
public $title;
   
public $post;
   
public $author;
   
public $tags;
   
public $datePosted;
}
?>

Ahora que tenemos todas nuestras propiedades definidas, vamos a definir nuestro primer m茅todo. Los m茅todos tambi茅n se describen como funciones, pero la principal diferencia es que un m茅todo es una funci贸n dentro de un objeto. Por lo tanto, todos los m茅todos son tambi茅n funciones, pero no todas las funciones son m茅todos.

Nuestro primer m茅todo ser谩 lo que se llama un constructor (鈥渃onstructor鈥), este m茅todo es autom谩ticamente llamado cada vez que realicemos una instancia de nuestro objeto BlogPost.

El uso com煤n de un constructor es que con 茅l podemos crear un nuevo objeto y definir sus propiedades r谩pidamente.

Entonces, lo que queremos hacer es crear una nueva funci贸n llamada __construct() y le pasaremos 5 valores: id, title, post, author id y date posted. A cada nombre de variable nosotros le colocaremos en su inicio la palabra 鈥渋n鈥, para poder entender en nuestras funciones cuales variables son incluidas.

<?php
class BlogPost
{
   
public $id;
   
public $title;
   
public $post;
   
public $author;
   
public $tags;
   
public $datePosted;

    function
__construct($inId, $inTitle, $inPost, $inAuthorId, $inDatePosted)
    {

    }
}
?>

El problema aqu铆 es que, con este c贸digo actual, cada vez que creemos una nueva instancia de BlogPost necesitaremos suministrar todas esas variables. Pero 驴qu茅 pasar铆a si lo que queremos es hacer una nueva entrada en el blog y no hemos definido todav铆a esas variables?

Para solucionar esto, tenemos que "sobrecargar" (overload) los argumentos en favor de nuestra funci贸n de manera que si queremos llamar a la funci贸n y no suministrar uno de los argumentos, se ajuste autom谩ticamente al valor predeterminado.

<?php
function __construct($inId=null, $inTitle=null, $inPost=null, $inPostFull=null, $inAuthorId=null, $inDatePosted=null)
{
}
?>

Como pueden ver, todo lo que hacemos para cumplir nuestra tarea es predefinir cada argumento con el valor "null". Ahora dentro de nuestro constructor, tenemos que establecer cada una de nuestras variables transmitiendo sus valores. Para hacer esto, necesitamos almacenarlo en nuestro objeto. Esto podemos hacerlo utilizando la palabra clave 鈥渢his鈥. A diferencia de muchos lenguajes de programaci贸n para acceder a una propiedad en PHP usaremos "->", mientras que en la mayor铆a de los lenguajes (JavaScript, ASP.NET) se utiliza ".".

<?php
function __construct($inId=null, $inTitle=null, $inPost=null, $inPostFull=null, $inAuthorId=null, $inDatePosted=null)
{
   
$this->id = $inId;
   
$this->title = $inTitle;
   
$this->post = $inPost;
}
?>

Esto funciona para id, title y post. Pero 驴qu茅 pasa con los dem谩s? Para date, vamos a necesitar reformatear los datos que obtuvimos de MySQL, a fin de hacerlo m谩s legible. Eso se realiza f谩cilmente. S贸lo necesitamos realizar un explode (tambi茅n conocido como divisi贸n en otros lenguajes de programaci贸n) y luego volver a unirlo. MySQL nos proporciona la fecha en este formato aaaa-mm-dd, por lo que si realizamos un explode utilizando a "-" como separador obtendremos tres valores. El primero ser谩 el a帽o, el siguiente el mes, y el 煤ltimo ser谩 el d铆a. Ahora todo lo que hacemos es agruparlo en el formato que queramos. Me quedo con mm/dd/yyyy.

<?php
$splitDate
= explode("-", $inDatePosted);
$this->datePosted = $splitDate[1] . "/" . $splitDate[2] . "/" . $splitDate[0];
?>

Para conocer al autor, todo lo que tenemos que hacer es preguntarle a nuestra base de datos sobre la persona con el n煤mero de identificaci贸n de nuestro autor. Podemos hacer esto con una consulta b谩sica MySQL.

<?php
$query
= mysql_query("SELECT first_name, last_name FROM People WHERE id = " . $inAuthorId);
$row = mysql_fetch_assoc($query);
$this->author = $row["first_name"] . " " . $row["last_name"];
?>

Left Join

Ahora, las etiquetas ser谩n ligeramente m谩s dif铆ciles. Vamos a necesitar dialogar con la base de datos, por lo que necesitamos crear una consulta MySQL. No hay por qu茅 preocuparse por la conexi贸n a la base de datos ahora mismo, ya que la definiremos fuera de esta clase.

Por ahora todo lo que tenemos es el ID de los posts del blog; el cual lo podemos comparar con los tags del post en nuestra tabla blog_post_tags; as铆 obtendr铆amos la ID de la etiqueta; sin embargo, para obtener el nombre de la etiqueta tendr铆amos que hacer otra consulta. Esto no es bueno; si queremos ser eficientes, tenemos que hacerlo todo en tan s贸lo una consulta!

Para ello vamos a hacer lo que se llama un Left Join, esto significa que vamos a seleccionar los datos de otra tabla, pero s贸lo cuando coincida con los datos de la "izquierda" o nuestros otros datos seleccionados. As铆 que primero vamos a obtener 煤nicamente todas las IDs de las etiquetas que se asocian con nuestro ID del post en la tabla blog_post_tags.

<?php
$query
= mysql_query("SELECT * FROM blog_post_tags WHERE blog_post_tags.blog_post_id = " . $inId);
?>

Ahora a帽adiremos a nuestro left join y haremos una consulta que 煤nicamente nos retorne los datos de la tabla tags:

<?php
$query
= mysql_query("SELECT tags.* FROM blog_post_tags LEFT JOIN (tags) ON (blog_post_tags.tag_id = tags.id) WHERE blog_post_tags.blog_post_id = " . $inId);
?>

As铆 pues, la consulta seleccionar谩 todo lo que contengan las tablas tags y blog_posts_tags, donde blog_post_tags.blog_post_id ser谩 igual al valor provisto por nosotros en la consulta y estar谩 acompa帽ado de la informaci贸n de cada tag en la misma fila.

Ahora lo que vamos a hacer es procesar los datos en PHP con un simple bucle while. Vamos a crear dos matrices (arrays) que tengan nuestros datos: Una para el nombre de la etiqueta y la otra para la id de la etiqueta. Tambi茅n haremos un string con todos nuestros tags.

En primer lugar necesitamos establecer nuestro 鈥淣o Tags鈥, por si no retorna ning煤n dato de nuestra consulta MySQL. Caso contrario, devolver谩 los nombres de la etiqueta.

<?php
$postTags
= "No Tags";
$tagArray = array();
$tagIDArray = array();
while(
$row = mysql_fetch_assoc($query)
{
   
array_push($tagArray, $row["name"]);
   
array_push($tagIDArray, $row["id"]);
}
?>

Ahora vamos a verificar si la matriz tiene una longitud mayor a cero (no queremos procesar todo nuestro c贸digo si no vamos a obtener alg煤n resultado). Luego, para unir cada etiqueta en nuestro array de nombres de etiquetas, vamos a concatenar un string de las etiquetas. Vamos a utilizar la sencilla declaraci贸n if else.

<?php
if (sizeof($tagArray) > 0)
{
    foreach (
$tagArray as $tag)
    {
        if (
$postTags == "No Tags")
        {
           
$postTags = $tag;
        }
        else
        {
           
$postTags = $postTags . ", " . $tag;
        }
    }
}
$this->tags = $postTags;
?>

Como habr谩s notado, no hemos utilizado la matriz con el tag ID. Vamos a dejar esto por ahora y volveremos a ello m谩s tarde. S贸lo queremos poner nuestro blog en marcha.

El 煤ltimo paso de nuestra clase es comprobar que las variables tengan un valor; de lo contrario habr铆a un error (se modificar铆a la propiedad actual del objeto a nada). Aqu铆 esta toda la clase BlogPost con el a帽adido 煤ltimo:

<?php
class BlogPost
{

public $id;
public $title;
public $post;
public $author;
public $tags;
public $datePosted;

function
__construct($inId=null, $inTitle=null, $inPost=null, $inPostFull=null, $inAuthorId=null, $inDatePosted=null)
{
    if (!empty(
$inId))
    {
       
$this->id = $inId;
    }
    if (!empty(
$inTitle))
    {
       
$this->title = $inTitle;
    }
    if (!empty(
$inPost))
    {
       
$this->post = $inPost;
    }

    if (!empty(
$inDatePosted))
    {
       
$splitDate = explode("-", $inDatePosted);
       
$this->datePosted = $splitDate[1] . "/" . $splitDate[2] . "/" . $splitDate[0];
    }

    if (!empty(
$inAuthorId))
    {
       
$query = mysql_query("SELECT first_name, last_name FROM people WHERE id = " . $inAuthorId);
       
$row = mysql_fetch_assoc($query);
       
$this->author = $row["first_name"] . " " . $row["last_name"];
    }

   
$postTags = "No Tags";
    if (!empty(
$inId))
    {
       
$query = mysql_query("SELECT tags.* FROM blog_post_tags LEFT JOIN (tags) ON (blog_post_tags.tag_id = tags.id) WHERE blog_post_tags.blog_post_id = " . $inId);
       
$tagArray = array();
       
$tagIDArray = array();
        while(
$row = mysql_fetch_assoc($query))
        {
           
array_push($tagArray, $row["name"]);
           
array_push($tagIDArray, $row["id"]);
        }
        if (
sizeof($tagArray) > 0)
        {
            foreach (
$tagArray as $tag)
            {
                if (
$postTags == "No Tags")
                {
                   
$postTags = $tag;
                }
                else
                {
                   
$postTags = $postTags . ", " . $tag;
                }
            }
        }
    }
   
$this->tags = $postTags;
}

}
?>

Ahora que nuestro clase esta completa, hemos acabado con lo m谩s duro! Ahora todo lo que tenemos que hacer es establecer la conexi贸n con la base de datos y mostrar el HTML de nuestros posts!

Parte 3.- Obtenci贸n de los datos de MySQL y visualizaci贸n con PHP

Antes de hacer algo, tenemos que crear nuestro archivo includes.php para hacer una referencia a nuestro objeto BlogPost y conectarse a nuestra base de datos MySQL. En primer lugar, incluiremos nuestro objeto con una simple declaraci贸n include:

<?php
include 'blogpost.php';
?>

Ahora a帽adiremos nuestra conexi贸n a la base de datos:

<?php
$connection
= mysql_connect("localhost", "username", "password") or die ("<p class='error'>Sorry, we were unable to connect to the database server.</p>");
$database = "nettuts_blog";
mysql_select_db($database, $connection) or die ("<p class='error'>Sorry, we were unable to connect to the database.</p>");
?>

Como paso siguiente, necesitamos recuperar nuestros posts de la base de datos. Para esto, vamos a crear una funci贸n con dos argumentos. Ambas tendr谩n valores por defecto, por lo que podremos llamar a la funci贸n con 0, 1 o 2 argumentos.

<?php
function GetBlogPosts($inId=null, $inTagId=null)
{

}
?>

Dentro de nuestra funci贸n, necesitamos comprobar los argumentos que pasaremos y crear nuestra consulta MySQL acorde a ellos.

<?php
function GetBlogPosts($inId=null, $inTagId =null)
{
    if (!empty(
$inId))
    {

    }
    else if (!empty(
$inTagId))
    {

    }
    else
    {

    }
}
?>

As铆 pues, lo que estamos haciendo aqu铆 es preguntarnos si cada uno de los argumentos no est谩n vac铆os. Ahora vamos a escribir una consulta en funci贸n de las variables que tenemos. Si lo que tenemos es el ID de un post, obtendremos la informaci贸n de ese post 煤nicamente; si lo que hemos pasado a la funci贸n es un inTagId lo que obtendremos ser谩n todos los post que tienen ese tag; y en caso contrario, por defecto obtendremos todos los post guardados en nuestra base de datos.

<?php
if (!empty($inId))
{
   
$query = mysql_query("SELECT * FROM blog_posts WHERE id = " . $inId . " ORDER BY id DESC");
}
else if (!empty(
$inTagId))
{
   
$query = mysql_query("SELECT blog_posts.* FROM blog_post_tags LEFT JOIN (blog_posts) ON (blog_post_tags.postID = blog_posts.id) WHERE blog_post_tags.tagID =" . $tagID . " ORDER BY blog_posts.id DESC");
}
else
{
   
$query = mysql_query("SELECT * FROM blog_posts ORDER BY id DESC");
}
?>

El paso siguiente es procesar los datos devueltos por cada consulta, crear los objetos y a帽adirlos a un array de retorno.

<?php
$postArray
= array();
while (
$row = mysql_fetch_assoc($query))
{
   
$myPost = new BlogPost($row["id"], $row['title'], $row['post'], $row['postfull'], $row['firstname'] . " " . $row['lastname'], $row['dateposted']);
   
array_push($postArray, $myPost);
}
return
$postArray;
?>

Aqu铆 est谩 el c贸digo del fichero includes.php completo:

<?php
include 'blogpost.php';

$connection = mysql_connect('localhost', 'username', 'password') or die ("<p class='error'>Sorry, we were unable to connect to the database server.</p>");
$database = "nettuts_blog";
mysql_select_db($database, $connection) or die ("<p class='error'>Sorry, we were unable to connect to the database.</p>");

function
GetBlogPosts($inId=null, $inTagId =null)
{
    if (!empty(
$inId))
    {
       
$query = mysql_query("SELECT * FROM blog_posts WHERE id = " . $inId . " ORDER BY id DESC");
    }
    else if (!empty(
$inTagId))
    {
       
$query = mysql_query("SELECT blog_posts.* FROM blog_post_tags LEFT JOIN (blog_posts) ON (blog_post_tags.postID = blog_posts.id) WHERE blog_post_tags.tagID =" . $tagID . " ORDER BY blog_posts.id DESC");
    }
    else
    {
       
$query = mysql_query("SELECT * FROM blog_posts ORDER BY id DESC");
    }

   
$postArray = array();
    while (
$row = mysql_fetch_assoc($query))
    {
       
$myPost = new BlogPost($row["id"], $row['title'], $row['post'], $row['postfull'], $row["author_id"], $row['dateposted']);
       
array_push($postArray, $myPost);
    }
    return
$postArray;
}
?>

Ahora nos podemos dirigir a mostrar nuestros datos. D茅jenme abrir nuestro fichero index.php e iniciar una p谩gina HTML b谩sica. Dentro de nuestro body crearemos una div 鈥渕ain鈥 que contendr谩 nuestro blog. Colocaremos el t铆tulo de nuestro post y luego un segundo div dentro de main que se llame "blogPosts".

<div id="main">
<h1>My Simple Blog</h1>
<div id="blogPosts">

</div>
</div>

Dentro de nuestro div blogPosts, pondremos un poco de PHP que muestre nuestros posts. Primero incluiremos nuestro fichero includes.php y luego llamaremos a la funci贸n GetBlogPosts sin pasarle ning煤n argumento, as铆 obtendremos todos los posts de nuestro blog dentro de un array llamado blogPosts.

<?php
include 'includes/includes.php';

$blogPosts = GetBlogPosts();
?>

Ahora, usaremos un bucle foreach para mostrar nuestros posts. Lo que hace un bucle foreach es tomar un array y ejecutar un trozo de c贸digo por cada 铆tem que el array contenga. As铆 podemos ahorrar c贸digo con una tarea repetitiva.

<?php
foreach ($blogPosts as $post)
{

}
?>

Dentro del bucle, usaremos la variable $post como el array actual, y como $blogPost es un array del objeto BlogPost, podemos simplemente utilizar "->" para acceder a cada propiedad que queramos. D茅jenme empezar por escoger el t铆tulo de cada post y a帽adirle la etiqueta < br/ >, como ejemplo.

<?php
foreach ($blogPosts as $post)
{
    echo
$post->title . "<br/>";
}
?>

Si vamos a nuestra base de datos e insertamos algunos datos falsos, y luego abrimos nuestro fichero index.php en el navegador, obtendremos algo como esto:

blog-1

Vamos a estructurar nuestros posts en HTML. Cada post estar谩 dentro de un div con una clase "post". Luego, tendremos el t铆tulo dentro de una etiqueta H1 y el post dentro de etiquetas < P >< / P >.

<?php
foreach ($blogPosts as $post)
{
    echo
"<div class='post'>";
    echo
"<h2>" . $post->title . "</h2>";
    echo
"<p>" . $post->post . "</p>";
    echo
"</div>";
}
?>

Luego, vamos a a帽adirle al final de cada post el autor del post, la fecha de publicaci贸n y los tags del post. Toda esta informaci贸n la pondremos dentro de una etiqueta span con la clase 鈥渇ooter鈥.

<?php
foreach ($blogPosts as $post)
{
    echo
"<div class='post'>";
    echo
"<h1>" . $post->title . "</h1>";
    echo
"<p>" . $post->post . "</h1>";
      echo
"<span class='footer'>Posted By: " . $post->author . " Posted On: " . $post->datePosted . " Tags: " . $post->tags . "</span>";
    echo
"</div>";
}
?>

Ahora, veamos nuevamente nuestro fichero index.php en el navegador:

blog-2

Todo funciona muy bien! A continuaci贸n, d茅jenme a帽adirle algo de estilo.

blog-3

Mucho mejor, ustedes pueden ver el resultado en l铆nea desde aqu铆 o al final del post en el enlace "demo". Esto es todo el tutorial. En uno subsiguiente, le a帽adiremos m谩s funcionalidad a nuestro blog, incluyendo alguna bonita herramienta con AJAX!

Espero que ahora tengan una mejor comprensi贸n de c贸mo la programaci贸n orientada a objetos funciona. Incluso, si terminan haciendo lo que la mayor铆a hace (Utilizar un framework), es muy importante conocer los fundamentos b谩sicos.

Cr茅ditos: El art铆culo original en ingles fue publicado en Nettuts por Ben Mills y es uno de las mejores explicaciones que he encontrado. Espero que la traducci贸n les sea de ayuda, al igual que su contenido.

Demo | http://benmillsdesigns.com/SimpleBlog/
C贸digo fuente | Descargar

juas juas que maravilla,

juas juas que maravilla, ma帽ana por la ma帽an me lo leer茅 entero que tiene muy buena pinta!

PD : me recuerda a un libro que tengo sobre php que te lo explica mas o menos as铆!

Enviado por gruncho (no verificado) el Vie, 10/24/2008 - 06:29.
Este tutorial est谩 muy bueno,

Este tutorial est谩 muy bueno, y es muy f谩cil de entender. Saludos!

Enviado por Gerald (no verificado) el Vie, 10/24/2008 - 08:00.
Este articulo vale la pena,

Este articulo vale la pena, esta muy bueno gracias por publicarlo amigos

Enviado por Refjack (no verificado) el Vie, 10/24/2008 - 21:42.
Me alegra que vuelvas a

Me alegra que vuelvas a publicar art铆culos sobre desarrollo en general. Me "enganche" al blog por este tipo de art铆culos y aunque sigo ley茅ndolo, cada vez ten铆a menos inter茅s para m铆 ya que solo hac铆as referencias a novedades, curiosidades para geeks, etc.

Gracias por tu esfuerzo.

Enviado por OsKar (no verificado) el S谩b, 10/25/2008 - 03:43.
Me gusto, un gran esfuerzo

Me gusto, un gran esfuerzo con este tuto ;)

Enviado por Manuel Cama (no verificado) el S谩b, 10/25/2008 - 22:47.
Muy buen aporte, yo tambi茅n

Muy buen aporte, yo tambi茅n program茅 mi propio blog porque no me gustan los CMS.

Saludos.

Enviado por MijT (no verificado) el S谩b, 10/25/2008 - 23:48.
No pusiste los creditos de

No pusiste los creditos de http://nettuts.com Pero gracias por la traduccion!

Enviado por Anonymous (no verificado) el Mar, 10/28/2008 - 15:50.
Hay un error al asignar el

Hay un error al asignar el valor de la fecha cuando se crea la instancia de la clase: $row['dateposted'] debe de quedar asi $row['date_posted']

$myPost = new BlogPost($row["id"], $row['title'], $row['post'], $row['postfull'], $row["author_id"], $row['dateposted']);

debe de quedar asi:

$myPost = new BlogPost($row["id"], $row['title'], $row['post'], $row['postfull'], $row["author_id"], $row['date_posted']);

Enviado por Raven (no verificado) el Mar, 10/28/2008 - 18:15.
Gracias por la precisi贸n,

Gracias por la precisi贸n, Raven.

Enviado por baluart el Mi茅, 10/29/2008 - 09:20.
Buenas, excelente tutorial,

Buenas, excelente tutorial, pero... por que clases? quiero decir, llegue aqui buscando en google la utilidad de las clases, pero francamente lo veo mas f谩cil sin usar clases, en fin, espero tu respuesta.

Saludos, jay.

Enviado por jay (no verificado) el Dom, 11/02/2008 - 07:08.
saludos. este tutorial

saludos.

este tutorial aplica para la modificaci贸n de un blogger?

Enviado por Anonymous (no verificado) el Dom, 11/02/2008 - 11:04.
Buenas, siento decirte que

Buenas, siento decirte que no.

Enviado por jay (no verificado) el Lun, 11/03/2008 - 11:30.
hola descargue el codigo

hola descargue el codigo fuente y no se como hacerlo funcionar solo cambie un nombre donde dice mydatabase por el nombre de la base de datos que tu mismo diste.
ya tengo la base de datos y cuando ejecuto el index desde localhost lo unico que veo es my simple blog se que es mucho pedir pero podrias dejar listos los escript para copiar y pegar con sus respectivos nombre y ubicacion seria genal y me parece muy bueno el tuto solo que se muy poco de php o lo que es mejor nada asi que no se como hacerle
g

Enviado por novatito (no verificado) el Lun, 12/01/2008 - 17:55.
gracias me parece muy bueno

gracias me parece muy bueno solo que cuando lo corro l unico me sale es my simple blog

Enviado por novatito (no verificado) el Lun, 12/01/2008 - 17:59.
no me funciona solo dice my

no me funciona solo dice my sumple blog

Enviado por novatito (no verificado) el Lun, 12/01/2008 - 18:02.
Coloquen la siguiente linea

Coloquen la siguiente linea empezando index.php

error_reporting(E_ALL);

para mostrar el error que les aparece. As铆 podr茅 ayudarlos.

Enviado por baluart el Mi茅, 12/10/2008 - 03:20.
ya lo puse el error y no me

ya lo puse el error y no me sale nada,,, en la pagina solo me sale my simple blogque

Enviado por juan pablo (no verificado) el Lun, 06/15/2009 - 11:54.
solo dice my simple blog y no

solo dice my simple blog y no sale nada

Enviado por juan pablo (no verificado) el Lun, 06/15/2009 - 11:56.
hola muy buen tutorial espero

hola muy buen tutorial espero la siguiente entrega para ver como quedan las etiquetas mas personalizadas saludos

Enviado por orochies (no verificado) el Mi茅, 06/24/2009 - 20:12.
Me aparece un error lo

Me aparece un error lo descargue y lo hizo de forma manual y es igual que pasa este en el error que tira el index:
My Simple Blog

Warning: include(blogspot.php) [function.include]: failed to open stream: No such file or directory in C:\wamp\www\blog\includes.php on line 2

Warning: include() [function.include]: Failed opening 'blogspot.php' for inclusion (include_path='.;C:\php5\pear') in C:\wamp\www\blog\includes.php on line 2

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'username'@'localhost' (using password: YES) in C:\wamp\www\blog\includes.php on line 4

Sorry, we were unable to connect to the database server.

Enviado por Luis008 (no verificado) el Lun, 06/29/2009 - 02:43.
Asegurate que el include este

Asegurate que el include este apuntando la ruta correcta.

En includes.php cambia el include a

include("./blogspot.php");

o

include("../blogspot.php");

o

include ("includes/blogspot.php");

Tambi茅n puedes incluirlo directamente desde el index.

Si solucionas el problema, no olvides comentarlo.

Saludos

Enviado por baluart el Lun, 06/29/2009 - 15:04.
Hola a todos, tengo una

Hola a todos,
tengo una peque帽a duda, alguien sabe como hacer para poner una especie de formulario con el cual ingresar datos a la base de datos?, por ejemplo que se inscriban primero al blog, y luego que si se pueda escribir en el blog?, y ahi dependiendo de cada input se ingrese el titulo del post, el post etc? por favor, es urgente! mil gracias!!!
tal vez sea mucho pedir XD, es que hice un formulario e intente hacer que al darle click al boton submit se ingresaran datos al la base de datos, pero cuando estaba escribiendo el codigo me di cuenta de que no tenia el conocimiento suficiente :S, de nuevo gracias a todos :D

Enviado por Bigj (no verificado) el Mar, 07/07/2009 - 13:06.
que onda te respondieron como

que onda te respondieron como poder hacer un formulario y s铆 te respondiron corremelo no?

Enviado por jack (no verificado) el Vie, 08/14/2009 - 14:16.
Parece que esta bueno pero no

Parece que esta bueno pero no veo nada tampoco. Solo dice "My Simple Blog" y donde tendria que estar el contenido se ve solo una linea blanca. Ya he probado montones de cosas y no se arregla.
Alguien sabe algo, tengo mi pagina en yahoo small business. Puede ser un problema en Yahoo?

Enviado por FMG (no verificado) el S谩b, 07/25/2009 - 11:12.
alguein sabe como hacer algo

alguein sabe como hacer algo asic como escribo y de repente se va a la pagina y ya no se puede editar es decir q mi comentario se vea aya arriba

respondamen novato aprendiendo php

Enviado por jack (no verificado) el Vie, 08/14/2009 - 14:44.
Muy bueno el art铆culo. PHP es

Muy bueno el art铆culo. PHP es un grande dentro de los grandes y su facilidad hace que cada vez mas personas trabajen con 茅l.
Tratemos de hacer un c贸digo cada vez mejor, programemos orientado a objetos!
Saludos a todos

http://www.phppoo.freezoka.com/es/

Enviado por Anonymous (no verificado) el Lun, 09/07/2009 - 13:24.

Deja tu comentario

El contenido de este campo se mantiene privado y no se mostrar谩 p煤blicamente.
  • Las direcciones de las p谩ginas web y las de correo se convierten en enlaces autom谩ticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos autom谩ticos de l铆neas y de p谩rrafos.

M谩s informaci贸n sobre opciones de formato