Foros del Web » Programando para Internet » PHP »

Cada noticia con su caja de comentarios. Ayuda.

Estas en el tema de Cada noticia con su caja de comentarios. Ayuda. en el foro de PHP en Foros del Web. Buenas, resulta q quiero agregarle comentarios al sistema de noticias para q los usuarios tengan mas participacion. El tema es q el sistema de comentarios ...
  #1 (permalink)  
Antiguo 08/03/2010, 00:31
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Cada noticia con su caja de comentarios. Ayuda.

Buenas, resulta q quiero agregarle comentarios al sistema de noticias para q los usuarios tengan mas participacion.
El tema es q el sistema de comentarios no requiere base de datos, por lo q los datos se guardan en un archivo txt.
Ahora bien, primero q nada elegi ese sistema de comentarios porq es muy sencillo, ya q no queria nada sofisticado ni crearme tantos problemas con la base de datos y para empezar esta bien, si en un futuro la web tiene un crecimiento importante de usuarios, se cambiaria el sistema.
El problema q tengo, o mejor dicho, lo q quiero lograr es q cada noticia tenga su caja de comentarios y no compartir los comentarios con todas las noticias, se entiende?


Estoy utilizando este sencillisimo script: http://www.dscripts.net/scripts/php/comments-ram/readme/

...en donde los comentarios se muestran de la forma <?php view_comments(page id); ?>, donde page_id seria el archivo de texto q contiene los datos de la caja de comentarios (nick, email, fecha, texto), en este caso el archivo de texto que vino como predeterminado es 1.txt, entonces quedaria <?php view_comments(1); ?>

Entonces mi pregunta es: se puede, de alguna manera, lograr q cada noticia tenga su caja de comentarios?

Aqui se puede ver un ejemplo del sistema de comentarios en la noticia: http://fya.webuda.com/prueba/visor.php?not_ID=6

Bueno, eso seria todo.
Gracias y saludos.
  #2 (permalink)  
Antiguo 08/03/2010, 00:42
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Si es posible, pero creo que seria mas eficiente cambiar el sistema de comentarios para usar base de datos, realmente no es tan complicado.

Para seguir manejandolo con archivos de texto, solo tendrias que modificar el script, de manera que al leer o agregar comentarios abra un archivo especifico; por ejemplo, en el enlace que colocas, la ID de noticia es 6, el nombre de archivo para comentarios podria ser: comentarios_6.txt y, para usarlo en el script, algo como:

Código PHP:
Ver original
  1. $noticia = $_GET['not_ID'];
  2. $archivo = 'comentarios_' . $noticia . '.txt';
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 08/03/2010, 01:09
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Primero q nada gracias por tu respuesta Triby.
Precisamente no uso con base de datos porq soy novato aun, ademas busque muchos ejemplos pero la mayoria son scripts grandes y yo lo unico q quiero es un formulario con nick y texto para dejar un simple comentario, nada sofisticado.
Por eso opte por este sin db y mas adelante, cuando adquiera mas conocimientos, crear uno mejor.

Lo q no entendi es como relacionar el codigo q me dejaste con el script.

Este es el codigo q utiliza el sistema de comentarios:

Código PHP:
<?function open_file($id)
{
    if(!
file_exists('comments'))
       
mkdir('comments');
    
$file 'comments/'.$id.'.txt';
    
$fp = @fopen($file'r');
    if(!
$fp)
    {
        
$fp fopen($file'w');
        
fclose($fp);
        
$fp fopen($file'r');
    }
    return 
$fp;
}
    
    
// function to shorten long url
function shorten_long_words($str)
{
    
$maxwordlen     30;
    
$replacement    '........';
    
    
$rpls           round(strlen($replacement)/2);
    
$words          explode(' '$str);
    
    for(
$i=0$i<count($words); $i++)
    {
        
$wordlen strlen($words[$i]);
        
        if( 
$wordlen $maxwordlen)
        {
            
$del        round(($wordlen $maxwordlen)/2);
            
$mid        round($wordlen/2);
            
$start      $mid $del $rpls;
            
$end        $mid $del $rpls;

            
$first      substr($words[$i], 0$start);
            
$last       substr($words[$i], $end);
            
            
$words[$i]  = $first.$replacement.$last;
        }        
    }
    
$str implode(' '$words);
    return 
$str;
}
    
// stri_replace() function
// Avaliable in PHP 5 but defined as custom function for php 4 as stri_rep

function stri_replace($find,$replace,$string)
{
    if(!
is_array($find))
        
$find = array($find);
        
    if(!
is_array($replace))
    {
        if(!
is_array($find))
            
$replace = array($replace);
        else
        {
            
// this will duplicate the string into an array the size of $find
            
$c count($find);
            
$rString $replace;
            unset(
$replace);
            for (
$i 0$i $c$i++)
            {
                
$replace[$i] = $rString;
            }
        }
    }
    foreach(
$find as $fKey => $fItem)
    {
        
$between explode(strtolower($fItem),strtolower($string));
        
$pos 0;
        foreach(
$between as $bKey => $bItem)
        {
               
$between[$bKey] = substr($string,$pos,strlen($bItem));
               
$pos += strlen($bItem) + strlen($fItem);
        }
        
$string implode($replace[$fKey],$between);
    }
    return(
$string);
}
    
    
// VIEW COMMENTS +++++++++++++++++
function view_comments($id)
{
?>
<script type="text/javascript" language="JavaScript" src="comments_ram.js"><!--//--></script>
<div id="comments">
<script type="text/javascript" language="JavaScript">
<!--
write_comments_control(<?php echo $id ?>);
//-->
</script>
<?php
    $fp 
open_file($id);
    
$read     fread($fp80000);
    
    if(!empty(
$read))
    {
        
$post    split ('---'$read);
        for(
$i=0$i<count($post); $i++)
        {
            
$data split ('#'$post[$i]);
            
$date     $data[0];
            
$name    $data[1];
            
$email    $data[2];
            
$comment$data[3];
            
            if(!empty(
$email))
                
$name '<a href="mailto:'.$email.'">'.$name.'</a>';
?>
<div class="item">
<div class= "name">[ 2006-12-05 ] :: <?php echo $name?></div>
<div class="comment"><?php echo $comment?></div>
</div>
<?php
        
}
    }
    else
    {
        echo 
'<div class="item">No comments posted here.</div>';
    }
?>
</div>
<?php
}
    
// POST COMMENTS +++++++++++++++++    
function post_items($id)
{
    
    
// Settings::::::::::::
    
$allowed         10;                        // Number of entries to store
    
$spliter         '---';                    // String that is used to split each posts from file
    
$date            date('Y-m-d'time());    // Todays data format
    
$filter_file     'bad_words.txt';    // File that stores all words to filter
    
$replacement     '***';                        // The text that will replace bad words if found
    
    
$name         $_POST[name];
    
$email         $_POST[email];
    
$comment     $_POST[comment];    
    
    if(empty(
$name) or empty($comment))
    {
        echo 
'Name and comment can\'t be left blank';
        exit();
    }
        


// This part filters the user input ===========================================================================
    
    // Part 1: ###### Filters url injection
    
    // array of text to ban
    
$ban = Array('http://''www\.''\.com''\.net''\.org''\.edu''\.tk''\.nfo''\.uk''\.au''\.us');
    
    for(
$i=0$i<count($ban); $i++)
    {
        
$name      eregi_replace($ban[$i], ''$name);
        
$comment eregi_replace($ban[$i], ''$comment);
    }
        
    
// Part 2: ###### Filters special charecters and html tag escape situtation
    // Filter name
    
$name            ereg_replace('[^A-Za-z ]'''$name);
    
    
// Filter comment
    
$comment        ereg_replace('[#]'''$comment);
    
$comment        eregi_replace($spliter''$comment);
    
$comment         strip_tags($comment);
    
$comment         addslashes($comment);
    
    
    
//Filter email if available
    
if(!empty($email))
    {
        
$email    ereg_replace('[^A-Za-z@._]'''$email);
    }
        
    
// Part 3: ###### Seeks and filter junk long words
    
$comment shorten_long_words($comment);
        
    
// Part 4: ###### Seeks and filter bad words
    
    // The file that contains all the bad words to filter
    // Put the bad words in this file, separate words with new line
    
    
    // This reads the file contents and stores the result words in a array
    
$bad_words file($filter_file);
    
    
// Now loops through each bad words and replace every time badword found
        // Explodes each bad words in array and store it in a temporary vaiable 
        // And Makes case insensitive replacement of bad word with replacement
    // Filtering name and comment    
    
for($i=0$i<sizeof($bad_words); $i++) 
    {
        
$temp       rtrim($bad_words[$i]);
        
$name        stri_replace ($temp$replacement$name);
        
$email        stri_replace ($temp$replacement$email);
        
$comment    stri_replace ($temp$replacement$comment);
    }
        
    
// Note: I didn't filter email address
    
// End of filtering user input =====================================================================================
    
    // Now formatting out the new entry        
    
$new_post $date.'#'.$name.'#'.$email.'#'.$comment.'
'
;
    
    
//opens the file in read mood
    
$file 'comments/'.$id.'.txt';
    
$fp = @fopen($file'r');

    
// If file can be openned then do this
    
if($fp)
    {
        
//read file
        
$read     fread($fp80000);
        
        
// if not blank file then splits to find each posts
        
if(!empty($read))
        {
            
// Finds out how many time spliter found. this value+1 is the number of post stored in file
            
$count substr_count($read,$spliter);
            
$count++;    // This is number that how many post are in the file.
            
            // Start activities to delete last entry when allowed limit touches
            
if($count == $allowed)
            {
                
// Finds out the last occurance positon of spliter.
                // Required to delete the last entry if it exceeds maximum allowed limit
                
$pos strrpos($read$spliter);
                
// Now we shall delete the  string after $pos
                
$read substr($read0$pos);
            }
            
// The output to write on file
            
$output $new_post.$spliter.'
'
.$read;
        }
        else    
// When blank file then only write the new entry in file;
        
{
            
$output $new_post;
        }
            
        
//close file;
        
fclose($fp);
    }
    
    
// Now opens the file in write mood to save new item
    
$file 'comments/'.$id.'.txt';
    
$fp     fopen($file'w');                        
    
fwrite($fp$output80000);
    
fclose($fp);
}
    
// End of Functions ------------------------------------------------------------------------------------------------


$action $_POST['action'];


if(
$action == 'post')
{
    
$id $_POST['id'];
    
post_items($id);
    echo 
'<title>Adding your comment...</title><body onload="window.close();"></body>';        
}
?>
Y este es el q hice para mostrar la noticia con su caja de comentarios, q seria visor.php:

Código PHP:
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento sin título</title>
<style type="text/css">
.style1 {
    text-align: center;
    font-size: xx-large;
}
</style>
</head>

<body style="background-color: #FFFFCC">
<?php include('db-cnx.php'); ?>
      <table style="width: 100%" align="center">
          <tr>
              <td class="style1">
<?php
      $not_ID 
$_GET['not_ID'];
 
$sqlQueryNot mysql_query("SELECT not_ID, notUser, notTitulo, notTexto FROM sn_noticias WHERE not_ID = '$not_ID'"$db_link)
      or die(
mysql_error);
      while(
$rowNot mysql_fetch_array($sqlQueryNot)){
      echo 
$rowNot['notUser'];
      echo 
"<h1>$rowNot[notTitulo]</h1>";
      echo 
nl2br($rowNot['notTexto']);
}
?>
</td>
</tr>
</table>
<br>
<table style="width: 100%">
    <tr>
        <td>
        <?php include('comments_ram.php'); ?>

        <?php view_comments(1); ?>
   </td>
    </tr>
     </table>

      </body>
</html>
No se con cual de los dos relacionarlo.
  #4 (permalink)  
Antiguo 08/03/2010, 01:30
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

veamos, el id de la noticia es $rowNot['not_ID'] asiq deberias poner esto:
Código PHP:
    <?php view_comments($rowNot['not_ID']); ?>
  #5 (permalink)  
Antiguo 08/03/2010, 01:45
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Cita:
Iniciado por Eleazan Ver Mensaje
veamos, el id de la noticia es $rowNot['not_ID'] asiq deberias poner esto:
Código PHP:
    <?php view_comments($rowNot['not_ID']); ?>
Pero no es la noticia la q quiero mostrar, eso ya esta solucionado y los comentarios tambien se visualizan, lo q quiero es q cada noticia tenga su caja de comentarios, tal como lo explico Triby, lo q no entiendo es donde colocar ese fragmento de codigo.
  #6 (permalink)  
Antiguo 08/03/2010, 02:19
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Perdon, te entendí mal.

Entonces debes poner las lineas de los comentarios dentro del while de noticias

Un saludo!
  #7 (permalink)  
Antiguo 08/03/2010, 02:37
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

A ver, se me complico.
Cita:
los comentarios se muestran de la forma <?php view_comments(page id); ?>, donde page_id seria el archivo de texto q contiene los datos de la caja de comentarios (nick, email, fecha, texto), en este caso el archivo de texto que vino como predeterminado es 1.txt, entonces quedaria <?php view_comments(1); ?>
Entonces lo q no entiendo es en cual de los dos codigos q yo deje tengo q insertar el q me dejo triby y de hacerlo asi, q deberia ir en <?php view_comments(QUE DEBERIA IR AQUI SI ES QUE MODIFICO EL CODIGO); ?>
  #8 (permalink)  
Antiguo 08/03/2010, 02:52
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Supongo, que la noticia 1 tendrá el archivo 1.txt, la 2 el 2.txt, así sucesivamente, no?
  #9 (permalink)  
Antiguo 08/03/2010, 02:57
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

reborn, definitivamente lo mas facil es hacer lo que te sugirio Eleazan, incluir $rowNot['not_ID'] al llamar la funcion que muestra los comentarios dentro del while donde cargas las noticias.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 08/03/2010, 03:28
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Ok, gracias a los dos.
  #11 (permalink)  
Antiguo 08/03/2010, 13:47
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

O sea q me quedaria asi? <?php view_comments($rowNot['not_ID']); ?>
Al hacer eso, me tira error el primer codigo q puse arriba, el q pertenece a los comentarios.
Yo al modificar la funcion view%comments, tambien tengo q modificar el primer codigo en la parte de: function open_file($id) q es la q genera los txt y esa es la parte q se me complica...o por lo menos asi lo entiendo yo.
  #12 (permalink)  
Antiguo 08/03/2010, 15:52
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Teoricamente lo unico que debes hacer es:

Código PHP:
Ver original
  1. include('comments_ram.php'); // El include antes de leer las noticias
  2. while( -- aqui el ciclo para leer las noticias --) {
  3.       echo "Aqui presentas la noticia";
  4.       // Y despues los comentarios:
  5.       view_comments($rowNot['not_ID']);
  6. }
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 08/03/2010, 15:53
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Perdon por mi ignorancia, yo hice la pregunta suponiendo q los archivos .txt se generan automaticamente para cada noticia, eso es correcto o no?
  #14 (permalink)  
Antiguo 08/03/2010, 15:58
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Si, es correcto, la funcion open_file() del script verifica que exista el archivo, si no existe, lo crea, por lo que la unica limitante seria que PHP no pueda crear archivos y la opcion seria asignar permisos (CHMOD) 755 o 777 en la carpeta donde quieres guardar los comentarios.
__________________
- León, Guanajuato
- GV-Foto
  #15 (permalink)  
Antiguo 08/03/2010, 16:07
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Cada noticia con su caja de comentarios. Ayuda.

Gracias Triby, nunca me doy cuenta de los errores mas simples, en este caso el de los permisos, ahora anda perfecto.
Te agradezco.
Saludos.

Etiquetas: caja, comentarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:33.