Justi 3 de noviembre de 2008 a las 12.51
   Imprimir artículo
elWebmaster.com

Taller de PHP: Nuestro blog – Sistema de noticias (3)


Hola, antes que nada pido disculpas por no haber podido hacer el taller estas últimas dos semanas. Estuve con mucho trabajo en un proyecto importante y no he podido hacerme un tiempito para escribir acá.

En la clase de hoy vamos a ver cómo dar de alta noticias y mostrarlas en la home. Una particularidad a diferencia del alta de las categorías es que ahora para dar de alta una noticia, también vamos a necesitar de la tabla de categorías y la de usuarios, por lo que ya empezamos a interactuar entre las diferentes tablas.

Antes de continuar, tengo que hacer una corrección a la base de datos, cuando la creamos en la tabla de noticias le pusimos al campo fPublicacion, la propiedad “ON UPDATE CURRENT_TIMESTAMP” y lo mismo para el valor por defecto “CURRENT_TIMESTAMP”, bueno, esto en realidad va en el campo fModificacion, fPublicacion tiene que quedar exactamente igual que fCreado. Bueno, hecha esta salvedad, vamos a lo nuestro.

En la clase de hoy vamos a tocar tres archivos index.php, admin/index.php y un nuevo archivo admin/noticias.php. Arranquemos por el archivo admin/index.php.

Lo único que le hacemos a este archivo es agregar el enlace a nuestro administrador de noticias, osea admin/noticias.php

  1. <?
  2.  
  3. // iniciamos session
  4. session_start ();
  5.  
  6. // archivos necesarios
  7. require_once 'config.php';
  8. require_once 'conexion.php';
  9. require_once 'esUsuario.php';
  10.  
  11. // obtengo puntero de conexion con la db
  12. $dbConn = conectar();
  13.  
  14. // verificamos que no este conectado el usuario
  15. if ( !empty( $_SESSION&#91;'usuario'] ) && !empty($_SESSION['password']) ) {
  16.     $arrUsuario = esUsuario( $_SESSION&#91;'usuario'], $_SESSION['password'], $dbConn );
  17. }
  18.  
  19. // verificamos que sea un admin
  20. if ( empty($arrUsuario) || $arrUsuario&#91;'tipo'] != 'admin' ) {
  21.     header( 'Location: ../index.php' );
  22.     die;
  23. }
  24.  
  25. ?>
  26. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  27. <html xmlns="http://www.w3.org/1999/xhtml">
  28. <head>
  29.     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  30.     <title>Blog Personal</title>
  31. </head>
  32.  
  33. <body>
  34.  
  35.     <h1>Blog Personal</h1>
  36.     <p>Bienvenido <?= $arrUsuario&#91;'usuario'] ?> - <a href="../index.php?salir=true">Salir</a></p>
  37.     <ul>
  38.         <li><a href="categorias.php">Administrar Categor&iacute;as</a></li>
  39.         <li><a href="noticias.php">Administrar Noticias</a></li>
  40.     </ul>
  41.    
  42. </body>
  43. </html>

Ahora sí, pego el código de admin/noticias.php y lo paso a explicar

  1. <?
  2.  
  3. // iniciamos session
  4. session_start ();
  5.  
  6. // archivos necesarios
  7. require_once 'config.php';
  8. require_once 'conexion.php';
  9. require_once 'esUsuario.php';
  10.  
  11. // obtengo puntero de conexion con la db
  12. $dbConn = conectar();
  13.  
  14. // verificamos que no este conectado el usuario
  15. if ( !empty( $_SESSION&#91;'usuario'] ) && !empty($_SESSION['password']) ) {
  16.     $arrUsuario = esUsuario( $_SESSION&#91;'usuario'], $_SESSION['password'], $dbConn );
  17. }
  18.  
  19. // verificamos que sea un admin
  20. if ( empty($arrUsuario) || $arrUsuario&#91;'tipo'] != 'admin' ) {
  21.     header( 'Location: ../index.php' );
  22.     die;
  23. }
  24.  
  25. // agregamos una categoria en la db
  26. // si se envio el formulario
  27. if ( !empty($_POST&#91;'submit']) ) {
  28.    
  29.     // definimos las variables
  30.     if ( !empty($_POST&#91;'titulo']) )         $titulo         = $_POST['titulo'];
  31.     if ( !empty($_POST&#91;'copete']) )         $copete         = $_POST['copete'];
  32.     if ( !empty($_POST&#91;'cuerpo']) )         $cuerpo         = $_POST['cuerpo'];
  33.     if ( !empty($_POST&#91;'idCategoria']) )    $idCategoria    = $_POST['idCategoria'];
  34.     if ( !empty($_POST&#91;'fPublicacion']) )   $fPublicacion   = $_POST['fPublicacion'];  
  35.    
  36.     // completamos la variable error si es necesario
  37.     if ( empty($titulo) )   $error&#91;'titulo']        = 'Es obligatorio completar el t&iacute;tulo de la noticia';
  38.     if ( empty($copete) )   $error&#91;'copete']        = 'Es obligatorio completar el copete de la noticia';
  39.     if ( empty($cuerpo) )   $error&#91;'cuerpo']        = 'Es obligatorio completar el cuerpo de la noticia';
  40.     if ( empty($idCategoria) )  $error&#91;'idCategoria']   = 'Es obligatorio seleccionar una categor&iacute;a para la noticia';
  41.    
  42.     // si no hay errores registramos al usuario
  43.     if ( empty($error) ) {
  44.        
  45.         // inserto los datos de registro en la db
  46.         $fCreacion = date("Y-m-d H:i:s");
  47.         $fModificacion = date("Y-m-d H:i:s");
  48.         if ( empty($fPublicacion) ) $fPublicacion = date("Y-m-d H:i:s");
  49.         $idUsuario = $arrUsuario&#91;'idUsuario'];
  50.         $query  = "INSERT INTO `noticias` (titulo,copete,cuerpo,idCategoria,idUsuario,fCreacion,fModificacion,fPublicacion) VALUES ('$titulo','$copete','$cuerpo','$idCategoria','$idUsuario','$fCreacion','$fModificacion','$fPublicacion')";
  51.         $result = mysql_query($query, $dbConn);
  52.         header( 'Location: noticias.php?add=true' );
  53.         die;
  54.        
  55.     }
  56.        
  57. }
  58.  
  59. // traemos listado de categorias
  60. $arrCategorias = array();
  61. $query = "SELECT idCategoria, valor FROM `categorias` ORDER BY valor ASC";
  62. $resultado = mysql_query ($query, $dbConn);
  63. while ( $row = mysql_fetch_assoc ($resultado)) {
  64.     array_push( $arrCategorias,$row );
  65. }
  66.  
  67. // traemos listado de noticias
  68. $arrNoticias = array();
  69. $query = "SELECT idNoticia, titulo FROM `noticias` ORDER BY idNoticia DESC";
  70. $resultado = mysql_query ($query, $dbConn);
  71. while ( $row = mysql_fetch_assoc ($resultado)) {
  72.     array_push( $arrNoticias,$row );
  73. }
  74. ?>
  75. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  76. <html xmlns="http://www.w3.org/1999/xhtml">
  77. <head>
  78.     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  79.     <title>Blog Personal</title>
  80. </head>
  81.  
  82. <body>
  83.  
  84.     <h1>Blog Personal</h1>
  85.     <p>Bienvenido <?= $arrUsuario&#91;'usuario'] ?> - <a href="index.php">Panel de control</a> - <a href="../index.php?salir=true">Salir</a></p>
  86.     <h2>Noticias</h2>
  87.     <? if ( !empty($_GET&#91;'add']) ) { ?>
  88.     <div style="background-color: #fdfdfd;border:1px solid #ff8800;width:90%;padding:5px">La noticia se agreg&oacute; con &eacute;xito.</div>
  89.     <? } ?>
  90.    
  91.     <div>
  92.         <h3>Listado de Noticias</h3>
  93.         <table style="width:90%;padding:5px;border:1px solid #cccccc">
  94.             <tr>
  95.                 <th style="background-color:#cccccc;padding:5px;">id</th>
  96.                 <th style="width:90%;background-color:#cccccc;padding:5px;">t&iacute;tulo</th>
  97.                 <th style="background-color:#cccccc;padding:5px;width:10%"></th>
  98.             </tr>
  99.             <? foreach ($arrNoticias as $noticias) { ?>
  100.             <tr>
  101.                 <td style="padding:5px;"><? echo $noticias&#91;'idNoticia']; ?></td>
  102.                 <td style="padding:5px;"><? echo $noticias&#91;'titulo']; ?></td>
  103.                 <td style="padding:5px;"><a href="noticias.php?id=<? echo $noticias['idNoticia']; ?>">Editar</a> - <a href="noticias.php?del=<?= $categoria['idNoticia'] ?>">Borrar</a>
  104.             </tr>
  105.             <? } ?>
  106.         </table>
  107.     </div>
  108.    
  109.     <? if ( empty($_GET&#91;'id']) ) { ?>
  110.         <div>
  111.             <h3 id="add">Agregar nueva noticia</h3>
  112.             <? if (!empty($error)) { ?>
  113.                 <ul>
  114.                 <? foreach ($error as $mensaje) { ?>
  115.                     <li><?= $mensaje ?></li>
  116.                 <? } ?>
  117.                 </ul>
  118.             <? } ?>
  119.             <form action="noticias.php" method="post">
  120.            
  121.                 <p>
  122.                     <label for="titulo">T&iacute;tulo de la noticia</label><br />
  123.                     <input name="titulo" type="text" value="" />
  124.                 </p>
  125.                 <p>
  126.                     <label for="idCategoria">Categoría</label><br />
  127.                     <select name="idCategoria">
  128.                         <option value="">Seleccione una categoría</option>
  129.                         <option value="">------------------------</option>
  130.                         <? foreach ( $arrCategorias as $categoria ) { ?>
  131.                         <option value="<? echo $categoria['idCategoria']; ?>"><? echo $categoria&#91;'valor']; ?></option>
  132.                         <? } ?>
  133.                     </select>
  134.                 </p>
  135.                 <p>
  136.                     <label for="fPublicacion">Fecha de publicacion (aaaa-mm-dd hh:mm:ss) Ej: 2008-10-29 17:20:00 </label><br />
  137.                     <input name="fPublicacion" type="text" value="" />
  138.                 </p>
  139.                 <p>
  140.                     <label for="copete">Copete</label><br />
  141.                     <textarea rows="5" cols="50" name="copete"></textarea>
  142.                 </p>
  143.                 <p>
  144.                     <label for="cuerpo">Cuerpo</label><br />
  145.                     <textarea rows="10" cols="50" name="cuerpo"></textarea>
  146.                 </p>
  147.                 <p>
  148.                     <input name="submit" type="submit" value="Agregar" />
  149.                 </p>
  150.             </form>
  151.         </div>
  152.     <? } ?>
  153.    
  154. </body>
  155. </html>

Van a notar que no es muy diferente al administrador de categorias. Igual vamos por partes:

Lo primero que cambia obviamente es la cantidad de variables post que debemos ver si existen y que son obligatorias. Luego, como segunda opción si es que no tenemos errores, debemos crear algunas variables que vamos a necesitar para guardar en la base de datos: las tres de fecha.

Para fCreacion y fModificacion no vamos a tener ningún problema ya que como estamos creando la noticia van a tener ambas date(), y para fPublicacion debemos verificar si se completo el campo o no, en caso de que se dejó vacía, la fecha de publicación es la misma que las otras dos, caso contrario, rellenamos con el post.

Otra variable que tenemos que crear es la idUsuario, para ello usamos nuestro array con los datos del usuario logueado para asignarle a la noticia el autor logueado.

Por último en la parte de php vamos a ver como diferencia que ahora no sólo traemos todas las noticias para mostrar sino que también traemos todas las categorías. Esto es así porque usaremos el listado de categorías para elegir la categoría de cada noticia.

Si prestamos atención a la parte del formulario, vamos a ver cómo ahora tenemos un SELECT BOX con un FOREACH que va a recorrer todas las categorías y le va a asignar un value a cada OPTION con la id de la misma, ese valor es el que vamos a recibir por POST y agregar en la noticia en la base de datos.

Fuera de eso no hay ninguna otra diferencia con las altas de categorías.

Finalmente vamos a modificar nuestra home para mostrar las noticias que vamos agregando.

  1. <?
  2.  
  3. // iniciamos session
  4. session_start ();
  5.  
  6. // archivos necesarios
  7. require_once 'admin/config.php';
  8. require_once 'admin/conexion.php';
  9. require_once 'admin/esUsuario.php';
  10.  
  11. // obtengo puntero de conexion con la db
  12. $dbConn = conectar();
  13.  
  14. // vemos si el usuario quiere desloguar
  15. if ( !empty($_GET&#91;'salir']) ) {
  16.     // borramos y destruimos todo tipo de sesion del usuario
  17.     session_unset();
  18.     session_destroy();
  19. }
  20.  
  21. // verificamos que no este conectado el usuario
  22. if ( !empty( $_SESSION&#91;'usuario'] ) && !empty($_SESSION['password']) ) {
  23.     $arrUsuario = esUsuario( $_SESSION&#91;'usuario'], $_SESSION['password'], $dbConn );       
  24. }
  25.  
  26. // listado de noticias
  27. // traemos listado de noticias
  28. $arrNoticias = array();
  29. $query = "SELECT idNoticia, titulo, copete FROM `noticias` WHERE fPublicacion < '".date('Y-m-d H:i:s')."' ORDER BY fPublicacion DESC";
  30. $resultado = mysql_query ($query, $dbConn);
  31. while ( $row = mysql_fetch_assoc ($resultado)) {
  32.     array_push( $arrNoticias,$row );
  33. }
  34.  
  35.  
  36. ?>
  37. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  38. <html xmlns="http://www.w3.org/1999/xhtml">
  39. <head>
  40.     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  41.     <title>Blog Personal</title>
  42. </head>
  43.  
  44. <body>
  45.  
  46.     <h1>Blog Personal</h1>
  47.    
  48.     <? if ( !empty($_GET&#91;'registro']) ) { ?>
  49.     <div>El registro ha sido exitoso.</div>
  50.     <? } ?>
  51.    
  52.     <? if ( empty($arrUsuario&#91;'usuario']) ) { ?>
  53.     <ul>
  54.         <li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li>
  55.         <li><a href="registrar.php">Reg&iacute;strate gratis</a></li>
  56.     </ul>
  57.     <? } else { ?>
  58.     <p>Bienvenido <?= $arrUsuario&#91;'usuario'] ?> - <a href="index.php?salir=true">Salir</a></p>
  59.         <? if ( $arrUsuario&#91;'tipo'] == 'admin' ) { ?>
  60.         <ul>
  61.             <li><a href="admin/index.php">Panel de administraci&oacute;n</a></li>
  62.         </ul>
  63.         <? } ?>
  64.     <? } ?>
  65.  
  66.     <h2>Noticias</h2>
  67.     <? foreach ( $arrNoticias as $noticias ) { ?>
  68.     <div>
  69.         <h3><a href="vernoticia.php?idNoticia=<? echo $noticias['idNoticia']; ?>"><? echo $noticias&#91;'titulo']; ?></a></h3>
  70.         <p><? echo $noticias&#91;'copete']; ?></p>
  71.     </div>
  72.     <? } ?>
  73. </body>
  74. </html>

Lo más relevante en las modificaciones que le hicimos es en la parte de php la consulta que trae todas las noticias, pero ahora ordenadas por fPubliacion descendente y ademas sólo muestra aquellas que la fecha de publicacion es anterior a “ahora”, de esta forma podemos programar noticias para que sean mostradas a todo el mundo cuando se llegue a la fecha y hora deseada.

Un último cambio que vamos a destacar, es que en el listado de noticias que estamos mostrando, al titulo le agregué un enlace a una nueva página, la misma va a tener la noticia completa.

Bueno, eso es todo por hoy, la semana que viene vamos a ver cómo editar y borrar las noticias y veremos tambien como se ve la noticia completa para los visitantes a nuestro sitio.

Aquí les dejo los archivos usados en la clase para que descarguen.

<< CLASE ANTERIOR CLASE SIGUIENTE >>

Enviar a Del.icio.us Enviar a Meneame Enviar a Digg Enviar a Fresqui Enviar a Enchilame

Comentarios (13)

  1. Rosa Claudia Hilario dice:

    hola,
    que bueno que volvieron las clases!, es uno de los mejores cursos de php que he visto, me esta sirviendo muchisimo, tengo una pregunta, necesito saber con urgencia como hacer un backup de un sitio web, en php porsupuesto, agradezco desde ya cualquier ayuda, felicitaciones por el curso.
    saludos

  2. Justi dice:

    Hola, no se bien a que te referis, para hacer un backup de los archivos es cuestion de copiarlos a donde los queres backupear y para la base de datos la podes backupear desde phpMyAdmin con la opcion exportar.

  3. Rosa Claudia Hilario dice:

    hola Justi,
    gracias por contestar, me refiero hacer un backup desde el sitio web y de todo el sitio, utilizando algunas funciones de php, esto lo tendria que hacer el administrador del sitio, espero que me hayas entendido,desde ya gracias.

  4. DAVID dice:

    me gustaria saber si tenes algun curzo como para diseñar una base de datos
    desde ya gracias

  5. Al dice:

    Buenas noches. Revivo las consultas debido a un error que se me presenta, y no sé si se debe al error […Antes de continuar, tengo que hacer una corrección a la base de datos, cuando la creamos en la tabla de noticias le pusimos al campo fPublicacion, la propiedad “ON UPDATE CURRENT_TIMESTAMP” y lo mismo para el valor por defecto “CURRENT_TIMESTAMP”, bueno, esto en realidad va en el campo fModificacion, fPublicacion tiene que quedar exactamente igual que fCreado. Bueno, hecha esta salvedad, vamos a lo nuestro…], el cual no puedo modificar en PhpMyAdmin. En “vernoticias.php”: Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\sistema\vernoticia.php on line 48 -y-Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\sistema\vernoticia.php on line 58.
    Todo funciona bien, el login como usuario, como admin, pero no muestra la noticia, sino solamente el error.
    Si alguien puede ayudar, se agradecería.
    Nos vemos.

  6. Baldemar dice:

    Hola,

    tengo una pregunta respecto a las categorías: que pasa si es necesario asignar 2 o mas categorías al mismo post? como se puede solucionar esto?

    Gracias de antemano.

  7. Justi dice:

    @al hola Al, gracias por la correxion, fijate si se esta pasando la conexion en la consulta. Puede que sea eso.

    @Baldemar hola, podes usar en lugar de un select box un multiple select box o checkbox, en ambos casos vas a recibir en el POST un array con las opciones marcadas.

  8. Gerol dice:

    Hola, esta buenisimo el curso, mi pregunta es como mostrar las noticias pero por categias que se ha creado, y limitar la cantidad de noticias en el front por ejemplo: que se muestre solo 5 ultimas noticias publicadas.

    Gracias.

  9. Justi dice:

    @gerol hola, termina de leer el taller completo, se explica lo que estas queriendo realizar

  10. Adri dice:

    lo que no me funca es la base de datos no se cuales son las tablas

  11. lina dice:

    buenísimo este taller, pero específicamente me sale el siguiente error:
    Estrictas normas: Fecha () [function.date]: No es seguro confiar en la configuración de zona horaria del sistema. Por favor, use el ajuste date.timezone, la variable de entorno TZ o el date_default_timezone_set () función. En caso de utilizar cualquiera de los métodos y usted todavía está recibiendo esta advertencia, lo más probable es incorrecta la zona horaria identificador. Hemos seleccionado ‘America / New_York’ para ‘-5.0/no horario de verano’ en vez de C: \ AppServ \ www \ blog \ index.php on line 29
    Que se debe hacer en este caso???
    la linea 29 es:$query = “SELECT idNoticia, titulo, copete FROM `noticias` WHERE fPublicacion <‘”.date(‘Y-m-d H:i:s’).”‘ ORDER BY fPublicacion DESC”;

  12. Antonio García dice:

    Soy totalmente nuevo en esto del PHP, pero la situacion requiere que aprenda rapidamente a hacer esto que estas explicando asi que te agraddezco que lo expliques tan bien como lo haces 😀

  13. Martin Gorgojo dice:

    Hola espero incorporarme a tiempo a este post. Mi pregunta es la siguiente: ¿como se puede paginar el listado de noticias de la seccion admin?
    Gracias por adelantado

Deja tu opinión

© 2007 - 2008 elWebmaster.com | Powered by Wordpress | Diseño CSS y XHTML válido. | Algunos íconos basados en FamFamFam Mini
Acceder