/** * Analyser un arbre xml et extraire les infos concernant les boutons et onglets * * @param <type> $arbre * @return <type> */ function plugins_extraire_boutons_dist($arbre) { $ret = array('bouton' => array(), 'onglet' => array()); // recuperer les boutons et onglets si necessaire spip_xml_match_nodes(",^(bouton|onglet)\\s,", $arbre, $les_boutons); if (is_array($les_boutons) && count($les_boutons)) { $ret['bouton'] = array(); $ret['onglet'] = array(); foreach ($les_boutons as $bouton => $val) { $bouton = spip_xml_decompose_tag($bouton); $type = reset($bouton); $bouton = end($bouton); if (isset($bouton['id'])) { $id = $bouton['id']; $val = reset($val); if (is_array($val)) { $ret[$type][$id]['parent'] = isset($bouton['parent']) ? $bouton['parent'] : ''; $ret[$type][$id]['position'] = isset($bouton['position']) ? $bouton['position'] : ''; $ret[$type][$id]['titre'] = isset($val['titre']) ? trim(spip_xml_aplatit($val['titre'])) : ''; $ret[$type][$id]['icone'] = isset($val['icone']) ? trim(end($val['icone'])) : ''; $ret[$type][$id]['action'] = isset($val['url']) ? trim(end($val['url'])) : ''; $ret[$type][$id]['parametres'] = isset($val['args']) ? trim(end($val['args'])) : ''; } } } } return $ret; }
/** * Charger les informations contenues dans le xml d'une composition * * @param string $nom * @param string $info * @return array|string */ function compositions_charger_infos($nom,$info=""){ // on peut appeller avec le nom du squelette $nom = preg_replace(',[.]html$,i','',$nom).".xml"; include_spip('inc/xml'); $composition = array(); if ($xml = spip_xml_load($nom,false)){ if (count($xml['composition'])){ $xml = reset($xml['composition']); $composition['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom'])); $composition['description'] = isset($xml['description'])?_T_ou_typo(spip_xml_aplatit($xml['description'])):''; if (isset($xml['icon'])) { $icon = chemin_image(reset($xml['icon'])); if (!$icon) { $icon = find_in_path(reset($xml['icon'])); } } else { $icon = ''; } $composition['image_exemple'] = isset($xml['image_exemple']) ? find_in_path(reset($xml['image_exemple'])) : ''; $composition['icon'] = $icon; $composition['class'] = isset($xml['class']) ? trim(reset($xml['class'])) : ''; $composition['configuration'] = isset($xml['configuration']) ? spip_xml_aplatit($xml['configuration']) : ''; $composition['branche'] = array(); if (spip_xml_match_nodes(',^branche,', $xml, $branches)){ foreach (array_keys($branches) as $branche){ list($balise, $attributs) = spip_xml_decompose_tag($branche); $composition['branche'][$attributs['type']] = $attributs['composition']; } } } } if (!$info) return $composition; else return isset($composition[$info])?$composition[$info]:""; }
function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { include_spip('inc/xml'); $arbre = spip_xml_parse($desc); $verifie_conformite = charger_fonction('verifie_conformite', 'plugins'); $verifie_conformite($plug, $arbre, $dir_plugins); include_spip('inc/charsets'); // On renvoie la DTD utilisee $ret['dtd'] = "plugin"; if (isset($arbre['categorie'])) { $ret['categorie'] = trim(spip_xml_aplatit($arbre['categorie'])); } if (isset($arbre['nom'])) { $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom'])); } if (isset($arbre['icon'])) { $ret['logo'] = trim(spip_xml_aplatit($arbre['icon'])); } if (isset($arbre['auteur'])) { $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur'])); } // garder le 1er niveau en tableau mais traiter le multi possible if (isset($arbre['licence'])) { $ret['licence'][] = trim(spip_xml_aplatit($arbre['licence'])); } if (isset($arbre['version'])) { $ret['version'] = trim(spip_xml_aplatit($arbre['version'])); } if (isset($arbre['version_base'])) { $ret['schema'] = trim(spip_xml_aplatit($arbre['version_base'])); } if (isset($arbre['etat'])) { $ret['etat'] = trim(spip_xml_aplatit($arbre['etat'])); } $ret['description'] = $ret['slogan'] = ""; if (isset($arbre['slogan'])) { $ret['slogan'] = trim(spip_xml_aplatit($arbre['slogan'])); } if (isset($arbre['description'])) { $ret['description'] = trim(spip_xml_aplatit($arbre['description'])); } if (isset($arbre['lien'])) { $ret['documentation'] = trim(join(' ', $arbre['lien'])); if ($ret['documentation']) { // le lien de doc doit etre une url et c'est tout if (!preg_match(',^https?://,iS', $ret['documentation'])) { $ret['documentation'] = ""; } } } if (isset($arbre['options'])) { $ret['options'] = $arbre['options']; } if (isset($arbre['fonctions'])) { $ret['fonctions'] = $arbre['fonctions']; } if (isset($arbre['prefix'][0])) { $ret['prefix'] = trim(array_pop($arbre['prefix'])); } if (isset($arbre['install'])) { $ret['install'] = $arbre['install']; } if (isset($arbre['meta'])) { $ret['meta'] = trim(spip_xml_aplatit($arbre['meta'])); } $necessite = info_plugin_normalise_necessite($arbre['necessite']); $ret['compatibilite'] = isset($necessite['compatible']) ? $necessite['compatible'] : ''; $ret['necessite'] = $necessite['necessite']; $ret['lib'] = $necessite['lib']; $ret['utilise'] = info_plugin_normalise_utilise($arbre['utilise']); $ret['procure'] = info_plugin_normalise_procure($arbre['procure']); $ret['chemin'] = info_plugin_normalise_chemin($arbre['path']); if (isset($arbre['pipeline'])) { $ret['pipeline'] = $arbre['pipeline']; } $extraire_boutons = charger_fonction('extraire_boutons', 'plugins'); $les_boutons = $extraire_boutons($arbre); $ret['menu'] = $les_boutons['bouton']; $ret['onglet'] = $les_boutons['onglet']; $ret['traduire'] = $arbre['traduire']; if (isset($arbre['config'])) { $ret['config'] = spip_xml_aplatit($arbre['config']); } if (isset($arbre['noisette'])) { $ret['noisette'] = $arbre['noisette']; } if (isset($arbre['erreur'])) { $ret['erreur'] = $arbre['erreur']; if ($plug) { spip_log("infos_plugin {$plug} " . @join(' ', $arbre['erreur'])); } } return $ret; }
function spip_xml_aplatit($arbre, $separateur = " ") { $s = ""; if (is_array($arbre)) { foreach ($arbre as $tag => $feuille) { if (is_array($feuille)) { if ($tag !== intval($tag)) { $f = spip_xml_aplatit($feuille, $separateur); if (strlen($f)) { $tagf = explode(" ", $tag); $tagf = $tagf[0]; $s .= "<{$tag}>{$f}</{$tagf}>"; } else { $s .= "<{$tag} />"; } } else { $s .= spip_xml_aplatit($feuille); } $s .= $separateur; } else { $s .= "{$feuille}{$separateur}"; } } } return strlen($separateur) ? substr($s, 0, -strlen($separateur)) : $s; }
function spip_xml_aplatit($arbre,$separateur = " "){ $s = ""; if (is_array($arbre)) foreach($arbre as $tag=>$feuille){ if (is_array($feuille)){ if ($tag!==intval($tag)){ $f = spip_xml_aplatit($feuille, $separateur); if (strlen($f)) { $tagf = explode(" ",$tag); $tagf = $tagf[0]; $s.="<$tag>$f</$tagf>"; } else $s.="<$tag />"; } else $s.=spip_xml_aplatit($feuille); $s .= $separateur; } else $s.="$feuille$separateur"; } return strlen($separateur) ? substr($s, 0, -strlen($separateur)) : $s; }
/** * Aplatit plusieurs clés d'un arbre xml dans un tableau * * Effectue un trim() de la valeur trouvée dans l'arbre * * @param array $balises * Liste de noms de balises XML. * Peut aussi être un tableau indiquant un renommage d'une balise * au passage tel que 'x' => 'y' qui cherchera x dans l'arbre XML et * l'applatira dans y. * @param array $arbre_xml * Un arbre issu de spip_xml_parse() * @param string $mode * Mode d'affectation des valeurs trouvées * - 'vide_et_nonvide' : Affecte une chaine vide si la balise n'est * pas trouvée dans l'arbre et affecte la valeur de la balise sinon. * - 'nonvide' : Si la balise n'est pas trouvée dans l'arbre ou si son * contenu est vide, affecte la valeur du tableau initial concernant * cette balise si elle est connue. * @param array * Tableau initial pouvant contenir des valeurs par défaut à affecter * à chaque balise avec 'x' => 'valeur' */ function svp_aplatir_balises($balises, $arbre_xml, $mode = 'vide_et_nonvide', $tableau_initial = array()) { $tableau_aplati = array(); if (!$balises) { return $tableau_initial; } foreach ($balises as $_cle => $_valeur) { $tag = is_string($_cle) ? $_cle : $_valeur; $valeur_aplatie = ''; if (isset($arbre_xml[$tag])) { $valeur_aplatie = trim(spip_xml_aplatit($arbre_xml[$tag])); } if ($mode == 'vide_et_nonvide' or $mode == 'nonvide' and $valeur_aplatie) { $tableau_aplati[$_valeur] = $valeur_aplatie; } else { $tableau_aplati[$_valeur] = isset($tableau_initial[$_valeur]) ? $tableau_initial[$_valeur] : ''; } } return $tableau_aplati; }
function snippets_articles_importer($id_target,$arbre,$contexte){ include_spip('base/serial'); include_spip('base/abstract_sql'); include_spip('inc/snippets'); $table_prefix = $GLOBALS['table_prefix'] ; $champs_non_importables = array("id_article","id_rubrique","id_secteur","maj","export","visites","referers","popularite","id_trad","idx","id_version","url_propre"); $champs_non_ajoutables = array('titre','date','date_redac','lang'); $champs_jointures = array('auteur','mot'); $champs_defaut_values = array('statut'=>'lememe'); $table = 'spip_articles'; $primary = 'id_article'; $fields = $GLOBALS['tables_principales']['spip_articles']['field']; $tag_objets="articles"; $tag_objet="article"; $translations = array(); $forcer_id = false ; // mettre true pour garder les meme id que dans le XML $forcer_maj = false ; // mettre true pour mettre a jour un lot d'articles de meme titre que dans le spip cible if ($arbre && isset($arbre[$tag_objets])) foreach($arbre[$tag_objets] as $objets){ foreach($objets[$tag_objet] as $objet){ spip_log($objet['titre'],"snippets"); $creation = false; $auteur_connu = false ; // mettre a jour des articles deja en bdd avec le xml fournit if($forcer_maj){ $id_target = ''; $id_article_trouve = sql_fetsel("id_article","spip_articles","titre=".sql_quote($objet['titre'][0])); // ajouter la rub courrante $id_target = $id_article_trouve['id_article'] ; if(!intval($id_target)) spip_log($objet['titre'][0].$id_target,"snippets_titres_erreur"); } include_spip('action/editer_article'); // si c'est une creation, creer le formulaire avec les infos d'entete if (!($id_objet=intval($id_target))){ if (preg_match(",id_rubrique=([0-9]*),i",$contexte,$regs)) $id_rubrique=intval($regs[1]); $id_objet = insert_article($id_rubrique); // forcer l'id if($forcer_id){ $champs_non_importables = array("id_rubrique","id_secteur","maj","export","visites","referers","popularite","id_trad","idx","id_version","url_propre"); $sql = "UPDATE ".$table_prefix."_articles SET id_article = '".$objet['id_article'][0]."' WHERE id_article = '$id_objet'"; spip_query($sql); $id_objet = $objet['id_article'][0] ; } $creation = true; } // sinon on ajoute chaque champ, sauf le titre $row = spip_fetch_array(spip_query("SELECT * FROM $table WHERE $primary="._q($id_objet))); foreach (array_keys($row) as $key) if ( !in_array($key,$champs_non_importables) AND !in_array($key,$champs_jointures) AND ($creation OR !in_array($key,$champs_non_ajoutables) OR !$row[$key]) AND isset($objet[$key])){ $v=trim(spip_xml_aplatit($objet[$key])); $row[$key] = ($creation or $forcer_maj)?$v:($row[$key].$v); } revisions_articles($id_objet , $row); $translations[] = array($table,$objet[$primary],$id_objet); // gerer l'import de liens eventuels if ($id AND isset($objet['liens'])){ foreach($objet['liens'] as $liens){ // A FAIRE } } $id_article = $id_objet ; if ( $objet['auteur'] AND ($creation OR $forcer_maj)){ $auteur_connu = true ; sql_delete("spip_auteurs_articles","id_article=".sql_quote($id_article)); foreach($objet['auteur'] as $nom){ // ajouter l'auteur spip_log($nom,"snippets"); $id_auteur = get_id_auteur($nom); if ($id_auteur) { spip_log($nom.$id_auteur,"snippets"); $sql="INSERT INTO ".$table_prefix."_auteurs_articles (id_auteur, id_article) VALUES ($id_auteur, $id_article)"; spip_query($sql); } } } if($auteur_connu){ // se virer soi-meme $connect_id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ; $sql = "DELETE FROM ".$table_prefix."_auteurs_articles WHERE id_auteur = '$connect_id_auteur' AND id_article = '$id_article'"; spip_query($sql); } // statut de l'article if($champs_defaut_values['statut'] != 'prepa'){ $sql = "UPDATE ".$table_prefix."_articles SET statut = '".$objet['statut'][0]."' WHERE id_article = '$id_article'"; spip_query($sql); } if ( $objet['mot'] AND ($creation OR $forcer_maj)){ sql_delete("spip_mots_articles","id_article=".sql_quote($id_article)); foreach($objet['mot'] as $mot){ spip_log($mot,"snippets"); // ajouter le mot cle $id_article = $id_objet ; $table_prefix = $GLOBALS['table_prefix'] ; $id_mot = get_id_mot($mot); if ($id_mot) { $sql="INSERT INTO ".$table_prefix."_mots_articles (id_mot, id_article) VALUES ($id_mot, $id_article)"; spip_query($sql); } } } if ( $objet['document'] AND ($creation OR $forcer_maj)){ sql_delete("spip_documents_liens","id_objet=".sql_quote($id_article)." and objet='article'"); foreach($objet['document'] as $doc){ spip_log("--> ".$doc,"snippets"); // ajouter le doc list($id,$fichier,$extension,$titre,$descriptif) = explode('|',$doc) ; spip_log("--- $id,$fichier,$extension,$titre","snippets"); spip_log("hop ".$fichier,"snippets"); $table_prefix = $GLOBALS['table_prefix'] ; $id_doc = get_id_doc($fichier); if ($id_doc) { spip_log("hop doc".$fichier."trouve".$id_doc,"snippets"); $sql="INSERT INTO ".$table_prefix."_documents_liens (id_document, id_objet, objet) VALUES ($id_doc, $id_article,'article')"; spip_query($sql); }else{ // au cas ou, on creer un doc, mais il vaut mieux transferer les doc avec toutes les infos avant de snippet $a = array( 'date' => 'NOW()', 'distant' => 'non', 'mode' => 'image', 'titre'=> $titre, 'descriptif'=> $descriptif, 'extension'=> $extension, 'fichier' => $fichier ); //'largeur' => $largeur, //'hauteur' => $hauteur, //'taille' => $taille, if($forcer_id) $a['id_document'] = $id ; $id = sql_insertq("spip_documents", $a); spip_log ("ajout du document $fichier $titre (M 'image' T 'article' L '$id_article' D '$id')","snippets"); sql_insertq("spip_documents_articles", array('id_document' => $id, 'id_article' => $id_article)); } } } } } return $translations; }
function snippets_rubriques_importer($id_target,$arbre,$contexte){ include_spip('base/serial'); include_spip('base/abstract_sql'); include_spip('inc/snippets'); include_spip('snippets/articles/importer'); $table_prefix = $GLOBALS['table_prefix'] ; $champs_non_importables = array('id_article',"id_rubrique","id_secteur","maj","export","visites","referers","popularite","id_trad","idx","id_version","url_propre"); $champs_non_ajoutables = array('titre',"statut",'date','date_redac','lang'); $champs_jointures = array('auteur','mot'); $champs_defaut_values = array('statut'=>'prop'); $table = 'spip_rubriques'; $primary = 'id_rubrique'; $fields = $GLOBALS['tables_principales']['spip_rubriques']['field']; $tag_objets="rubriques"; $tag_objet="rubrique"; $translations = array(); if ($arbre && isset($arbre[$tag_objets])) foreach($arbre[$tag_objets] as $objets){ foreach($objets[$tag_objet] as $objet){ include_spip('action/editer_rubrique'); // si c'est une creation, creer le formulaire avec les infos d'entete if (!($id_objet=intval($id_target))){ if (preg_match(",id_rubrique=([0-9]*),i",$contexte,$regs)) $id_rubrique=intval($regs[1]); $id_objet = insert_rubrique($id_rubrique); $creation = true; } // sinon on ajoute chaque champ, sauf le titre $row = spip_fetch_array(spip_query("SELECT * FROM $table WHERE $primary="._q($id_objet))); foreach (array_keys($row) as $key) if ( !in_array($key,$champs_non_importables) AND !in_array($key,$champs_jointures) AND ($creation OR !in_array($key,$champs_non_ajoutables) OR !$row[$key]) AND isset($objet[$key])){ $v=trim(spip_xml_aplatit($objet[$key])); $row[$key] = $creation?$v:($row[$key].$v); } revisions_rubriques($id_objet , $row); //$translations[] = array($table,$objet[$primary],$id_objet); // gerer l'import de liens eventuels if ( $objet['liste_articles']){ snippets_articles_importer("",$objet['liste_articles'][0],"id_rubrique=$id_objet") ; } if ($objet['liste_rubriques']){ snippets_rubriques_importer("",$objet['liste_rubriques'][0],"id_rubrique=$id_objet"); } } } return ""; }