Tutorial: Desarrolla tu propio blog: Slog

hace 3 años y 6 meses - 687 visitas

Slog: un blog simple

Introducción

En este artículo mostraré lo fácil que es crear un sistema propio de publicación de bitácora (o weblog, o blog), y lo haré en formato tutorial, con un sencillo ejemplo: Slog. Slog será un proyecto que iremos construyendo poco a poco en este y en los siguiente tutoriales. En este primer tutorial crearemos un Slog básico, sin muchas funcionalidades, con tan sólo visualización de artículos en listado con paginación, visualización de un artículo, envío de comentarios, y autentificación.

En sucesivos tutoriales continuaremos el desarrollo añadiendo más funcionalidades, como un editor WYSIWYG, un panel de administración, moderación de comentarios, permalinks, estadísticas, pingbacks, blogchat, etc.

Al finalizar la serie de tutoriales Slog, obtendremos un CMS muy completo que nada tendrá que envidiar a Wordpress.

Conocimientos previos

Para seguir el tutorial es necesario tener buenos conocimientos de PHP5 y de la OOP (o Programación Orientada a Objetos), además de tener al menos algunas nociones de XHTML, CSS, y SQL. Y por supuesto, se debe disponer de un servidor web, ya que explicar cómo instalar un servidor web se escapa de la intención de este tutorial.

Herramientas

Usaremos PHP5 como lenguaje de script (no PHP4, ya que usaremos la capacidad OOP de PHP5), MySQL como gestor de base de datos, Apache (aunque valdrá cualquier otro), y un editor de texto, a ser posible un IDE como Zend Studio, o Eclipse.

Usaremos además la arquitectura MVC, algo reducida para que no sea muy complejo. Más adelante completaremos un MVC completo. Para el que no sepa qué es MVC, más adelante explicaré resumidamente cómo funciona la arquitectura MVC

¿Qué queremos hacer?

Esta es la primera pregunta que nos debemos hacer antes de empezar a trabajar en un proyecto. Hay que definir lo más detalladamente qué es lo que se quiere conseguir. Después vendrán más preguntas, como ¿cómo lo hacemos? ¿cuánto tiempo nos llevará? ¿cuánto dinero costará? Etc.

Pues bien, queremos hacer una web que tenga básicamente tres páginas:

  • Listado de artículos
  • Visualización de un artículo
  • Edición de artículos

Para poder acceder a ciertas secciones (edición de artículos), el sistema deberá autentificar usuarios. Por lo tanto, nos hará falta una página más con un formulario de login.

Arquitectura MVC

La arquitectura MVC consiste básicamente en separar en una aplicación los datos, las vistas, y el código, obteniendo el Modelo, la Vista, y el Controlador, respectivamente.

Modelo

Un modelo es la parte de la aplicación que maneja la información. En nuestro caso, modelos serán el de usuarios, el de artículos, y el de comentarios. Cada modelo es un objeto, y contiene los métodos necesarios para manejar toda la información que la aplicación necesite.

Los controladores sólo podrán conseguir y almacenar información a través de los modelos.

Vista

La vista es la parte de presentación de la aplicación. En desarrollo web ésta se compone de plantillas (XHTML, XML, CSS, imágenes...).

Un controlador sólo puede mostrar información a través de las vistas.

Controlador

El controlador podría considerarse como el código real y limpio de la aplicación, puesto que en las Vistas el código es casi inexistente, tan sólo limitado a control de flujo, y en los Modelos el código se limita a obtener y almacenar datos de la aplicación a la base de datos.

El controlador obtiene datos de los modelos, y los envía a las vistas.

Los controladores a su vez se dividen en acciones. Un controlador puede realizar varias acciones, y cada acción tendrá su propia vista. Por ejemplo, tenemos un controlador blog, que puede realizar las acciones: list, view, y edit. A cada acción le corresponde su vista, list para listar los artículos del blog, view para ver un artículo completo, y edit para editar un artículo o crear uno nuevo. 

MVC en Slog

En Slog no utilizaremos modelos, al menos en un principio, para no hacer demasiado complejo el tutorial. Por lo tanto, consideraremos que los modelos están dentro de los controladores.

El modelo de datos

Cuando y sólo cuando ya sabemos qué queremos hacer, es hora de crear el modelo de datos.

En este caso, hemos dicho que tendremos usuarios, artículos y comentarios. Detallemos pues las tablas y sus campos.

slog_posts
  1. CREATE TABLE `slog_posts` (
  2. `id_post` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_user` int(10) UNSIGNED NOT NULL,
  4. `title` varchar(255) NOT NULL,
  5. `body` longtext NOT NULL,
  6. `date` int(10) UNSIGNED NOT NULL,
  7. PRIMARY KEY (`id_post`)
  8. );
  • id_post: (clave primaria) id del artículo
  • title: título del artículo
  • body: contenido del artículo
  • date: fecha de publicación en formato timestamp
  • id_user: (clave foránea) id del usuario autor del artículo

 

slog_users
  1. CREATE TABLE `slog_users` (
  2. `id_user` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nick` varchar(50) NOT NULL,
  4. `email` varchar(150) NOT NULL,
  5. `password` varchar(50) NOT NULL,
  6. PRIMARY KEY (`id_user`)
  7. );
  • id_user: (clave primaria) id de usuario
  • nick: nick del usuario
  • email: email del usuario
  • password: password codificada en MD5
slog_comments
  1. CREATE TABLE `slog_comments` (
  2. `id_comment` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_post` int(10) UNSIGNED NOT NULL,
  4. `nick` varchar(100) NOT NULL,
  5. `email` varchar(150) NOT NULL,
  6. `web` varchar(150) NOT NULL,
  7. `body` text NOT NULL,
  8. `date` int(10) UNSIGNED NOT NULL,
  9. PRIMARY KEY (`id_comment`)
  10. );
  • id_comment: (clave primaria) id del comentario
  • id_post: (clave foránea) id del artículo en el que se comenta
  • nick: nick del comentarista
  • email: email
  • web: página web del autor del comentario
  • body: contenido del comentario
  • date: fecha de creación

Árbol de directorios

Debemos ahora definir qué estructura tendrá nuestra apliación. Usaremos una arquitectura MVC simple.

  • /app
    • /controllers
      • /controlador1
        • accion1.php
        • accion2.php
        • ...
      • /controlador2
        • accion1.php
        • ...
      • ...
    • /views
      • /controlador1
        • accion1.tpl
        • ...
      • index.tpl
  • /lib
    • mvc.inc.php
    • db.inc.php
  • index.php
  • style.css

No os asustéis, el árbol de directorios es mucho más complejo que la aplicación en sí.

Podemos apreciar que existen dos directorios en el raíz: /app y /lib. En /app irán los ficheros de nuestro sistema MVC, con /controllers (con un subdirectorio por cada controlador, y un fichero por cada acción) y /views, dividido de igual forma que /controllers. En /views además irá el fichero index.tpl, que es el esqueleto HTML común a todos los controladores, que contendrá las etiquetas HTML, HEAD, y BODY.

En /lib tendremos las librerías que usemos, que de momento son sólo dos: mvc.inc.php con la clase MVC que manejará el sistema MVC, y db.inc.php, el driver MySQL que usaremos.

En index.php inicializaremos la página, instanciaremos las clases MVC y DB, ejecutaremos el MVC, y devolveremos el resultado a la web. 

Código fuente de Slog

A continuación explicaré de la forma más detallada posible el código fuente de Slog, aunque lo mejor es que te descargues el código fuente, donde hay cantidad de comentarios explicativos.

La versión de Slog que explicaré aquí será la v0.1.

/index.php

Este es un fichero pequeño, y creo que se comprende todo perfectamente con tan sólo echarle un vistazo. Realiza las siguientes operaciones:

  1. Inicializa la sesión.
  2. Define la configuración de la base de datos.
  3. Añade las librerías mvc.inc.php y db.inc.php.
  4. Instancia MVC y DB, quedando $db como variable global.
  5. Se establece el título del blog.
  6. Ejecutamos el MVC y lo enviamos a la web.

/lib/db.inc.php

Contiene la clase DB, con los siguientes métodos:

  • query($sql)
    • Ejecuta una sentencia SQL. Si es un INSERT, devolverá el ID del campo autonumérico que se ha creado.
  • fetch($sql=null)
    • Devuelve un registro (array asociativo) de la consulta ejecutada anteriormente con query($sql).
    • Si se especifica un valor en $sql, llamará a query() antes de devolver el registro.
  • fetchOne($sql=null)
    • Devuelve el primer campo como valor del registro obtenido de la consulta.
    • Al igual que fetch(), si se especifica $sql ejecutará la sentencia antes de devolver el campo.
  • fetchAll($sql=null)
    • Devuelve todos los registros obtenidos de la consulta.

La clase se instancia pasando como parámetro en el constructor un array con la configuración de la base de datos. El array debe tener la estructura siguiente (definido en /index.php):

array con la configuración de la base de datos
  1. $db_config = array(
  2. 'host' => 'localhost',
  3. 'name' => 'slog',
  4. 'user' => 'root',
  5. 'pass' => ''
  6. );

Se definen el hostname del servidor de base de datos, el nombre de la base de datos, usuario y contraseña, en host, name, user, y pass, respectivamente.

En /index.php se instancia esta clase en el objeto $db, que quedará en el ámbito de variables en cualquier acción de cualquier controlador.

/lib/mvc.inc.php

Esta librería es la principal, el corazón de nuestro sistema, ya que maneja el sistema MVC. Tomémoslo como una torre de control que procesa la información que se le envía, y llama al controlador/acción adecuado.

Contiene dos métodos: run() y fetch().

  • fetch($tpl)
    • Devuelve el resultado de ejecutar una plantilla. Por ejemplo, se ejecutará fetch('blog/view') para obtener la plantilla localizada en /app/views/blog/view.tpl.
    • En las plantillas se puede acceder a las variables del objeto $mvc (class MVC), referenciado como $this. Por ejemplo el título lo podemos obtener con $this->title, dentro de una plantilla.
  • run()
    1. Guarda en $this->login la estructura con información del usuario que está ingresado en el sistema, o null si el usuario no está registrado (no ha hecho login).
    2. Guarda en $this->title el título de la página (Slog).
    3. Obtiene de $_GET['q'] el controlador/acción a ejecutar. Si no existe esa variable, se ejecutará 'blog/list' (listado de artículos). Pero si existe $_GET['p'] ejecutará 'blog/view' (visualización de artículo) usando como id_post el valor de $_GET['p'].
    4. Mediante require() incluye y ejecuta en el mismo método el controlador/acción obtenido por el paso anterior. Por ejemplo, para ?q=blog/view, aquí incluirá el código /app/controllers/blog/view.php, el cual podrá acceder a las variables del objeto $mvc (class MVC) mediante $this->variable.
    5. Obtiene el código de los bloques (blog/_recientes.tpl y blog/_slog.tpl) y lo guarda en $this->blocks.
    6. Ejecuta la plantilla del controlador/acción (/app/views/blog/view.tpl, siguiendo el ejemplo anterior) mediante $this->fetch(), y almacena el contenido en $this->content.
    7. Finalmente, devuelve la plantilla '/app/views/index.tpl'.

Controladores de la aplicación

Veamos ahora el código de los distintos controladores/acciones de la aplicación. Estos ficheros, recordemos, son ejecutados en el ámbito de variables de MVC, por lo que podemos acceder a sus variables mediante $this->variable. Además, tendremos disponible el objeto $db como variable local.

/app/controllers/blog/list.php

Esta es la acción list del controlador blog. Se ejecutará si la web es llamada mediante http://miblog.com/?q=blog/list, o sencillamente mediante http://miblog.com, ya que este es el controlador/acción usado por defecto.

blog/list.php
  1. $page = isset($_GET['page']) ? intval($_GET['page']) : 0;
  2. $limit = 10;
  3. $start = $page * $limit;
  4.  
  5. $sql = "
  6. SELECT posts.*, users.nick
  7. FROM slog_posts posts
  8. JOIN slog_users users ON (users.id_user = posts.id_user)
  9. ORDER BY posts.date DESC
  10. LIMIT $start, $limit
  11. ";
  12. $this->posts = $db->fetchAll($sql);
  13. $this->page = $page;
  14. $this->title = 'Listado de artí­culos | ' . $this->title;

En la línea #1 obtenemos la página que se quiere visualizar. El valor de la página se nos indica mediante $_GET['page']. En #2 y #3 obtenemos el registro desde donde empezar a obtener articulos y el número máximo de artículos.

#5 creamos la consulta SQL. En #12 ejecutamos la contulta, obteniendo todos los registros posibles, y lo guardamos en $this->posts.

Guardamos (#13) la página actual en $this->page, y anteponemos el título de esta acción en el título de la página (#14).

Tras la ejecución de este código, el MVC ejecutará la vista correspondiente, en este caso /app/views/blog/list.tpl 

/app/controllers/blog/view.php

Esta acción es llamada para que se visualice un artículo completo. Es ejecutada cuando se solicita una página tipo http://miblog.com/?p=21, donde 21 es el id_post del artículo a visualizar.

blog/view.php
  1. $sql = "
  2. SELECT posts.*, users.nick
  3. FROM slog_posts posts
  4. JOIN slog_users users ON (users.id_user = posts.id_user)
  5. WHERE id_post = $this->id_post
  6. ";
  7. $post = $db->fetch($sql);
  8.  
  9. if ($post) {
  10. $sql = "
  11. SELECT *
  12. FROM slog_comments
  13. WHERE id_post = $this->id_post
  14. ";
  15. $comments = $db->fetchAll($sql);
  16. }
  17.  
  18. $this->title = $post['title'] . ' | ' . $this->title;
  19. $this->post = $post;
  20. $this->comments = $comments;
  21.  
  22. $this->allowed_tags = '<p><br><a><img><b><i><strong>';
  23.  
  24. $this->comment_info = isset($_SESSION['comment_info']) ? $_SESSION['comment_info'] : array('message'=>'','nick'=>'','email'=>'','web'=>'','body'=>'');
  25. unset($_SESSION['comment_info']);

Al llegar a este código, disponemos del id de artículo en $this->id_post (obtenido de $_GET['p']). Ejecutamos una consulta SQL para obtener el registro del usuario (#1, #7), y otra consulta para obtener los comentarios del artículo (#10, #15). Ponemos el título del artículo dentro del título de la página (#18), y guardamos los datos del artículo (#19) y de los comentarios (#20).

A continuación ponemos los tags permitidos para escribir comentarios (#22), y guardamos la estructura de datos devuelta por un envío de comentario anterior (#24), si lo hubo.

Finalmente, se ejecutará la plantilla /app/views/blog/view.tpl 

/app/controllers/blog/edit.php

Aquí manejaremos el formulario de edición de noticias. 

blog/edit.php
  1. if (!$this->login) {
  2. header('Location: ?q=user/login');
  3. exit();
  4. }
  5.  
  6. $id_post = isset($_GET['id']) ? intval($_GET['id']) : 0;
  7.  
  8. if ($id_post) {
  9. $sql = "
  10. SELECT posts.*, users.nick
  11. FROM slog_posts posts
  12. JOIN slog_users users ON (users.id_user = posts.id_user)
  13. WHERE id_post = $id_post
  14. ";
  15. $post = $db->fetch($sql);
  16. } else {
  17. $post = array(
  18. 'id_post' => 0,
  19. 'title' => 'Nuevo artí­culo',
  20. 'body' => ''
  21. );
  22. }
  23.  
  24. $this->allowed_tags = '<p><b><i><strong><a><img><ul><ol><li><pre><code>';
  25.  
  26. if (isset($_POST['title']) && isset($_POST['body'])) {
  27. $title = trim(strip_tags($_POST['title']));
  28. $body = trim(nl2br(strip_tags($_POST['body'], $this->allowed_tags)));
  29. $post_id_post = intval($_POST['id_post']);
  30.  
  31. if ($post_id_post == 0) {
  32. $date = time();
  33. $id_user = intval($_SESSION['user']['id_user']);
  34. $sql = "
  35. INSERT INTO slog_posts (id_user, title, body, date)
  36. VALUES ($id_user, '$title', '$body', $date)
  37. ";
  38. $id_post = $db->query($sql);
  39. } else {
  40. if ($id_post == $post_id_post) {
  41. $sql = "
  42. UPDATE slog_posts
  43. SET title='$title', body='$body'
  44. WHERE id_post=$id_post
  45. ";
  46. $db->query($sql);
  47. }
  48. }
  49. header('Location: ?p=' . $id_post);
  50. exit();
  51. }
  52.  
  53. $this->title = 'Edición de ' . $post['title'] . ' | ' . $this->title;
  54. $this->post = $post;

Es importante que sólo los usuarios registrados puedan editar noticias, y por eso al principio se redirecciona a la página de login (#1) si quien accede a esta página no está registrado en el sistema.

Obtenemos el id del artículo (#6) y la información de éste (#8-#21) si es que existe ($id_post != 0).

Si estamos ante un envío de formulario (#26), procesamos los datos, y hacemos INSERT si el artículo es nuevo (#31-#38), o UPDATE si es una modificación de artículo (#40-#46).

Finalmente modificamos el título de la página (#53) y guardamos la información del artículo en $this->post (#54).

Se ejecutará la vista blog/edit.tpl, donde está el formulario de edición. 

/app/controllers/blog/comment.php

Esta acción no tiene ninguna vista, ya que se limita únicamente a procesar el formulario de nuevo comentario enviado desde blog/view.

blog/comment.php
  1. $this->allowed_tags = '<p><br><a><img><b><i><strong>';
  2.  
  3. if (isset($_POST['nick']) && isset($_POST['email']) && isset($_POST['body'])) {
  4. $nick = strip_tags(trim($_POST['nick']));
  5. $email = strip_tags(trim($_POST['email']));
  6. $web = strip_tags(trim($_POST['web']));
  7. $body = nl2br(strip_tags(trim($_POST['body']), $this->allowed_tags));
  8.  
  9. $id_post = intval($_POST['id_post']);
  10. $date = time();
  11.  
  12. if (empty($nick)) {
  13. $comment_message = 'Debes poner un nombre.';
  14. }
  15. if (empty($email)) {
  16. $comment_message = 'Debes poner tu email (no será publicado).';
  17. }
  18. if (empty($body)) {
  19. $comment_message = 'Debes poner algo en el comentario';
  20. }
  21.  
  22. if (!$comment_message) {
  23. $sql = "
  24. INSERT INTO slog_comments (nick, email, web, body, id_post, date)
  25. VALUES ('$nick', '$email', '$web', '$body', $id_post, $date)
  26. ";
  27. $id_comment = $db->query($sql);
  28. header('Location: ?p=' . $id_post . '#comment_' . $id_comment);
  29. } else {
  30. $_SESSION['comment_info'] = array(
  31. 'message' => $comment_message,
  32. 'nick' => $nick,
  33. 'email' => $email,
  34. 'web' => $web,
  35. 'body' => $body
  36. );
  37. header('Location: ?p=' . $id_post . '#comments');
  38. }
  39. exit();
  40. }
  41. header('Location: ?q=');
  42. exit();

Se obtienen las variables del formulario (#4-#9), se hacen las comprobaciones pertinentes de validación (#12-19), y si no hubo ningún error se inserta el nuevo comentario en la base de datos (#22-27), redirigiendo a la visualización del artículo, con ancla en el comentario recién incluido (#28).

Si hubo algún error, se almacena una estructura con los datos recibidos del formulario en la variable de sesión $_SESSION['comment_info'] (#30), y se redirige a la vista del artículo, con ancla en el formulario de envío de comentario (#37).

/app/controllers/user/login.php

En esta acción se procesa el formulario de login, autentificando al usuario en el sistema. 

user/login.php
  1. if (!isset($_SESSION['referer'])) {
  2. $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '?q=';
  3. if (strstr('user/login', $referer)) {
  4. $referer = '?q=';
  5. }
  6. $_SESSION['referer'] = $referer;
  7. }
  8.  
  9. if (isset($_POST['email']) && isset($_POST['password'])) {
  10. $email = trim(addslashes($_POST['email']));
  11. $passowrd = trim(addslashes($_POST['password']));
  12.  
  13. $sql = "
  14. SELECT id_user, nick, email
  15. FROM slog_users
  16. WHERE email = '$email'
  17. AND password = MD5('$passowrd')
  18. ";
  19. if ($user = $db->fetch($sql)) {
  20. $_SESSION['user'] = $user;
  21. $referer = $_SESSION['referer'];
  22. unset($_SESSION['referer']);
  23. header('Location: ' . $referer);
  24. exit();
  25. } else {
  26. unset($_SESSION['user']);
  27. $this->login_message = 'Email o contraseña incorrectas';
  28. }
  29. }
  30.  
  31. $this->title = 'Login | ' . $this->title;

Se obtiene la url a la que hay que regresar tras hacer login (#1-#7). Se procesan los datos del formulario (#9-#11), y se comprueba que el usuario y contraseña son corectos (#13-#19), creando la variable de sesión $_SESSION['user'] con el registro del usuario (#20) y redirigiendo a la página anterior, si todo fue bien. O mostrará un mensaje de error (#27) volviendo a la página de login si no hubo éxito en la autentificación.

/app/controllers/user/logout.php

Simplemente se produce la salida del sistema del usuario. 

user/logout.php
  1. $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '?q=';
  2. if (strstr('user/login', $referer)) {
  3. $referer = '?q=';
  4. }
  5.  
  6. unset($_SESSION['user']);
  7. header('Location: ' . $referer);
  8. exit();

Se opbtiene la url a la que volver (#1-#4), se elimina la variable de sesión del usuario (#6), y se vuelve atrás (#7).

Slog: un blog online

Slog está online, para que podáis ver cómo queda y probarlo escribiendo y modificando artículos, y enviando comentarios en los artículos (usuario admin, password admin). Recordad que esta es una primera versión cuya única finalidad es mostrar cómo se hace un blog.

También os lo podéis descargar (publicado bajo la GPL): slog-0.1.tar.gz.


autor

Javier Pérez de la Axarquía

Padre, marido, amante, humanista, programador, escritor, emprendedor... y algunas cosas más que aún no sé que soy.

etiquetas
artículos relacionados
comentarios
avatar de mindundi
#1
mindundi - hace 3 años y 6 meses ir arriba escribe un comentario
coñe, muchas gracias por compartir estas cosejas. A ver si me entero de una vez como funciona el MVC que ya hay ganas de hincarle el diente :)



Un saludo y eso, muchas gracias
avatar de Luis
#2
Luis - hace 3 años y 6 meses ir arriba escribe un comentario
Sin entrar en los detalles técnico de la implementación de tu propuesta (en PHP me das mil vueltas), hay una tema que comentas en la definición del controlador con la que no estoy muy de acuerdo. Básicamente describes el controlador como una clase de negocio en el que defines una serie de acciones.



Sin embargo, creo que la filosofía del patrón MVC no consiste en albergar la lógica de negocio en el controlador. El controlador si se encarga del control de flujo entre las vistas, de enviar mensajes al modelo y de controlar temas como la seguridad, rendimiento, etc.



Pienso que sería más escalable tu modelo si toda esa lógica de negocio la gestionases también desde el modelo. Y luego si procede subdividiría el modelo en clases de negocio y clase de acceso a datos.



Si te fijas en el patrón J2EE (MVC por antonomasia) divide los componentes en JSP (vista), Servlets(controlador) y por ultimo EJBs(negocio) y JBean(negocio y acceso a datos)
avatar de Pablo Rosales
#3
Pablo Rosales - hace 3 años y 3 meses ir arriba escribe un comentario
Muy útil! Estoy creando mi propio CMS personalizado y esto me ha caído muy bien :) Gracias!
avatar de pRopiO
#4
pRopiO - hace 3 años y 1 mes ir arriba escribe un comentario
hola, buenas he estado probando esto, y es mi primer contacto con php y mysql, sin ayuda de php-nuke ni nada de eso, es decir la primera vez que realizo cosas destas en php a pelo, antes usaba asp y access y me cansé de mikrosoft, y nada lo que iba a decir; he estado haciendo esto. y me da un error en mvc.inc.php, me dic esto:

-------------------

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home/chs/publiactiva.com/home/html/ftp/ecoactiva/lib/mvc.inc.php on line 8

------------------

y he estado mirando... pero como esto de mvc para mi es nuevo, no tengo ni idea de que puede ser, alguien me puede ayudar? les estaria muy agradecido.

Gracias de antemano.Saludos
avatar de Tanguillo
#5
Tanguillo - hace 3 años y 1 mes ir arriba escribe un comentario
Que bueno que está este tutorial. Felicitaciones!!!

Yo uso Code Igniter para MVC pero esto está impresionante. Saludos,
avatar de Alberto Ferrer
#6
Esta bien basico pero buenisimo para auquellos que estan aprendiendo, te falto algo como:



if (!file_exists('app/controllers/'.$controller . '/' . $action.'.php'))



Para ver que el controlador exista y la accion tambien.



Aunque se supone que la "accion" es una funcion dentro del controlador no? o del modelo ;)
avatar de Walt Trappa
#7
Walt Trappa - hace 1 año y 7 meses ir arriba escribe un comentario
Hola:
Me parece muy interesante el tutorial.
Me encuentro un problema: el fichero tgz con el código fuente no existe. El de la segunda parte del tutorial, tampoco. ¿Se han borrado, han cambiado de sitio? Teniendo en cuenta que no reproduces literalmente el código en el artículo, sin el fichero de código estoy algo perdido, aunque siga las explicaciones.
Saludos
Walt
avatar de rabioso
#8
rabioso - hace 1 año y 5 meses ir arriba escribe un comentario
Es hora que te ocupes de hacer funcionar los links de nuevo, salvo que en el tutorial haya un error que no ha sido arreglado, lo que hace imperioso hacer desaparecer las pruebas, dejando el tutorial solamente.

Pues no es muy serio eso de estar dando links para descargas y que te encuentres con esto :

/download/slog-0.1.tar.gz
La página solicitada no existe.

Ponte a trabajar, o haz desaparecer el tutorial.
avatar de Javier Pérez
#9
Te pido disculpas @rabioso. El código se perdió en una de las necesarias migraciones de servidor.
Prometo rehacerlo de nuevo.
avatar de rabioso
#10
rabioso - hace 1 año y 5 meses ir arriba escribe un comentario
Soy yo quien en realidad debe pedir disculpas, pues reconozco que no estuve para nada educado. Estoy trabajando con CodeIgniter, y estaba realmente interesado en ver como funcionaba vuestro proyecto. Esperaré pues!, y nuevamente disculpas.
avatar de Eduardo
#11
Eduardo - hace 1 año y 13 días ir arriba escribe un comentario
Javier, buenisimo el tutorial !!! pero por desgracia todavia no podemos bajar el codigo. Un abrazo y gracias por compartir conocimientos.
favicon de pixelco.us
#12
avatar de Ezequiel
#13
Ezequiel - hace 2 meses y 4 días ir arriba escribe un comentario
escribe un comentario

Se permite código HTML: <a> <img> <b> <strong> <em> <i> <strike> <p>

#14
- hace 1 segundo
Normas de uso
El autor del comentario se hace responsable del contenido de éste. En caso de que el autor del comentario infringiera alguna ley, se ofrecerán todos los datos necesarios a las autoridades pertinentes para que tomen las medidas oportunas.
Se debe escribir correctamente en el mismo idioma del artículo que se comenta. En caso contrario podría ser eliminado.
El comentario debe ceñirse a la temática del artículo.

En la siguiente lista de palabras, haz clic en tutorial:
  1. tutorial
  2. desarrolla
  3. tu
  4. propio
  5. blog
  6. slog
Esta pregunta es para evitar comentarios spam. Perdón por las molestias.