Foros del Web » Programando para Internet » Javascript » Frameworks JS »

migrando libro de visitas

Estas en el tema de migrando libro de visitas en el foro de Frameworks JS en Foros del Web. Hola: La verdad es que en parte estaba intentando responder este otro tema: http://www.forosdelweb.com/showthread.php?t=321547 pero al no estar seguro de que interese un "paso a ...
  #1 (permalink)  
Antiguo 06/08/2005, 11:25
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
migrando libro de visitas

Hola:

La verdad es que en parte estaba intentando responder este otro tema: http://www.forosdelweb.com/f127/formulario-ajax-321547/ pero al no estar seguro de que interese un "paso a paso" estoy iniciando este tema.

El libro de visitas es del todo artesanal (creado con el block de notas y con muchísimos errores corregidos con ayuda de estos foros)

El sitio actual es este: http://www.pepemolina.com/visitas/comentarios.php y las pruebas las estoy realizando en mi "localhost".

El código de la página es este:

Código:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" >
<link rel="shortcut icon" href="../sucaricatura.ico" />
<style>
p	{
	text-indent:1cm;
	margin: 0px auto;
	}
body	{
	text-align: center;
	}
</style>

<?
$linea = "<table align=center width=95% height=6>";
$linea .= "<tr><td width=100% height=100% bgcolor=blue>";
$linea .= "</td></tr></table>";

$minilinea = "<table align=left width=50% height=2>";
$minilinea .= "<tr><td height=100% bgcolor=green>";
$minilinea .= "</td></tr></table>";

?>
<title>Visitas
</title>
<script type="text/javascript" >
function abrirEditor()	{
	var anchoPantalla = screen.width;
	var altoPantalla = screen.height;

	var anchoVentana = 700;
	var altoVentana = 560;

	var ventana = "editor";
	var enlace = "";
	var params = "status=yes,width=" + anchoVentana + ",height=" + altoVentana;
	params += ",top=" + (altoPantalla / 2 - (altoVentana / 2));
	params += ",left=" + (anchoPantalla / 2 - (anchoVentana / 2));
	window.open(enlace, ventana, params);
}
</script>

</head>
<body>
<div align=center width=100%>
<h1 style="text-align: center; font-size: 24px; color: blue;">Libro de visitas</h1>
<div style="width: 80%;" >
<div style="text-align: justify;" >

<?
function strFecha($fecha)	{
	if ($fecha == "00000000000000")	{return "deconocida";}
	$dia = substr($fecha, 6, 2);
	$mes = substr($fecha, 4, 2);
	$ano = substr($fecha, 0, 4);

	$hora = substr($fecha, 8, 2);
	$minu = substr($fecha, 10, 2);
	$segu = substr($fecha, 12, 2);

	$devolver = "$dia/$mes/$ano, a las $hora:$minu:$segu";
	return $devolver;
}

function parrafar($dato)	{
	return "<p>".str_replace("<br />", "</p>\n<p>", nl2br($dato))."</p>";
}

function alternaColor($n)	{
	if (($n % 2) == 0) 
		return "#f0fff0";
	else
		return "#fff0f0";
}

function resultado($consulta, $linea)	{
	$cant = mysql_num_fields($consulta);
	$ancho = 100 / $cant."%";
	$num = mysql_num_rows($consulta);
	for ($i = 0; $i < $num; $i ++)	{
		echo "<div style='padding: 5px; margin: 2px; background-color: ".alternaColor($i)."; border: 1px ridge blue' >";
		$row = mysql_fetch_array($consulta);
		echo "<u>Mensaje enviado por: $row[Nombre], con fecha: ".strFecha($row['fecha'])."</u>\n<br>\n";
		if ($row["desde"] != "")
			echo "Procede: $row[desde]\n<br>\n";
		if ($row["Email"] != "")
			echo "E-mail:<a href=mailto:$row[Email] > $row[Email] </a>\n<br>\n";
		if ($row["URL"] != "")
			echo "URL:<a href=$row[URL] target=blank> $row[URL] </a>\n<br>\n";
		if ($row["califica"] != "")
			echo "Calificación: <img src=$row[califica] >\n<br>\n";
		echo "Comentario:\n<br>\n<table align=left width=50% height=2><tr><td height=100% bgcolor=green></td></tr></table>\n<br>\n";
		echo parrafar($row['comentario'])."\n</div>";
		echo "\n<br />\n$linea\n<br />";
	}
}

?>
<div style='background-Color:pink; padding: 5px; margin: 2px; border: 1px ridge blue' >
<p>
<b>Nota del webmaster: Puede firmar el libro de visitas pinchando en el siguiente enlace... 
<a href="editar.html" target="editor" onclick="abrirEditor()" > aquí </a>
o pulsando el botón que se encuentra a pie de página...
</p>
</div>
<?
echo "\n<br />\n$linea\n<br />";
$servidor = $_SERVER["SERVER_NAME"];
#echo $servidor."<br />";
if ($servidor == "localhost")	{
	include("variables-localhost.php");
}
else	{
	include("variables-remotas.php");
}
include("conectar.php");

$sql = "SELECT * FROM $tabla WHERE activo = 1 order by 'sitio' desc";

if ($res = mysql_db_query($basedatos, $sql))
{
	resultado($res, $linea);
}
else	{
	echo "resultado inválido: $res";
}
?>
</div>
<form action="editar.html" target="editor" onsubmit="abrirEditor()" >
<button type="submit" ><table style="margin: 10px 0px;"><tr><td><img src="12.gif" /></td><td> Firmar en el libro </td><td><img src="12.gif" /></td></tr></table></button>
</form>
</div>
</div>
</body>
</html>
Bien... la idea es que después de crear un nuevo mensaje (desde un popup) se inserte en la página padre. La resolución sin ajax era sencillamente recargar la página desde el botón enviar del editor...

Código:
function salida()	{
	opener.document.location.reload();
	window.close();
}
La primera modificación fue cambiar la "salida del editor por:

Código:
function salida()	{
	opener.actualizar();
	window.close();
}
Y en el libro diferenciar dos salidas dependiendo del soporte ajax:

Código:
function actualizar()	{
	if (window.XMLHttpRequest || window.ActiveXObject)
		actualizarAjax();
	else
		location.reload();
}
La función actualizarAjax() aún no la tengo definida...

El siguiente paso fue crear el fichero que servirá para obtener los nuevos datos...

... continuará...
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #2 (permalink)  
Antiguo 06/08/2005, 12:01
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
... viene del mensaje anterior...

Con pocas modificaciones del fichero comentario.php obtuve actualizar.php que muestra un fichero XML con los elementos del libro de visitas para insertar.

Código:
<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>';

function strFecha($fecha)	{
	if ($fecha == "00000000000000")	{return "deconocida";}
	$dia = substr($fecha, 6, 2);
	$mes = substr($fecha, 4, 2);
	$ano = substr($fecha, 0, 4);

	$hora = substr($fecha, 8, 2);
	$minu = substr($fecha, 10, 2);
	$segu = substr($fecha, 12, 2);

	$devolver = "$dia/$mes/$ano, a las $hora:$minu:$segu";
	return $devolver;
}


function parrafar2($dato)	{
	return str_replace("<", "[", str_replace(">", "]", $dato));
}

function parrafar($dato)	{
	return "<p>".str_replace("<br />", "</p>\n<p>", nl2br($dato))."</p>";
}

function alternaColor($n)	{
	if (($n % 2) == 0) 
		return "#f0fff0";
	else
		return "#fff0f0";
}

function resultado($consulta, $linea)	{
	$cant = mysql_num_fields($consulta);
	$ancho = 100 / $cant."%";
	$num = mysql_num_rows($consulta);
	for ($i = 0; $i < $num; $i ++)	{
		$row = mysql_fetch_array($consulta);
		echo "<nombre>$row[Nombre]</nombre>\n<fecha>".strFecha($row['fecha'])."</fecha>\n";
		if ($row["desde"] != "")
			echo "<desde>$row[desde]</desde>\n";
		if ($row["Email"] != "")
			echo "<email>$row[Email]</email>\n";
		if ($row["URI"] != "")
			echo "<uri>$row[URI]</uri>\n";
		if ($row["califica"] != "")
			echo "<califica>$row[califica]</califica>\n";
		echo "<comentario>".parrafar2(parrafar($row['comentario']))."</comentario>\n";
	}
}

$servidor = $_SERVER["SERVER_NAME"];
if ($servidor == "localhost")	{
	include("variables-localhost.php");
}
else	{
	include("variables-remotas.php");
}
include("conectar.php");
if (isset($_GET['buscar']))
	$busqueda = $_GET['buscar'];
else
	$busqueda = 1;

echo '<pepe>';

$sql = "SELECT * FROM $tabla WHERE activo = 1 and sitio >= $busqueda order by 'sitio' ";
if ($res = mysql_db_query($basedatos, $sql))
{
	resultado($res, $linea);
}
else	{
	echo "resultado inválido: $res";
}

echo '</pepe>';


?>
Se puede ver en este enlace:
http://www.pepemolina.com/visitas/actualizar.php

Se le puede añadir ?buscar=x (cambiando la x por un número para obtener los elementos superiores a esa x... (sitio >= $busqueda)

Nótese que se han reemplazado los elementos "<", ">" por los correspondientes corchetes para evitar que se forme mal el documento XML, mediante la función parrafar2.

Luego desde javascript habría que poner split("[").join("<").split("]").join(">") para la reconstrucción...

Creo que los siguientes pasos serán preparar el documento creando una variable con el último "sitio" de la base de datos para pasarlo como parámetro de la petición ajax, y dándole un id a las capas que me servirán de referencia para insertar los nuevos datos pedidos en la petición ajax...

En los próximos días seguiré con este "paso a paso".



NOTA: Para poner este mensaje tuve que cambiar la cadena [URL.../URL]
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 06/08/2005, 17:00
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 7 meses
Puntos: 35
loading..........


Bueno personalmente no veo la necesidad de un popup para insertar un nuevo comentario, podrìas personalizarlo con ajax para hacer una peticion al formulario de inserciòn del nuevo registro o simple javascript para esconder y mostrar un formulario sin tener la necesidad de usar ajax.

Ahora bien tus resultados en ajax los tomas en un XML creo que te complicas demasiado con eso, si tus resultados vienen de la base de datos, podrìas formatearlo directamente en el servidor y con ajax pedìr que en la lista de mensajes se acople el nuevo mensaje, es màs podrìas hacer peticiones limpias con ajax para que se actulize sin necesidad de un intervalo.

Código PHP:
function monitor_get_xmlhttp() {
    try {
        
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (
e) {
        try {
            
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (
E) {
            
xmlhttp false;
        }
    }
    if (!
xmlhttp && typeof XMLHttpRequest!='undefined') {
        
xmlhttp = new XMLHttpRequest();
    }
    return 
xmlhttp
}
function 
open_blabla_recibir()
{
    
_target="blabla_body"
    
_objetus_br=monitor_get_xmlhttp()
    
_values_send="function=open_blabla_recibir"
    
_objetus_br.open("POST",xmlhttprequest_url,true);
    
_objetus_br.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    
_objetus_br.send('&'+_values_send);
    
_objetus_br.onreadystatechange=function() {
        if (
_objetus_br.readyState==1)
        {
            
document.getElementById("_status_chat_").innerHTML="Cargando";
        }
        else if(
_objetus_br.readyState==2)
        {
            
document.getElementById("_status_chat_").innerHTML="Carga completa paso al siguiente nivel";
        }
        else if(
_objetus_br.readyState==3)
        {
            
document.getElementById("_status_chat_").innerHTML="Recibiendo datos";
        }
        else if (
_objetus_br.readyState==4)
        {
            
document.getElementById("_status_chat_").innerHTML="Operacion terminada";

            if(
_objetus_br.status==200)
            {
                if(
_objetus_br.responseText==' ')
                {
                }
                else
                {
                    
document.getElementById(_target).innerHTML=_objetus_br.responseText+document.getElementById(_target).innerHTML
                
}
            }
            
open_blabla_recibir();
        }
    }
    
document.getElementById("open_blabla_submit").disabled=false

esto yo lo considero limpio, porque cuando termina el proceso, y vuelve a cargarlo sin peligro de trabarse, notese el readyState.

Ahora si no usas ajax para cargar el nuevo contenido, podrìas usar el simple proceso PIDES DATOS FORM -> PROCESAS EN EL SERVIDOR = MUESTRAS DATOS PROCESADOS. osea que no uses javascript para recargar la pàgina.... eso se te complica mas porque usas ese popup para insertar el comentario.

A parte de que es dificultuoso poner un simple comentario, en firefox me pestañea las opciones de emoticos,url,etc 1 click de cada 10 logran acertar lo que quiero.



connection closed.
__________________

Maborak Technologies
  #4 (permalink)  
Antiguo 08/08/2005, 02:02
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola:

MaBoRaK: Te agradezco las sugerencias, que voy a mirar detenidamente para mejorar la migración, pero primero voy a intentar seguir el modelo actual, pero aplicar las mejoras luego... aunque me parece que no vale el método post con opera (lo has llegado a probar)

Siguiendo con el paso a paso...

La definición de la tabla es la siguiente:

Código:
CREATE TABLE `visitas` (
  `sitio` int(11) NOT NULL auto_increment,
  `ip` varchar(15) NOT NULL default '',
  `Nombre` varchar(255) NOT NULL default '',
  `desde` varchar(50) NOT NULL default '',
  `fecha` timestamp(14) NOT NULL,
  `Email` varchar(255) NOT NULL default '',
  `URL` varchar(255) NOT NULL default '',
  `califica` varchar(30) NOT NULL default '',
  `comentario` text NOT NULL,
  `activo` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`sitio`)
) TYPE=MyISAM COMMENT='Libro de visitas';
Y para insertar los nuevos comentarios he modificado un par de etiquetas añadiéndole un id:

Al contenedor de comentarios id="contenedor", y al sitio donde debe insertarse id="aquí"... y luego para futuras inserciones aqui = document.getElementById('aqui')

Luego las inserciones se harían más o menos así:

aqui.parentNode.insertBefore(dato, aqui);

Ahora que lo pienso, no es necesaria la definición del contenedor, porque se referencia con parentNode.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 08/08/2005, 11:48
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 7 meses
Puntos: 35
loading.................



caricatos: GET y POST no funciona hasta opera 7.6 pero desde 8.0 funciona GET y POST al parecer anteriormente no tenian incorporado xmlhttprequest lo leì en su Changelog de opera.



connection closed.
__________________

Maborak Technologies
  #6 (permalink)  
Antiguo 17/08/2005, 09:11
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola: Acabo de subir una versión modificada (también puse otro nombre por las dudas) que parece que va bien... tardé un poco porque en mi localhost me daba errores con mozilla, pero al subirlo lo probe en explorer y mozilla y va bien (parece)...

El código está en: http://www.pepemolina.com/visitas/comentarios2.php

En breve resumiré las modificaciones que hice.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
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




La zona horaria es GMT -6. Ahora son las 06:52.