modele=$modele;
$structure=json_decode(json_encode((array)simplexml_load_file($modele)),1);
// nettoyage de l'attribut du tag de base après récupération du type
$this->type=$structure['@attributes']['type'];
// la cle de tri est l'attribut de cle, sinon le premier tag de type texte
$this->cle=$structure['@attributes']['cle'];
// dupliquer la structure dans le contenu
$this->contenu=$structure;
unset($this->contenu['@attributes']);
foreach($this->contenu as $cle => $valeur){
if(empty($this->cle) && $valeur['@attributes']['type']=="text"){
$this->cle =$cle;
}
$this->contenu[$cle]['contenu']="";
}
$this->hydrate=false;
$this->messages=array();
//print_r($this->contenu);
}
// fonction de lecture d'un xml
// reçoit le nom, et va récupérer
// le xml grace à la constante d'adresse du dossier
// dans le fichier de configuration
public function lire_xml($fichier){
$this->fichier=$fichier;
$this->fichier_seul=fichier_seul($fichier);
$tempcontenu=json_decode(json_encode((array)simplexml_load_file($fichier,'SimpleXMLElement', LIBXML_NOCDATA)),1);
unset($tempcontenu['@attributes']);
// transformation éventuelle de l'array pour complaire à la structure
// hydrater la structure par le contenu
foreach($this->contenu as $cle => $valeur){
if(isset($tempcontenu[$cle])){
$this->contenu[$cle]['contenu']=$tempcontenu[$cle];
// supprimer cette clé du contenu
// pour pouvoir dans un deuxième temps
// ajouter les contenus éventuellement ajoutés librement
// sans référence dans la définition du xml
unset($tempcontenu[$cle]);
} else {
$this->contenu[$cle]['contenu']="";
}
}
// ajouter les champs trouvé hors définition dans le contenu
// par exemple contenu du truc
foreach($tempcontenu as $cle => $valeur){
$this->contenu[$cle]['@attributes']['type']='unknow';
$this->contenu[$cle]['@attributes']['titre']=$cle;
if(is_array($tempcontenu[$cle])){
foreach($tempcontenu[$cle] as $ar_item){
$this->contenu[$cle]['contenu'][]=$ar_item;
}
} else {
$this->contenu[$cle]['contenu']=$tempcontenu[$cle];
}
}
$this->hydrate=true;
}
//sur base de la structure de $contenu, écrit le formulaire
public function ecrit_xml(){
$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->encoding = "UTF-8";
$item = $doc->createElement('item');
$item->setAttribute('type', $this->type);
foreach($this->contenu as $tag => $contenu){
// print_r($contenu);
if(is_array($contenu['contenu'])){
// type "multiple", prendre chaque item pour le rentrer
foreach($contenu['contenu'] as $e){
$elem = $doc->createElement( $tag );
$ct = $elem->ownerDocument->createCDATASection($e);
$elem->appendChild($ct);
$item->appendChild( $elem );
}
} else {
// contenu unique, créer un noeud
if($contenu['contenu']!=""){
$elem = $doc->createElement( $tag );
$ct = $elem->ownerDocument->createCDATASection($contenu['contenu']);
$elem->appendChild($ct);
$item->appendChild( $elem );
}
}
}
$doc->appendChild( $item );
fix_exists_dir(CHEMIN.DOSSIER_XML);
$r=$doc->save($this->fichier);
if($r==true){
$this->messages[]="enregistrement réussi de ".$this->fichier;
} else {
$this->messages[]="échec de l'enregistrement de ".$this->fichier;
}
}
// renvoie tout le contenu dans un array
public function get_contenu(){
return $this->contenu;
}
// renvoie tout le contenu dans un array
public function get_contenu_simple(){
$retour=array();
foreach ($this->contenu as $champ => $contenu){
if (!$this->is_tag_empty($champ)){
$retour[$champ]=$this->get($champ);
}
}
return $retour;
}
// renvoie le contenu dans un array, moins une exclude list
public function get_partial_contenu($exclus=array()){
$base_contenu =$this->contenu;
if(is_array($exclus)){
foreach($exclus as $tag){
unset($base_contenu[$tag]);
}
} else {
unset($base_contenu[$exclus]);
}
return $base_contenu;
}
public function get_liste_pour_attribut($attribut,$valeur,$exclude){
$retour=array();
foreach($this->contenu as $tag => $contenu){
//print_r($contenu['@attributes']);
if(isset($contenu['@attributes'][$attribut]) && !in_array($tag,$exclude)){
if($contenu['@attributes'][$attribut]==$valeur){
$retour[]=$tag;
}
}
}
return $retour;
}
// renvoir le contenu total d'un tag
public function get_contenu_tag($tag){
//$retour=$this->contenu[$tag]["@attributes"];
$this->contenu[$tag];
//return $retour;
}
public function get_tag_attribute($tag,$attribute,$defaut=""){
//print_r($this->contenu[$tag]['@attributes']);
if(isset($this->contenu[$tag]['@attributes'][$attribute])){
return $this->contenu[$tag]['@attributes'][$attribute];
//echo "il y a attribut";
} else {
return $defaut;
}
//return $retour;
}
// renvoie le contenu d'un tag
// avec filtrage éventuel
public function get($tag, $defaut="", $filtrage=false){
$retour="";
if(isset($this->contenu[$tag])){
// attention un tag peut être présent mais vide
// dans ce cas il se présente en array
if(!is_array($this->contenu[$tag]['contenu'])){
$retour=$this->contenu[$tag]['contenu'];
} else {
if(count($this->contenu[$tag]['contenu'])){
$retour = $this->contenu[$tag]['contenu'];
}
}
}
if($retour==""){ return $defaut; } else {
// voir si le filtrage s'applique
// si on est face à un array, appliquer le filtre sur chaque élément
return $retour;
}
}
// renvoie le contenu du tag en un array
public function get_tag_array($tag){
$contenu=$this->contenu[$tag]['contenu'];
if(is_array($contenu)){
if(trim(implode("",$contenu))==""){
return array();
} else {
return $contenu;
}
} else {
if(trim($contenu)==""){
return array();
} else {
return array( $contenu );
}
}
return false;
}
// renvoie le nombre d'éléments contenus
public function get_tag_nb($tag){
if(!isset($this->contenu[$tag]) || !isset($this->contenu[$tag]['contenu'])){
return 0;
}
if(is_string($this->contenu[$tag]['contenu'])){
return 1;
}
return count($this->contenu[$tag]['contenu']);
}
public function set($tag, $contenu){
if(isset($this->contenu[$tag])){
$this->contenu[$tag]['contenu']=$contenu;
}
}
// afficher le tag de maniere standard
// avec un label, les contenus et le filtrage spécifié
public function display_tag($tag,$class_replace="",$filter_replace=""){
if($this->is_tag_empty($tag)){ return ""; }
// okay, quelque chose à afficher
// label si le contenu n'est pas de type texte
$retour="
";
// affichage de chaque item
foreach($contenu as $pc){
switch($type){
case "image":
$retour.= "
";
break;
case "file":
$ext = strtolower(pathinfo($pc, PATHINFO_EXTENSION));
switch($ext){
case "mp4":
case "ogg":
case "webm":
$retour.="";
break;
case "mp3":
case "ogg":
$retour.="";
break;
default:
$retour.="