je recommence un nouveau post car celui sur le salon php et celui sur ce salon ne m'ont pas amener au bout de mes esperance(malgres des reponces pertinantes)
De plus le fait de detaché un sujet sur le salon php a peut etre contribuer a embrouiller la chose
mon but est de realiser une classe rss avec laquelle on peut construire facilement des fil rss 0.91 et 2 ansi que atom1.0, la construction est basé sur le systeme de template SMARTY
et je voudrai etablir une verifictaion simple sur les elments obligatoires de ces flux(c'est a dire la presence des balise et le fait quelle ne soit pas vide)
voici l'etat actuelle du projet
une classe abstraite
<?php
abstract class abstractrss
{
/**
* converti un tableau en données exploitable pour le template
*
* @param string $name
*
* @param string $value
*/
private function ArrayTitleLinkDesc($name,$value)
{
$arr='';
foreach($value as $key=>$val)
{
$arr[$key]=htmlspecialchars($val);
}
$this->return[$name][]=$arr;
}
private function verifelements()
{
try
{
foreach ($this->obli as $key=>$value)
{
/*if(is_array($value))
{
if(array_key_exists($key,$this->return))
//$this->verifelements($value);
{
//$essai=array_values($key);
echo $essai;
echo 'cle :'.$key.' valeur :'.print_r($value)."<br/>";
foreach ($value as $cle=>$val)
{
echo 'cle-1 '.$cle.' valeur-1'.$val.'<br/>';
foreach ($this->return[$key] as $clef=>$val1 )
{
echo '<strong>clef:'.$clef.'- valeur'.print_r($val1).'</strong><br/>';
echo $this->return[$key][$clef];
}
//echo 'variable return'.print_r($this->return[$key][$cle]).'<br/>';
//if(empty($this->return[$value]))
//$tab[$value][$cle]['statut']='vide';
}
}
else
$tab[$key]='manque';
}
else
{*/
if(array_key_exists($value,$this->return))
{
if(empty($this->return[$value]))
$tab[$value]['statut']='vide';//throw new MyException('la valeur est vide'.$this->return[$value]);
}
else
{
//echo 'else'.$value;
$tab[$value]='manque';//throw new MyException('il manque le champs '.$value);
}
}
}
catch(MyException $e)
{
$e->exceptionlog();
}
return $tab;
}
public function __set($name,$value)
{
try
{
if(is_string($value))
$this->return[$name]=htmlspecialchars($value);
elseif(is_numeric($value))
$this->valeurs[$name]=$value;
elseif(is_array($value))
{
$this->ArrayTitleLinkDesc($name,$value);
}
elseif(is_bool($value))
$this->valeurs[$name]=$value;
else
throw new MyException('type non attendu');
}
catch (MyException $e)
{
$e->exceptionlog();
}
}
public function __get($name)
{
return $this->valeurs[$name];
}
public function send()
{
header("Content-Type: application/xml");
header("Content-Transfer-Encoding: binary");
header("Expires: 0");
}
/**
* methode de creation du fichier xml
*
*/
public function createrss2()
{
print_r($this->verifelements($this->obli));
//print_r($this->return);
$path='/../Smarty/libs/Smarty.class.php';
require_once(dirname(__FILE__).$path);
include 'E:/wamp/www/projet_ing/configSmarty.php';
$Smarty = new Smarty_page();
$Smarty->assign($this->return);
$this->content=$Smarty->fetch($this->tpl);
assert(is_string($this->content));
$xml=new DOMDocument();
try
{
if(strtolower($this->encoding)==='utf')
$this->content=utf8_encode($this->content);
if(!$xml->loadXML($this->content))
throw new DomException('impossible de charger le fichier :'.$this->content);
else
{
if(!$xml->validate())
throw new DomException('document non valide'.$this->content);
else
{
if(!$xml->save($this->file))
throw new DomException('Erreur pendant l\'ecriture du fichier:'.$this->file);
}
}
}
catch (DomException $e)
{
echo $e->getMessage().'<br/>';
echo $e->getCode().'<br/>';
}
}
/**
* ajoute un item et son contenu
*
*/
public function __call($nom,$valeur)
{
switch($nom)
{
case 'add':
$xml = new DomDocument();
$xml->load($this->file);
$xml->documentElement;
foreach ($xml->childNodes as $node)
{
if($node->nodeName==="item")
{
$nd=$node->appendSibling('item');
break;
}
}
$nb=sizeof($arr);
for($i=0;$i<=$nb;$i++)
{
foreach ($arr as $key=>$val)
{
$key=$nd->appendChidl('key');
$key->nodeValue=$val;
}
}
break;
case 'del':break;
default:
echo 'methode '.$nom.' non connue';
break;
}
}
public function add_item($arr)
{
$xml = new DomDocument();
$xml->load($this->file);
$xml->documentElement;
foreach ($xml->childNodes as $node)
{
if($node->nodeName==="item")
{
$nd=$node->appendSibling('item');
break;
}
}
$nb=sizeof($arr);
for($i=0;$i<=$nb;$i++)
{
foreach ($arr as $key=>$val)
{
$key=$nd->appendChidl('key');
$key->nodeValue=$val;
}
}
/*
$link=$nd->appendChild('link');
$link->nodeValue=$this->return['item'][0]['link'];
$desc=$nd->appendChild('description');
$desc->nodeValue=$this->return['item'][0]['descption'];*/
}
/**
* delete un item
*
*/
public function delete_item($arr)
{
$xml = new DomDocument();
$xml->load($this->file);
$xml->documentElement;
foreach ($xml->childNodes as $node)
{
if($nb=$node->nodeName==="item")
{
$nd->nodeValue=$this->return['item'];
break;
}
}
}
}
?>
la methode de verification est en court de developpement et pour cause je n'arrive pas a la faire(je n'arrive pas a comparer les deux tableau $this->return et $this->oblije voudrai inclure egalement des methode de manipulation comme ajouter un item ou en supprimer un
la classe rss2
<?php
class rss2_ab extends abstractrss
{
/**
* valeurs retourner a samrty pour la cnstruction du template
*
* @protected array
*/
protected $return;
/**
* valeurs recuperer par la methode set
*
* @protected array
*/
protected $valeurs;
/**
* nom du fichier a sauver
*
* @protected string
*/
protected $file;
/**
* template utiliser pour generer le document
*
* @protected string
*/
protected $tpl;
/**
* chaine recuperer a partir de smarty
*
* @protected string
*/
protected $content;
/**
* tableau defininissant les variables a tester
*
* @var unknown_type
*/
protected $obli;
/**
* constructeur de classe
*
*/
public function __construct()
{
$this->valeurs=array();
$this->obli=array('channel'=>array('title', 'link', 'description'), 'item'=>array('title', 'link', 'description'), 'image'=>array('title', 'link', 'description'), 'version', 'encoding', 'description');
$this->return=array();
$this->file='RSS/actu.xml';
$this->tpl='rss/actu_rss2.tpl';
}
}
?>
le template
Code : Tout sélectionner
<?xml version="1.0" encoding="{$encoding}" ?>
{if !empty($xslt)}
<?xml-stylesheet href="{$xslt}" type="text/xsl"?>
{/if}
<rss version="{$version}">
<channel>
<title>{$channel.title}</title>
<link>{$channel.link}</link>
<description>{$channel.description.0}</description>
<language>{$lang}</language>
{if !empty($copyright)}
<copyright>{$copyright}</copyright>
{/if}
{if !empty($lastBuildDate)}
<lastBuildDate>{$lastBuildDate}</lastBuildDate>
{/if}
{if !empty($creator)}
<generator>{$creator}</generator>
{/if}
{foreach from=$item item=item key=key name=item1}
<item>
<title>{$item.title}</title>
<link>{$item.link}</link>
<description>{$item.description}</description>
{if !empty($image_item)}
<image>
<url>$item.image_item.url</url>
<title>$item.image_item.title</title>
<link>$item.image_item.link</link>
<width>$item.image_item.width</width>
<height>$item.image_item.height</height>
</image>
{/if}
</item>
{/foreach}
</channel>
</rss>
et l'utilisation de l'usine a gaz
$mysql=new Mysqldb(SERVEUR,LOGIN,PASS,BASE);
$dao=new DAO($mysql);
$rss=new rss2_ab();
//$rss->send();
$champs=array('date', 'description', 'titre', 'id_a');
$table=array('actu');
$dao->SetVar($table,$champs);
foreach($dao->Select('','Limit 0,4') as $cle=>$tab)
{
$rss->item=array('title'=>$tab[2], 'description'=>$tab[1], 'link'=>'http://localhost/projet_ing/index.php?module=actu&action=display&id='.$tab[3]);
}
//$rss->Channel=array('title'=>'essai','description'=>'premier test', 'link'=>'http://localhost/projet_ing/', 'date'=>date("d/m/Y-H:i:s"));
$rss->encoding='utf-8';
$rss->lang='fr';
//$rss->lastBuildDate=date('d M Y H:i');
$rss->createrss2();
//$rss->send();
//echo $rss->content;
?>
donc j'aimerai avoir vos remarque ainsi qu'un petit coup de pouce pour finir cette classe(cat moi je vais avoir de moins en moins de temps a lui consacrer)voila
merci