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
-
<?
-
-
// iniciamos session
-
-
// archivos necesarios
-
require_once 'config.php';
-
require_once 'conexion.php';
-
require_once 'esUsuario.php';
-
-
// obtengo puntero de conexion con la db
-
$dbConn = conectar();
-
-
// verificamos que no este conectado el usuario
-
$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );
-
}
-
-
// verificamos que sea un admin
-
die;
-
}
-
-
?>
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-
<title>Blog Personal</title>
-
</head>
-
-
<body>
-
-
<h1>Blog Personal</h1>
-
<p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="../index.php?salir=true">Salir</a></p>
-
<ul>
-
<li><a href="categorias.php">Administrar Categorías</a></li>
-
<li><a href="noticias.php">Administrar Noticias</a></li>
-
</ul>
-
-
</body>
-
</html>
Ahora sÃ, pego el código de admin/noticias.php y lo paso a explicar
-
<?
-
-
// iniciamos session
-
-
// archivos necesarios
-
require_once 'config.php';
-
require_once 'conexion.php';
-
require_once 'esUsuario.php';
-
-
// obtengo puntero de conexion con la db
-
$dbConn = conectar();
-
-
// verificamos que no este conectado el usuario
-
$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );
-
}
-
-
// verificamos que sea un admin
-
die;
-
}
-
-
// agregamos una categoria en la db
-
// si se envio el formulario
-
-
// definimos las variables
-
-
// completamos la variable error si es necesario
-
if ( empty($idCategoria) ) $error['idCategoria'] = 'Es obligatorio seleccionar una categoría para la noticia';
-
-
// si no hay errores registramos al usuario
-
-
// inserto los datos de registro en la db
-
$idUsuario = $arrUsuario['idUsuario'];
-
$query = "INSERT INTO `noticias` (titulo,copete,cuerpo,idCategoria,idUsuario,fCreacion,fModificacion,fPublicacion) VALUES ('$titulo','$copete','$cuerpo','$idCategoria','$idUsuario','$fCreacion','$fModificacion','$fPublicacion')";
-
die;
-
-
}
-
-
}
-
-
// traemos listado de categorias
-
$query = "SELECT idCategoria, valor FROM `categorias` ORDER BY valor ASC";
-
}
-
-
// traemos listado de noticias
-
$query = "SELECT idNoticia, titulo FROM `noticias` ORDER BY idNoticia DESC";
-
}
-
?>
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-
<title>Blog Personal</title>
-
</head>
-
-
<body>
-
-
<h1>Blog Personal</h1>
-
<p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php">Panel de control</a> - <a href="../index.php?salir=true">Salir</a></p>
-
<h2>Noticias</h2>
-
<div style="background-color: #fdfdfd;border:1px solid #ff8800;width:90%;padding:5px">La noticia se agregó con éxito.</div>
-
<? } ?>
-
-
<div>
-
<h3>Listado de Noticias</h3>
-
<table style="width:90%;padding:5px;border:1px solid #cccccc">
-
<tr>
-
<th style="background-color:#cccccc;padding:5px;">id</th>
-
<th style="width:90%;background-color:#cccccc;padding:5px;">título</th>
-
<th style="background-color:#cccccc;padding:5px;width:10%"></th>
-
</tr>
-
<? foreach ($arrNoticias as $noticias) { ?>
-
<tr>
-
<td style="padding:5px;"><a href="noticias.php?id=<? echo $noticias['idNoticia']; ?>">Editar</a> - <a href="noticias.php?del=<?= $categoria['idNoticia'] ?>">Borrar</a>
-
</tr>
-
<? } ?>
-
</table>
-
</div>
-
-
<div>
-
<h3 id="add">Agregar nueva noticia</h3>
-
<ul>
-
<? foreach ($error as $mensaje) { ?>
-
<li><?= $mensaje ?></li>
-
<? } ?>
-
</ul>
-
<? } ?>
-
<form action="noticias.php" method="post">
-
-
<p>
-
<label for="titulo">Título de la noticia</label><br />
-
<input name="titulo" type="text" value="" />
-
</p>
-
<p>
-
<label for="idCategoria">CategorÃa</label><br />
-
<select name="idCategoria">
-
<option value="">Seleccione una categorÃa</option>
-
<option value="">------------------------</option>
-
<? foreach ( $arrCategorias as $categoria ) { ?>
-
<? } ?>
-
</select>
-
</p>
-
<p>
-
<label for="fPublicacion">Fecha de publicacion (aaaa-mm-dd hh:mm:ss) Ej: 2008-10-29 17:20:00 </label><br />
-
<input name="fPublicacion" type="text" value="" />
-
</p>
-
<p>
-
<label for="copete">Copete</label><br />
-
<textarea rows="5" cols="50" name="copete"></textarea>
-
</p>
-
<p>
-
<label for="cuerpo">Cuerpo</label><br />
-
<textarea rows="10" cols="50" name="cuerpo"></textarea>
-
</p>
-
<p>
-
<input name="submit" type="submit" value="Agregar" />
-
</p>
-
</form>
-
</div>
-
<? } ?>
-
-
</body>
-
</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.
-
<?
-
-
// iniciamos session
-
-
// archivos necesarios
-
require_once 'admin/config.php';
-
require_once 'admin/conexion.php';
-
require_once 'admin/esUsuario.php';
-
-
// obtengo puntero de conexion con la db
-
$dbConn = conectar();
-
-
// vemos si el usuario quiere desloguar
-
// borramos y destruimos todo tipo de sesion del usuario
-
}
-
-
// verificamos que no este conectado el usuario
-
$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );
-
}
-
-
// listado de noticias
-
// traemos listado de noticias
-
$query = "SELECT idNoticia, titulo, copete FROM `noticias` WHERE fPublicacion <'".date('Y-m-d H:i:s')."' ORDER BY fPublicacion DESC";
-
}
-
-
-
?>
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-
<title>Blog Personal</title>
-
</head>
-
-
<body>
-
-
<h1>Blog Personal</h1>
-
-
<div>El registro ha sido exitoso.</div>
-
<? } ?>
-
-
<ul>
-
<li><a href="ingresar.php">Iniciar sesión</a></li>
-
<li><a href="registrar.php">Regístrate gratis</a></li>
-
</ul>
-
<? } else { ?>
-
<p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php?salir=true">Salir</a></p>
-
<? if ( $arrUsuario['tipo'] == 'admin' ) { ?>
-
<ul>
-
<li><a href="admin/index.php">Panel de administración</a></li>
-
</ul>
-
<? } ?>
-
<? } ?>
-
-
<h2>Noticias</h2>
-
<? foreach ( $arrNoticias as $noticias ) { ?>
-
<div>
-
<h3><a href="vernoticia.php?idNoticia=<? echo $noticias['idNoticia']; ?>"><? echo $noticias['titulo']; ?></a></h3>
-
</div>
-
<? } ?>
-
</body>
-
</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 >> |








Martes, 4 de Noviembre de 2008 a las 13.45
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
Jueves, 6 de Noviembre de 2008 a las 11.40
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.
Sábado, 8 de Noviembre de 2008 a las 21.04
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.
Lunes, 10 de Noviembre de 2008 a las 22.05
me gustaria saber si tenes algun curzo como para diseñar una base de datos
desde ya gracias
Miércoles, 8 de Julio de 2009 a las 02.04
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.
Miércoles, 8 de Julio de 2009 a las 22.27
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.
Miércoles, 15 de Julio de 2009 a las 17.39
@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.
Viernes, 4 de Diciembre de 2009 a las 21.39
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.
Martes, 8 de Diciembre de 2009 a las 11.36
@gerol hola, termina de leer el taller completo, se explica lo que estas queriendo realizar
Sábado, 31 de Julio de 2010 a las 14.25
lo que no me funca es la base de datos no se cuales son las tablas
Jueves, 2 de Diciembre de 2010 a las 18.49
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";
Lunes, 3 de Octubre de 2011 a las 21.56
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