Comunidad PHPeros

Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: naveda en 16 de Diciembre de 2006, 14:41:44 pm

Título: Sistema de Noticias Simple - 3ª Parte
Publicado por: naveda en 16 de Diciembre de 2006, 14:41:44 pm
Bienvenido a esta 3ª Parte del Tutorial dedicado a la creación de un Sistema de Noticias Simple. En esta 3ª parte voy a ampliar un poco las caracteristicas de las noticias.

Si todo sale bien, al final de este tutorial, el sistema de noticias tendrá:
- Sistema BBCode
- Sistema de Emoticonos
- Sistema de Filtro de Palabras

Bien, Comencemos con el sistema BBCode, para ello crearemos una funcion a la que llamaré bbcode();:

<?PHP
function bbcode($texto) {
$texto = str_replace("\n","<br>",$texto) ; //Saltos de Linea
$texto = str_replace("[b]","<b>",$texto) ; //Negrita
$texto = str_replace("[/b]","</b>",$texto) ; //Negrita
$texto = str_replace("[i]","<i>",$texto) ; //Italic
$texto = str_replace("[/i]","</i>",$texto) ; //Italic
$texto = str_replace("[u]","<u>",$texto) ; //Subrayado
$texto = str_replace("[/u]","</u>",$texto) ; //Subrayado
return $texto;
}
?>

Ahora podrás formatear el texto usando los siguientes TAGS*:
Código: [Seleccionar]
[b]Texto en Negrita[/b]
[i]Texto en Cursiva[/i]
[u]Texto Subrayado[/u]

El sistema BBCode esta acabado, ahora vamos a por el Sistema de Emoticonos. Para ello vamos a ampliar la funcion bbcode y a usarla tambien para el sistema de emoticonos, con esto reduciremos el numero de funciones y con ello la sencillez será mayor.

Supongamos que disponemos de una carpeta llamada smilies con los siguientes emoticonos:

<?PHP
function bbcode($texto) {
$texto = str_replace("\n","<br>",$texto); //Saltos de Linea
$texto = str_replace("[b]","<b>",$texto); //Negrita
$texto = str_replace("[/b]","</b>",$texto); //Negrita
$texto = str_replace("[i]","<i>",$texto); //Italic
$texto = str_replace("[/i]","</i>",$texto); //Italic
$texto = str_replace("[u]","<u>",$texto); //Subrayado
$texto = str_replace("[/u]","</u>",$texto); //Subrayado

$texto = str_replace(':S','<img src="smilies/confundido.gif">', $texto);
$texto = str_replace(':)','<img src="smilies/lloron.gif">', $texto);
$texto = str_replace('8)','<img src="smilies/pijo.gif">', $texto);
$texto = str_replace(':D','<img src="smilies/sonrisa.gif">', $texto);
$texto = str_replace(':O','<img src="smilies/sorprendido.gif">', $texto);

return $texto;
}
?>

Ahora con una misma función hemos conseguido un sistema de bbcode y emoticonos, solamente nos falta el Filtro de Palabras que tambien se podría hacer usando la función bbcode(); pero creo conveniente separar el Filtro del sistema BBCODE.

Prosigamos, ahora creare una la funcion filtro_palabras(); que se encargarás de eliminar palabras que no deseemos o insultos... del texto que nosotros queramos, en este caso las noticias.

<?PHP
function filtro_palabras($texto) {
$palabras = array("tonto", "feo", "*****");
$division = explode(" ", $texto);
foreach ($division as $key => $valor) {
foreach ($palabras as $palabra) {
if (strtolower($valor) == $palabra) {
$division[$key] = "[CENSURADO]";
}
}
}
$texto = implode(" ",$division);
return $texto;
}
?>

Ahora disponemos de 2 funciones, bbcode(); y filtro_palabras(); encargadas de realizar las funciones que deseabamos realizar en un principio, ahora solamente nos falta aplicar las funciones al sistema de noticias. Para ello compilaremos las dos funciones en un mismo archivo al que denominaremos funciones.php

funciones.php
<?PHP
function bbcode($texto) {
$texto = str_replace("\n","<br>",$texto); //Saltos de Linea
$texto = str_replace("[b]","<b>",$texto); //Negrita
$texto = str_replace("[/b]","</b>",$texto); //Negrita
$texto = str_replace("[i]","<i>",$texto); //Italic
$texto = str_replace("[/i]","</i>",$texto); //Italic
$texto = str_replace("[u]","<u>",$texto); //Subrayado
$texto = str_replace("[/u]","</u>",$texto); //Subrayado

$texto = str_replace(':S','<img src="smilies/confundido.gif">', $texto);
$texto = str_replace(':)','<img src="smilies/lloron.gif">', $texto);
$texto = str_replace('8)','<img src="smilies/pijo.gif">', $texto);
$texto = str_replace(':D','<img src="smilies/sonrisa.gif">', $texto);
$texto = str_replace(':O','<img src="smilies/sorprendido.gif">', $texto);

return $texto;
}

function filtro_palabras($texto) {
$palabras = array("tonto", "feo", "*****");
$division = explode(" ", $texto);
foreach ($division as $key => $valor) {
foreach ($palabras as $palabra) {
if (strtolower($valor) == $palabra) {
$division[$key] = "[CENSURADO]";
}
}
}
$texto = implode(" ",$division);
return $texto;
}
?>

Ahora que disponemos de este archivo modificaremos algunas partes del archivo noticias.php creado en la 1ª Parte del tutorial:
<?PHP
/* ANTES DE TODO EL CODIGO HAY QUE CONECTAR A LA BASE DE DATOS
include("conectar.php"); <--- Esto es un ejemplo de como conectar...*/
include("funciones.php");
$query = @mysql_query("SELECT * FROM `noticias` ORDER BY `id` DESC"); //Se extraen las noticias en orden reciente
if (@mysql_num_rows($query)) { // Se comprueba si hay alguna noticia publicada
while ($noticia = @mysql_fetch_array($query)) { //Se hace un bucle para mostrar cada noticia una a una
echo '<table border="0" width="100%">
<tr><td align="center">'.filtro_palabras(bbcode($noticia['titulo'])).'</td></tr>
<tr><td>'.filtro_palabras(bbcode($noticia['noticia'])).'</td></tr>
<tr><td>Enviada por '.$noticia['autor'].' || Fecha: '.$noticia['fecha'].'</td></tr>
</table><hr>';
}
} else {
echo "No hay ninguna noticia publicada";
}
@mysql_free_result($noticia); //Se borran los datos usados
?>

Las funciones, del funciones.php, se incluyen en el archivo noticias.php mediante la funcion include(); y se aplican del siguiente modo:
filtro_palabras(bbcode($noticia['titulo']))
filtro_palabras(bbcode($noticia['noticia']))


Siguiente Parte »
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Revancha en 16 de Diciembre de 2006, 19:32:34 pm
Una consulta, si quiero agregar un bbcode, tendría que ser así?
$texto = str_replace("[ php]","<?php",$texto) ; //Código PHP
$texto = str_replace("[ /php]","?>",$texto) ; //Código PHP

PD: Entre el corchete ([) hay un espacio, ya que no sé podría visualizar bien.
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Keon en 16 de Diciembre de 2006, 19:59:28 pm
Ha ocurrido un error, no se ha procesado la noticia

Me sale esto al enviar la noticia
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: naveda en 17 de Diciembre de 2006, 14:42:04 pm
Vamos a ver, por partes.

El BBCode para codigo PHP es mas complejo que esto...
$texto = str_replace("[ php]","<?php",$texto) ; //Código PHP
$texto = str_replace("[ /php]","?>",$texto) ; //Código PHP


Ha ocurrido un error, no se ha procesado la noticia

Me sale esto al enviar la noticia
Esto sucede porque no has conectado con la base de datos...
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Ishamato en 17 de Diciembre de 2006, 15:57:27 pm
El código url sería asín:


$texto = str_replace("[ url]", "<url>", $texto);
$texto = str_replace("[ /url]", "</url>", $texto);

???
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Pc-Admin en 19 de Diciembre de 2006, 13:55:28 pm
Esta bien echo naveda, me gusta :):)
Si os fijais mas o menos todo se basa en lo mismo, crear la funcion y en el bbcode tmb, isha lo as echo bien ;);)
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Pc-Admin en 19 de Diciembre de 2006, 13:57:50 pm
Me gusta naveda, esta bien echo y consta de varias cosas :):)
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Keon en 19 de Diciembre de 2006, 15:16:14 pm
porque escribes dos mensajes para escribir lo mismo xD??
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Pc-Admin en 19 de Diciembre de 2006, 21:24:18 pm
Porque en el primero me despiste, y te dije que estava bien pero no lo esta
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Ishamato en 19 de Diciembre de 2006, 21:30:46 pm
Es verdad xD

Si hacemos str_replace ("[url], <url>, $texto"); no funciona ya que el código de las url no es <url> ;)
No se explicar como hacerlo, ni hacerlo así que tendremos que esperar a que alguien que sepa nos ayude ^^
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Raken en 24 de Diciembre de 2006, 04:49:49 am
Es verdad xD

Si hacemos str_replace ("

Solo estamos haciendo que las palabras, letras, símbolos, o lo que sea, que nosotros queramos se conviertan en HTML...

¿Cómo es un link en HTML?  no es <url> sino <a href="http....">, por lo que podríamos poner:


$texto = str_replace("[ url ]","<a href='",$texto) ;
$texto = str_replace("[ /url ]","'>LINK</a>",$texto) ;


saludos ;)
 (http://, <url>, $texto"); no funciona ya que el código de las url no es <url> ;)
No se explicar como hacerlo, ni hacerlo así que tendremos que esperar a que alguien que sepa nos ayude ^^
[/quote)
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: naveda en 24 de Diciembre de 2006, 14:07:31 pm
El problema es que los enlaces se llamarian siempre LINK y esto podría no ser un correcto funcionamiento...

Bien, un buen metodo podría ser el siguiente:

//Especiales
$texto = eregi_replace("\\[url=([^\\[]*)\\]([^\\[]*)\\[/url\\]",'<a href="\\1">\\2</a>', $texto); //URLs
$texto = eregi_replace("\\[img\\]([^\\[]*)\\[/img\\]",'<img src="\\1">', $texto); //Imagenes

Con la funcion eregi_replace() podemos hacer busquedas de cadenas de texto que siguen unos patrones, en este caso el patron:
Código: [Seleccionar]
[url=WEB]Nombre LINK[/url] y [img]url_imagen[/img]
Ahora si aplicais estas lineas al archivo funciones.php podreis ver que funciona correctamente :P
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Revancha en 24 de Diciembre de 2006, 15:18:12 pm
Para poner el texto de color, podría ser de la siguiente forma ¿no?
$texto = preg_replace('/\[color=(#?[\w]+)\]/','<span style="color: $1">',$texto) ;
$texto = str_replace('[/color]','</span>',$texto) ;

Y nuestro código seria así
Código: [Seleccionar]
[color=008000]Texto verde[/color]
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: mOrK en 12 de Enero de 2007, 16:44:41 pm
Envia la noticia, sale en la DB... pero no se ve en noticias.php :/
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: mOrK en 12 de Enero de 2007, 17:23:51 pm
Nada nada, ya me va.. :S

Ahora me da error en el panel de admin...

Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 296
No hay ninguna noticia publicada
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 392

292: $query = mysql_query("SELECT * FROM `noticias_phperos` ORDER BY `id` DESC"); //Se extraen las noticias en orden reciente

296: if (mysql_num_rows($query)) { // Se comprueba si hay alguna noticia publicada

392: mysql_free_result($noticia); //Se borran los datos usados

PD: la tabla que he creado yo es noticias_phperos
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Revancha en 12 de Enero de 2007, 20:00:33 pm
PD: la tabla que he creado yo es noticias_phperos
La tabla se debe llamar noticias, ya que sí le cambias el nombre tendrías que editar otras cosas más, no sé si será por eso, pero estoy seguro ;)
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: xmc254 en 12 de Enero de 2007, 23:27:21 pm
¿pero este sistema de noticias tiene seguridad para que nadie mande noticias sin permiso?
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: mOrK en 12 de Enero de 2007, 23:41:27 pm
Ya está arreglado :D

Era que no habia conectado con la DB... :S
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: xmc254 en 12 de Enero de 2007, 23:48:52 pm
Ya está arreglado :D

Era que no habia conectado con la DB... :S
mork yo creo que si le cambias el nombre a la db sin editar archivos, te dara fallos, te lo digo por experiencia...
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: mOrK en 13 de Enero de 2007, 12:29:14 pm
Ya esta arreglado

Los datos es lo primero que cambie ;)
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: BLISZ en 14 de Enero de 2007, 15:33:35 pm
el fallo que le veo es que si uno abre por ejemplo la etiqueta de la negrita y no la cierra todo el html a partir de ahí estara con negrita xD
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: mOrK en 14 de Enero de 2007, 18:28:41 pm
que?
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Ishamato en 04 de Febrero de 2007, 13:04:20 pm
Pues bien, ahora me a sucedido un bug a mi XD

El sistema, envia la notícia pero el noticias.php no me la lee.
Voy al admin_noticias y funciona, parece que todo está en orden pero el único archivo que faya es el noticias.php que me dice que no hay ninguna noticia publicada..

¿Porque me sucede esto?

EDITADO: Ya está solucionado, esque había canviado el nombre de las tablas y me había olvidado de modificar el noticias.php ;)
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Wold en 04 de Febrero de 2007, 13:30:57 pm

Warning: mysql_query(): Access denied for user 'admin124830'@'localhost' (using password: NO) in /home/virtual/sitio124830/www/news/admin_noticias.php on line 67

Warning: mysql_query(): A link to the server could not be established in /home/virtual/sitio124830/www/news/admin_noticias.php on line 67

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/virtual/sitio124830/www/news/admin_noticias.php on line 68
No hay ninguna noticia publicada
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/virtual/sitio124830/www/news/admin_noticias.php on line 81

ami me da este error :S ya cree la tabla en la base de datos i hize el archivo conectar :S
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: naveda en 04 de Febrero de 2007, 17:42:47 pm
Wold segun indica el error, el usuario admin124830 no tiene acceso a la base de datos, configura correctamente los datos de conexion
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Wold en 04 de Febrero de 2007, 19:26:56 pm
:S los datos los puse bien, se lo enseñe a WarezD@rk :S
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: javier_modding en 17 de Agosto de 2007, 04:56:23 am
xd cuando escribo la noticia no sale ni bbcode ni los smilies sale escrito nomas -.-
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: x.mara.x en 29 de Septiembre de 2007, 19:28:28 pm
Citar
Nada nada, ya me va.. :S

Ahora me da error en el panel de admin...

Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 296
No hay ninguna noticia publicada
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 392

292: $query = mysql_query("SELECT * FROM `noticias_phperos` ORDER BY `id` DESC"); //Se extraen las noticias en orden reciente

296: if (mysql_num_rows($query)) { // Se comprueba si hay alguna noticia publicada

392: mysql_free_result($noticia); //Se borran los datos usados

PD: la tabla que he creado yo es noticias_phperos

pues creo que lo de la tabla sale en muchos archivos.. asi que te conviene no cambiarla porque si no la tendras que cambiar en otros achivos o si no no sirve.. creo yo
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: Revancha en 29 de Septiembre de 2007, 19:29:30 pm
Si es que te das cuenta el problema fue solucionado...
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: x.mara.x en 29 de Septiembre de 2007, 19:33:09 pm
Si es que te das cuenta el problema fue solucionado...
cmo? no entendi :S que ya lo arreglaron a sorry xddd
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: x.mara.x en 29 de Septiembre de 2007, 19:34:36 pm
xd cuando escribo la noticia no sale ni bbcode ni los smilies sale escrito nomas -.-
los smilies supongo que es porque no has creado la carpeta de smilies con arhdivos con los nombres que salen.. y lo de bbcodes la verdad no lo se
Título: Re: Sistema de Noticias Simple - 3ª Parte
Publicado por: djmourino en 14 de Enero de 2008, 15:28:03 pm
wenas a todos/as, soy nuevo por aquí y tengo una duda, se podría implementar el filtro de palabras en el propio formulario ?, me refiero a que el usuario cuando envié el formulario este verifique antes de enviarlo a la db si el contenido de la noticia contiene alguna palabra censurada y en caso de contenerla que le ponga un error del tipo "a utilizado una palabra censurada" o mucho mejor "Las palabras x x x x están censuradas por favor cámbiela/s por otra/s" donde x es la palabra que no queremos, creo que esta forma seria mucho mejor que censurarla en la propia noticia.


Un saludo a todos/as.