viernes, 29 de mayo de 2009

Practica 6 Código

delNoticia.php


<?php
$accion=$_GET['accion'];
if($accion == 'Borrar'){
$id = "borrar";
}elseif($accion == 'Modificar'){
$id = "modificar";
}
?>
<head>
<title>Borrar Noticia</title>
<meta content="text/html; charset=[b]iso-8859-1[/b]" http-equiv="Content-Type" />
</head>

<body><!-- el formulario -->
<form name="noticia" id="noticia" action="" >
<blockquote>
<p class="formTitl">Seleccione la noticia que desee <?=$id?>:<br />
<select name="id">;
<?php
$xml = simplexml_load_file( 'noticias.xml' );
$result = $xml->xpath("//noticia");
foreach ($result as $noticia){
echo '<option value="'.$noticia["id"].'" >'.utf8_decode($noticia->titulo).'</option>';
}?>
</select>
<input type="submit" id="<?=$id?>" class="button" name="<?=$id?>" value="<?=$accion?>" />
</p>
</blockquote>
</form>
</body>

addNoticia.php


<html>
<head>
<title>Add Noticia</title>
</head>

<?php
$notID = $_GET['id'];
$notTitulo="";
$notDesc="";
$notCuerpo="";
$notAutor="";
$notFecha="";
$notCategoria="";
$categorias = array("Discos", "El Grupo", "Conciertos", "Otros");
if(isset($notID)){
$xml = simplexml_load_file( "noticias.xml" );
$result = $xml->xpath("//noticia[@id=".$notID."]");
foreach ($result as $noticia){
$notTitulo = utf8_decode($noticia->titulo);
$notDesc = utf8_decode($noticia->descripcion);
$notCuerpo = utf8_decode($noticia->cuerpo);
$notAutor = utf8_decode($noticia->autor);
$notFecha = $noticia->fecha;
$notCategoria = utf8_decode($noticia->categoria);
}
}?>

<body>
<form name="noticia" id="noticia" action="" >
<blockquote>
<p class="formTitl">T&iacute;tulo de la Noticia<br /><input type="text" name="notTitulo" size="50" value="<?=$notTitulo?>"/></p>
<p class="formTitl">Breve descripci&oacute;n: <br /><textarea name="notDesc" rows="5" cols="75"><?=$notDesc?></textarea></p>
<p class="formTitl">Cuerpo de la Noticia<br /><textarea name="notCuerpo" rows="10" cols="75"><?=$notCuerpo?></textarea></p>
<p class="formTitl">Autor: <input type="text" name="notAutor" size="20" value="<?=$notAutor?>"/></p>
<input type="hidden" name="notFecha" value="<?=$notFecha?>" />
<input type="hidden" name="notID" value="<?=$notID?>" />
<p class="formTitl">Categor&iacute;a<br />
<select name="notCategoria">
<?php
foreach ($categorias as $categoria){
echo '<option value="'.$categoria.'" ';
if(!strcmp($categoria, $notCategoria)){
echo 'selected="selected" ';
}
echo '>'.$categoria.'</option>';
}?>
</select>
<input type="submit" id="escribir" name="escribir" class="button" value="Enviar" />
</p>
</blockquote>
</form>
</body>
</html>

borrarNoticia.php


<?php

$notID= $_POST['id'];
$xml = simplexml_load_file( 'noticias.xml' );
$result = $xml->xpath("//noticia[@id!=".$notID."]");
$noticiones="<noticias>";
foreach($result as $new){
$noticiones = $noticiones.$new->asXML();
}
$noticiones = $noticiones."</noticias>";
$xml = simplexml_load_string($noticiones);
if(!$fp=fopen("noticias.xml","w+")) echo "No se ha podido abrir el fichero";
else{
file_put_contents("noticias.xml",$xml->asXML());
if(fclose($fp)) echo $notID;
}

?>

escribirNoticia.php


<?php
// comprobamos que el formulario no envie campos vacios
if(!empty($_POST['notTitulo']) && $_POST['notCuerpo'] && $_POST['notAutor'] && $_POST['notDesc'] && $_POST['notCategoria']){

// creamos las variables y les asignamos los valores a insertar
$notTitulo = utf8_encode($_POST['notTitulo']);
$notFecha = utf8_encode($_POST['notFecha']);
if(empty($notFecha)){
$notFecha= date("r");
}
$notAutor = utf8_encode($_POST['notAutor']);
$notCategoria = utf8_encode($_POST['notCategoria']);
$notDescripcion = utf8_encode($_POST['notDesc']);
$notCuerpo = utf8_encode($_POST['notCuerpo']);

// Aquí insertamos el valor del los datos al final de nuestro XML.
//En primer lugar, deberíamos ver cual es el último id que estamos usando
//en nuestra base de datos xml, o cual estamos sustituyendo
$notID=$_POST['notID'];
$xml = simplexml_load_file( 'noticias.xml' );
if(empty($notID)){
if(!$result = $xml->xpath("//noticia/@id")){
$fed = 0;
}else{
$max=0;
foreach($result as $var){
if($max<(int)$var['id']){
$max=(int)$var['id'];
}
}
$fed = $max;
}
$notID = $fed + 1;
}else{
$result = $xml->xpath("//noticia[@id!=".$notID."]");
$noticiones="<noticias>";
foreach($result as $new){
$noticiones = $noticiones.$new->asXML();
}
$noticiones = $noticiones."</noticias>";
$xml = simplexml_load_string($noticiones);
}

//Añadimos la noticia con ese id.
$noticia = $xml->addChild('noticia');
$noticia['id']= $notID;
$noticia->titulo = $notTitulo;
$noticia->fecha = $notFecha;
$noticia->autor = $notAutor;
$noticia->categoria = $notCategoria;
$noticia->descripcion = $notDescripcion;
$noticia->cuerpo = $notCuerpo;
$noticia->enlace = 'leerNoticia.php?id='.$notID;

//Y por último, lo guardamos en el archivo.
if(!$fp=fopen("noticias.xml","w+")) echo "No se ha podido abrir el fichero";
else{
file_put_contents("noticias.xml",$xml->asXML());
if(!fclose($fp)) {
echo "No se ha podido cerrar el fichero";
// enviamos un mensaje de exito
}else{
echo $notID;
}
}
}else{
// si el formulario envia algun campo vacio
// enviamos un mensaje de error
echo "Debe llenar todos los campos del formulario";
}
?>

Cliente


<html>
<head>
<title>Gestor de Noticias Hermes 0.5</title>
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script type="text/javascript">
var identificador = "";
$('#escribir').live("click", function(){
var datos = $("#noticia").serialize();
$.ajax({
type: "POST",
url: "escribirNoticia.php",
data: datos,
success: function(msg){
$("#editor").load("addNoticia.php?id="+msg);
$("#previsor").load("leerNoticia.php?id="+msg);
identificador = "id="+msg;
},
error: function(msg){
$("#editor").html("<h2>Error: </h2>"+msg);
}
});
return false;
});

$('#borrar').live("click", function(){
var datos = $("#noticia").serialize();
$.ajax({
type: "POST",
url: "borrarNoticia.php",
data: datos,
success: function(msg) {
$('#editor').html('<p>Los datos de la noticia '+msg+' fueron borrados</p>');
},
error: function(objeto, quepaso, otroobj){
alert("ERROR!! Mecachis... Esto es lo que ha pasado: "+quepaso);
}
});
return false;
});

$('#modificar').live("click", function(){
var datos = $("#noticia").serialize();
$.ajax({
type: "GET",
url: "addNoticia.php",
data: datos,
success: function(msg) {
$('#editor').html(msg);
$("#previsor").load("leerNoticia.php?"+datos);
identificador = datos;
},
error: function(objeto, quepaso, otroobj){
alert("ERROR!! Mecachis... Esto es lo que ha pasado: "+quepaso);
}
});
return false;
});
</script>
<style type="text/css">
body{background: #000033 none repeat scroll 0 0;}
h1{display:block; background:#FF9900; font-size: 20px; font-family: Georgia, "Times New Roman", Times, serif; font-weight: bold;}
h4{font-style: italic;}
p{text-align:justify}
.noticia{border-bottom: 1px dotted #666666;}
#head {display:block; text-align:center; width:100%; height:10%;position:absolute;top:0px;}
#editor {display:block; background:LemonChiffon; width:50%; height:90%; position:absolute;top:10%; left:0; overflow:auto;}
#previsor {display:block; background:red; width:50%; height:90%; position:absolute; top:10%; left:50%; padding-left:10px; overflow;auto;}
#menu {list-style:none; margin:0; padding:0;}
#menu li {margin:2px; padding:2px; border:1px solid #CCCCCC; float:left;}
#menu li a {display:block; width:100px;padding:4px 0;text-decoration:none;text-align:center;font-size:11px;color:#FFFFFF;background-color:#000033; cursor:pointer;}
#menu li a:hover {color:#000000;background-color:#FF9900;}
</style>
</head>

<body>
<div id="head">
<ul id="menu">
<li><a onClick="$('#editor').load('delNoticia.php?accion=Modificar');">Editar una noticia</a></li>
<li><a onClick="$('#editor').load('delNoticia.php?accion=Borrar');">Borrar una noticia</a></li>
<li><a onClick="$('#editor').load('addNoticia.php'); $('#previsor').empty();identificador='';">A&ntilde;adir una noticia</a></li>
<li><a onClick="$('#previsor').load('leerNoticia.php?'+identificador);">Recargar Noticias</a></li>
</ul>
</div>
<div id="editor"></div>
<div id="previsor">
</div>
</body>
</html>

jueves, 28 de mayo de 2009

Practica 6

Se trata de un gestor de noticias basado en una base de datos XML que podéis encontrar aquí:
http://pachus.animaadversa.es/Pract7/noticias.xml
Usando AJAX se ha configurado el entorno del gestor de noticias, con la posibilidad de añadir, modificar y borrar todas las noticias que se encuentran en ese momento en la base de datos. La aplicación dispone de un menú, un cuadro para editar,borrar y modificar, y un tercer cuadro para ir previsualizando sobre la marcha como van quedando las cosas.
http://pachus.animaadversa.es/Pract7/
Por último, si queremos leer las noticias, aunque no nos importe el estilo (puesto que va a ser llamado con AJAX desde cualquier aplicación externa), nos venimos a la página de leer noticias:
http://pachus.animaadversa.es/Pract7/leerNoticia.php

domingo, 10 de mayo de 2009

Bloque T2.12 Ejercicio 1

Bueno, por fin logré terminar la parte de Xpath. El código es este::
#!/usr/bin/ruby

require 'rexml/document'
include REXML

documento = ARGV[0]
habitacion = ARGV[1]

file = File.new(documento)
doc = Document.new(file)
XPath.each(doc,"//habitacion[puerta[@a='#{habitacion}']]") { |habit|
puts "*"+habit.attributes['id']
}




Y el archivo de XML que hemos utilizado es este:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE micasa PUBLIC "MI CASA" "micasa.dtd">
<micasa>
<habitacion id="cuarto de baño">
<mueble>aparador</mueble>
<mueble>bañera</mueble>
<puerta a='pasillo' />
</habitacion>
<habitacion id="pasillo">
<mueble>cuadro</mueble>
<puerta a='cuarto de baño' />
<puerta a='dormitorio' />
<puerta a='recibidor' />
</habitacion>
<habitacion id="recibidor">
<mueble>espejo</mueble>
<puerta a="pasillo" />
</habitacion>
</micasa>




Y he logrado que muestre todas las habitaciones uqe tienen una puerta al destino que se le pase como parámetro, de la forma:
./xpath.rb pasillo

que devolverá:
  • *cuarto de baño
  • *recibidor

Bloque T2.10

Bueno, este bloque es hacer un filtro SAX que tradujera el sistema de etiquetas que teníamos para el archivo jugadores.xml al inglés en ruby. Para eso hemos definido un diccionario, y cada vez que se encuentra una etiqueta ya definida en español, la cambia por una etiqueta en inglés.

#!/usr/bin/ruby
require 'rexml/document'
require 'rexml/streamlistener'
include REXML

#Para usar con jugadores.xml

entrada=ARGV[0]

diccionario = {"entrenador"=>"coach",
"lista_jugadores"=>"players_list",
"jugador" => "player",
"equipo"=>"team" }

class Traduce
include StreamListener
def initialize(dic)
@escribe = false
@diccionario = dic
end

def tag_start(name, attributes)
puts "<"+@diccionario[name]+">"
@escribe = true
end

def tag_end(name)
puts "</"+@diccionario[name]+">"
@escribe=false
end

def text(texto)
if @escribe
if @diccionario[texto]
puts @diccionario[texto]
else
puts texto
end
end
end
end

print "Content-Type: application/xhtml+xml\n\n"

listener = Traduce.new(diccionario)
parser = Parsers::StreamParser.new(File.new(entrada), listener)
parser.parse

Bloque T2.9 Ejercicio 1 - Practica 5

Pues como cuando empezamos a hacer este ejercicio en clase estabamos también pendientes de la práctica 5, decidí matar dos pájaros de un tiro, así que en la práctica 5 los parámetros se pasan por la interfaz REST (el parámetro l -de longitud a mostrar- y el parámetro ind -indice- del RSS que queremos leer).

#!/usr/bin/perl

use CGI qw(:standard);
use XML::RSS;
use LWP::Simple qw(get);
use HTTP::Date;

#Definimos las URLs a las que vamos a aacceder.
my @urls=("", "http://www.animaadversa.es/rssfeed.xml", "http://feeds.feedburner.com/NoPuedoCreerQueLoHayanInventado", "http://ponlelaquesea.wordpress.com/feed/", "http://noticiasaudio.com/feed/", "http://feeds.feedburner.com/hispasonic");
#Chanchullo para poder acceder desde el indice 1.

#====== CREAR EL ARCHIVO CON LOS ITEMS RSS ORDENADOS =======
#Extraemos el parámetro de la URL.
my $mostrar = param('ind');
my $maximo = 5;
if(!$mostrar){
$mostrar = 1;
}else{
$maximo = $mostrar;
}

#Creamos un array con todos los items, que luego ordenaremos.
my $i=0;
my @arrayitem=([],[],[],[],[]);
for($indice=$mostrar; $indice<=$maximo; $indice++){
my $rdf = get($urls[$indice]);
my $rss = new XML::RSS;
$rss->parse($rdf);
$nombre= $rss->{'channel'}->{'title'};
$enlace= $rss->{'channel'}->{'link'};
foreach my $item ( @{ $rss->{items} } ){
$arrayitem[$i][0] = $$item{title};
$arrayitem[$i][1] = $$item{description};
$arrayitem[$i][2] = $$item{link};
$arrayitem[$i][3] = str2time($$item{pubDate});
$arrayitem[$i][4] = "<a href='$enlace'>$nombre</a>";
$i++;
}
}

#Y lo ordenamos por fecha.
@arrayitem = sort { $a->[3] cmp $b->[3] } @arrayitem;

#====== MOSTRAR LOS CANALES RSS ===========
#Creamos el archivo con todos los items que encontremos.
print header( -type => 'text/html' );
print "<html><head><title>Lector de RSS</title></head><body>";
#Damos formato a los nombres, fechas y demás y lo mostramos de más reciente a más lejano
#Extraemos el parámetro de longitud
my $longitud = param('l');
if(!$longitud){
$longitud=@arrayitem-1;
}
for ($i=@arrayitem-1; $i>=@arrayitem-$longitud; $i--){
print "<div class='noticia'><h2>".$arrayitem[$i][0]."</h2><h5>visto en ".$arrayitem[$i][4]."</h5><p>".$arrayitem[$i][1]."</p><h4>".time2str($arrayitem[$i][3])."</h4><p><a href='".$arrayitem[$i][2]."'>Ver mas</a></p></div>\n";
}

#Y aquí se debería mostrar
print "</body></html>";

Bloque T2.7 Ejercicio 2

Bueno, este ejercicio va de buscar alguna librería de algún lenguaje de programación que sirva para leer feeds de Atom y mostrarlos (básicamente, como nuestras queridas librerías XML::RSS de perl y demás, pero aplicandose a Atom).

Siguiendo con mi monotema de fin de semana, vuelvo a mis orígenes PHPeros, y me pongo a buscar alguna libreŕia que sirva para trabajar con Atom en este lenguaje. Decir que buscar "Atom + PHP" en google arroja un mogollón de resultados, así que me voy a centrar en un par de ellas y yasta.

La primera que me ha hecho gracia ha sido SimplePie, que permite leer Atom y RSS. En su página dicen que es bastante sencilla de usar, y apuestan por la rapidez, ya que es capaz de cachear contenidos en el servidor, lo que lo hace más fácil de usar. Soporta RSS 0.91, RSS 1.0, RSS 2.0, Atom 0.3 y Atom 1.0 (amen de otras cuantas cosas que no se ni que son).

Otra que me encuentro en un ejemplo desde Google es Zend. En este caso hablamos ya de un Framework de PHP, una API en toda regla, como mi querido jQuery, pero aplicado a PHP. El conjunto de funcionalidades de sus librerías es bastante amplio y va desde lo que nos trajo aquí (lector RSS), hasta un completo visor de modelo para ir controlando nuestra aplicación en PHP desde un alto nivel.

Por último, otro framework bastante específico, el atom-php-framework, que nos permite desarrollar gdata al estilo que queramos, como servidores REST basados en HTTP y XML-Atom.

sábado, 9 de mayo de 2009

Bloque T2.5 Ejercicio 2

Bueno, ya que me he puesto, voy a recuperar mis parcos conocimientos (aplicados a anima adversa, como siempre) de PHP, pues vamos a hacer lo mismo que en el Bloque T2.5 Ejercicio 1, pero en PHP, para que veamos lo polivalentes que somos. El código que he hecho al final es:

<?php
$url = "xml/muebles.xml";
$rawxml = file_get_contents($url); // guardamos el XML como string
$xml = simplexml_load_string($rawxml); // cargamos el objeto
echo "<ul>";
foreach($xml->habitacion as $h)
{
$tmpid = $h->attributes();
$id = $tmpid['id'];
echo "<li>".$id."</li>";
}
echo "</ul>";
?>


El ejemplo lo podéis encontrar aquí. Y la fuente de Xml que he usado es muebles.xml.

Bloque T2.3

Bueno, aquí había que asignar varios espacios de nombres. Siguiendo con la cosa de mi equipo filosófico ateniense (aunque con jugadores de otras ciudades estado), cree dos espacios de nombres, el de equipo (que se refiere a las posiciones gubernamentales dentro de la estructura jerárquica del equipo -toma ya-), y otro para la plantilla, los jugadores, que son los que se dejan los cuernos cada cuatro años en los juegos en honor a Apolo, en Olimpia. Y este es el resultado:
<eq:equipo xmlns:eq='http://www.lfp.com/equipo' id="Atenas C.F" xmlns:plan='http://www.lfp.com/plantilla'>
<eq:entrenador>Pericles</eq:entrenador>
<eq:presidente>Leonidas</eq:presidente>
<eq:plantilla_titular>
<plan:jugador posicion="portero">Socrates</eq:jugador>
<plan:jugador posicion="defensa">Empedocles</eq:jugador>
<plan:jugador posicion="centro">Aristofanes</eq:jugador>
<plan:jugador posicion="mediapunta">Aristoteles</eq:jugador>
<plan:jugador posicion="delantero">Platon</eq:jugador>
</eq:plantilla_titular>
<eq:plantilla_suplente>
<plan:jugador posicion="defensa">Diogenes</eq:jugador>
<plan:jugador posicion="delantero">Pitagoras</eq:jugador>
</eq:plantilla_suplente>
</eq:equipo>

Bloque T2.1

Bueno, se está acabando ya el cuatrimestre, así que estoy echando la vista atrás y viendo que ejercicios me faltan por hacer, por aquello de tener todo completo, caray. Empiezo por el tema 2, ya que el tema 1 me da hasta verguenza ponerme a hacer algo de ahí.

Ejercicio 1
El motivo de este ejercicio es buscar un editor XML especializado o un editor que tenga posibilidad de editar XML. En principio, probé con Quanta, el editor de código html en linux por excelencia (aunque ya como que le deja de gustar a uno). Finalmente, decidí que Quanta sigue sin convencerme en el área de HTML, por lo que lo desinstalé y a por otra, mariposa.
Despues de descubrír a un troll en un blog que pedía encarecíamente que se pudiera instalar Dreamweaver, y por una referencia extraña, por una vez descubrí que un troll podría servir para algo: citar de pasada para criticar al editor Bluefish. Por una vez he encontrado un editor que me guste en Linux, y por supuesto, también soporta XML, como debe ser. Tiene un entorno apañao, y una barra que se llama "personalizable", donde te va poniendo las cosas que mas usas (no veas, cacho de avance). Sigo con él desde que lo descubrí (hace ya algunos meses) y la verdad, me parece una opción más que aceptable, si bien le sigue faltando la opción de "vista previa" o de "edición gráfica". Ahora, que a estas alturas del "conocimiento", como que me la trae un poquillo... floja.
Finalmente, decir que gedit, el editor de gnome, también tiene soporte para resaltar el código en XML, pero sin más, no abre ni cierra etiquetas ni nada de eso. Cosas de ser un editor de texto plano.

Ejercicio 2
Este ejercicio era simplemente visualizar un archivo XML en el navegador, pero... ¡Ah! ¡Se veía bonito y todo! ¿Cómo puede ser eso? Normalmente, abrimos con firefox algún archivo xml y se ve normalito, con las etiquetas resaltadas y poco más. Pero el misterio (no tan insondable) era que este archivo se veía bien. Pistas... es de un blog, el blog de JJ...

¡Claro! ¡Ahí está la respuesta! Se trata de un feed RSS (creo, a lo mejor es Atom, pero cualquiera se pone a buscar). Total, que nuestro amigo Firefox nos engaña y tiene una plantilla exclusiva para mostrarnos de forma bonita los feed RSS (donde nos da también la opción de suscribirnos mediante la opción tan graciosa de "marcadores dinámicos", curioso cuando menos.. aunque donde esté un lector tradicional). Indagando encontré que Firefox llama a estos archivitos:
@import chrome://global/locale/intl.css";
@import "chrome://global/skin/formatting.css";
Donde se encuentran todas las directrices para mostrar un feed de RSS. Bonito, ¿no?