function expanser_liens($t, $connect = '', $env = array()) { $t = pipeline('pre_liens', $t); // on passe a traiter_modeles la liste des liens reperes pour lui permettre // de remettre le texte d'origine dans les parametres du modele $t = traiter_modeles($t, false, false, $connect); return $t; }
function inc_marquer_doublons_doc_dist($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, $desc = array(), $serveur = '') { $champs_selection = array(); foreach ($GLOBALS['medias_liste_champs'] as $champs_choisis) { if (isset($champs[$champs_choisis])) { array_push($champs_selection, $champs_choisis); } } if (count($champs_selection) == 0) { return; } if (!$desc) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_objet, $serveur); } $load = ""; // charger le champ manquant en cas de modif partielle de l 'objet // seulement si le champ existe dans la table demande $champs_a_traiter = ""; foreach ($champs_selection as $champs_a_parcourir) { if (isset($desc['field'][$champs_a_parcourir])) { $load = $champs_a_parcourir; $champs_a_traiter .= $champs[$champs_a_parcourir]; } } if ($load) { $champs[$load] = ""; $row = sql_fetsel($load, $spip_table_objet, "{$id_table_objet}=" . sql_quote($id)); if ($row and isset($row[$load])) { $champs[$load] = $row[$load]; } } include_spip('inc/texte'); include_spip('base/abstract_sql'); include_spip('action/editer_liens'); include_spip('base/objets'); $modeles = lister_tables_objets_sql('spip_documents'); $modeles = $modeles['modeles']; $GLOBALS['doublons_documents_inclus'] = array(); $env = array('objet' => $type, 'id_objet' => $id, $id_table_objet => $id); traiter_modeles($champs_a_traiter, array('documents' => $modeles), '', '', null, $env); // detecter les doublons objet_qualifier_liens(array('document' => '*'), array($type => $id), array('vu' => 'non')); if (count($GLOBALS['doublons_documents_inclus'])) { // on repasse par une requete sur spip_documents pour verifier que les documents existent bien ! $in_liste = sql_in('id_document', $GLOBALS['doublons_documents_inclus']); $res = sql_allfetsel("id_document", "spip_documents", $in_liste); $res = array_map('reset', $res); // Creer le lien s'il n'existe pas deja objet_associer(array('document' => $res), array($type => $id), array('vu' => 'oui')); objet_qualifier_liens(array('document' => $res), array($type => $id), array('vu' => 'oui')); } }
function maj_1_935() { include_spip('inc/texte'); foreach (array('article' => 'id_article', 'rubrique' => 'id_rubrique', 'breve' => 'id_breve') as $type => $id_table_objet) { $table_objet = "{$type}" . "s"; $chapo = $type == 'article' ? ",a.chapo" : ""; $res = spip_query("SELECT a.{$id_table_objet},a.texte {$chapo} FROM spip_documents_{$table_objet} AS d JOIN spip_{$table_objet} AS a ON a.{$id_table_objet}=d.{$id_table_objet} GROUP BY {$id_table_objet}"); while ($row = sql_fetch($res)) { $GLOBALS['doublons_documents_inclus'] = array(); traiter_modeles(($chapo ? $row['chapo'] : "") . $row['texte'], true); // detecter les doublons if (count($GLOBALS['doublons_documents_inclus'])) { $id = $row[$id_table_objet]; $liste = "(" . implode(",{$id},'oui'),(", $GLOBALS['doublons_documents_inclus']) . ",{$id},'oui')"; spip_query("REPLACE INTO spip_documents_{$table_objet} (`id_document`,`{$id_table_objet}`,`vu`) VALUES {$liste}"); } } } }
/** * Typographie generale * avec protection prealable des balises HTML et SPIP * * http://code.spip.net/@typo * * @param string $letexte * @param bool $echapper * @param null $connect * @param array $env * @return string */ function typo($letexte, $echapper = true, $connect = null, $env = array()) { // Plus vite ! if (!$letexte) { return $letexte; } // les appels directs a cette fonction depuis le php de l'espace // prive etant historiquement ecrit sans argment $connect // on utilise la presence de celui-ci pour distinguer les cas // ou il faut passer interdire_script explicitement // les appels dans les squelettes (de l'espace prive) fournissant un $connect // ne seront pas perturbes $interdire_script = false; if (is_null($connect)) { $connect = ''; $interdire_script = true; } $echapper = $echapper ? 'TYPO' : false; // Echapper les codes <html> etc if ($echapper) { $letexte = echappe_html($letexte, $echapper); } // // Installer les modeles, notamment images et documents ; // // NOTE : propre() ne passe pas par ici mais directement par corriger_typo // cf. inc/lien $letexte = traiter_modeles($mem = $letexte, false, $echapper ? $echapper : '', $connect, null, $env); if (!$echapper and $letexte != $mem) { $echapper = ''; } unset($mem); $letexte = corriger_typo($letexte); $letexte = echapper_faux_tags($letexte); // reintegrer les echappements if ($echapper !== false) { $letexte = echappe_retour($letexte, $echapper); } // Dans les appels directs hors squelette, securiser ici aussi if ($interdire_script) { $letexte = interdire_scripts($letexte); } return $letexte; }
function expanser_liens_tw($texte, $connect = '') { $debug = _request('var_debug_wheel'); $texte = pipeline('pre_liens', $texte); if ($debug) { spip_timer('liensmatch'); } tw_expanser_un_lien($connect, 'init'); if (strpos($texte, '->') !== false) { $texte = preg_replace_callback(_RACCOURCI_LIEN_TW, 'tw_expanser_un_lien', $texte); } if ($debug) { $GLOBALS['totaux']['expanser_liens:']['liensmatch'] += spip_timer('liensmatch', true); } // on passe a traiter_modeles la liste des liens reperes pour lui permettre // de remettre le texte d'origine dans les parametres du modele if ($debug) { spip_timer('traiter_modeles'); } $texte = traiter_modeles($texte, false, false, $connect, tw_expanser_un_lien('', 'sources')); if ($debug) { $GLOBALS['totaux']['expanser_liens:']['traiter_modeles'] += spip_timer('traiter_modeles', true); } if ($debug) { spip_timer('corriger_typo'); } $texte = corriger_typo($texte); if ($debug) { $GLOBALS['totaux']['expanser_liens:']['corriger_typo'] += spip_timer('corriger_typo', true); } if ($debug) { spip_timer('reinserts'); } $texte = tw_expanser_un_lien($texte, 'reinsert'); if ($debug) { $GLOBALS['totaux']['expanser_liens:']['reinserts'] += spip_timer('reinserts', true); } return $texte; }
/** * Trouver les documents utilisés dans le texte d'un objet et enregistrer cette liaison comme vue. * * La liste des champs susceptibles de contenir des documents ou images est indiquée * par la globale `medias_liste_champs` (un tableau). * * Le contenu de ces champs (du moins ceux qui existent pour l'objet demandé) est récupéré et analysé. * La présence d'un modèle de document dans ces contenus, tel que imgXX, docXX ou embXX * indique que le document est utilisé et doit être lié à l'objet, avec le champ `vu=oui` * * S'il y avait des anciens liens avec vu=oui qui n'ont plus lieu d'être, ils passent à non. * * @note * La fonction pourrait avoir bien moins d'arguments : seuls $champs, $id, $type ou $objet, $desc, $serveur * sont nécessaires. On calcule $desc s'il est absent, et il contient toutes les infos… * * @param array $champs * Couples [champ => valeur] connus de l'objet * @param int $id * Identifiant de l'objet * @param string $type * Type d'objet éditorial (ex: article) * @param string $id_table_objet * Nom de la clé primaire sur la table sql de l'objet * @param string $table_objet * Nom de l'objet éditorial (ex: articles) * @param string $spip_table_objet * Nom de la table sql de l'objet * @param array $desc * Description de l'objet, si déjà calculé * @param string $serveur * Serveur sql utilisé. * @return void|null **/ function inc_marquer_doublons_doc_dist($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, $desc = array(), $serveur = '') { // On conserve uniquement les champs qui modifient le calcul des doublons de documents // S'il n'il en a aucun, les doublons ne sont pas impactés, donc rien à faire d'autre.. if (!($champs = array_intersect_key($champs, array_flip($GLOBALS['medias_liste_champs'])))) { return; } if (!$desc) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_objet, $serveur); } // Il faut récupérer toutes les données qui impactent les liens de documents vus // afin de savoir lesquels sont présents dans les textes, et pouvoir actualiser avec // les liens actuellement enregistrés. $absents = array(); // Récupérer chaque champ impactant qui existe dans la table de l'objet et qui nous manque foreach ($GLOBALS['medias_liste_champs'] as $champ) { if (isset($desc['field'][$champ]) and !isset($champs[$champ])) { $absents[] = $champ; } } // Retrouver les textes des champs manquants if ($absents) { $row = sql_fetsel($absents, $spip_table_objet, "{$id_table_objet}=" . sql_quote($id)); if ($row) { $champs = array_merge($row, $champs); } } include_spip('inc/texte'); include_spip('base/abstract_sql'); include_spip('action/editer_liens'); include_spip('base/objets'); // récupérer la liste des modèles qui considèrent un document comme vu s'ils sont utilisés dans un texte $modeles = lister_tables_objets_sql('spip_documents'); $modeles = $modeles['modeles']; // liste d'id_documents trouvés dans les textes $GLOBALS['doublons_documents_inclus'] = array(); // detecter les doublons dans ces textes traiter_modeles(implode(" ", $champs), array('documents' => $modeles), '', '', null, array('objet' => $type, 'id_objet' => $id, $id_table_objet => $id)); $texte_documents_vus = $GLOBALS['doublons_documents_inclus']; // on ne modifie les liaisons que si c'est nécessaire $bdd_documents_vus = array('oui' => array(), 'non' => array()); $liaisons = objet_trouver_liens(array('document' => '*'), array($type => $id)); foreach ($liaisons as $l) { $bdd_documents_vus[$l['vu']][] = $l['id_document']; } // il y a des nouveaux documents vus dans le texte $nouveaux = array_diff($texte_documents_vus, $bdd_documents_vus['oui']); // il y a des anciens documents vus dans la bdd $anciens = array_diff($bdd_documents_vus['oui'], $texte_documents_vus); if ($nouveaux) { // on vérifie que les documents indiqués vus existent réellement tout de même (en cas d'erreur de saisie) $ids = sql_allfetsel("id_document", "spip_documents", sql_in('id_document', $nouveaux)); $ids = array_map('reset', $ids); if ($ids) { // Creer le lien s'il n'existe pas déjà objet_associer(array('document' => $ids), array($type => $id), array('vu' => 'oui')); objet_qualifier_liens(array('document' => $ids), array($type => $id), array('vu' => 'oui')); } } if ($anciens) { objet_qualifier_liens(array('document' => $anciens), array($type => $id), array('vu' => 'non')); } }
function expanser_liens($texte, $connect='') { $texte = pipeline('pre_liens', $texte); $sources = $inserts = $regs = array(); if (preg_match_all(_RACCOURCI_LIEN, $texte, $regs, PREG_SET_ORDER)) { $lien = charger_fonction('lien', 'inc'); foreach ($regs as $k => $reg) { $inserts[$k] = '@@SPIP_ECHAPPE_LIEN_' . $k . '@@'; $sources[$k] = $reg[0]; $texte = str_replace($sources[$k], $inserts[$k], $texte); list($titre, $bulle, $hlang) = traiter_raccourci_lien_atts($reg[1]); $r = $reg[count($reg)-1]; // la mise en lien automatique est passee par la a tort ! // corrigeons pour eviter d'avoir un <a...> dans un href... if (strncmp($r,'<a',2)==0){ $href = extraire_attribut($r, 'href'); // remplacons dans la source qui peut etre reinjectee dans les arguments // d'un modele $sources[$k] = str_replace($r,$href,$sources[$k]); // et prenons le href comme la vraie url a linker $r = $href; } $regs[$k] = $lien($r, $titre, '', $bulle, $hlang, '', $connect); } } // on passe a traiter_modeles la liste des liens reperes pour lui permettre // de remettre le texte d'origine dans les parametres du modele $texte = traiter_modeles($texte, false, false, $connect, array($inserts, $sources)); $texte = corriger_typo($texte); $texte = str_replace($inserts, $regs, $texte); return $texte; }
function expanser_liens($t, $connect = '', $env = array()) { $t = pipeline('pre_liens', $t); expanser_un_lien($connect, 'init', $env); if (strpos($t, '->') !== false) { $t = preg_replace_callback(_RACCOURCI_LIEN, 'expanser_un_lien', $t); } // on passe a traiter_modeles la liste des liens reperes pour lui permettre // de remettre le texte d'origine dans les parametres du modele $t = traiter_modeles($t, false, false, $connect, expanser_un_lien('', 'sources'), $env); $t = corriger_typo($t); $t = expanser_un_lien($t, 'reinsert'); return $t; }
function marquer_doublons_documents($champs,$id,$type,$id_table_objet,$table_objet,$spip_table_objet, $desc=array(), $serveur=''){ if (!isset($champs['texte']) AND !isset($champs['chapo'])) return; if (!$desc){ $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_objet, $serveur); } $load = ""; // charger le champ manquant en cas de modif partielle de l'objet // seulement si le champ existe dans la table demande if (!isset($champs['texte']) && isset($desc['field']['texte'])) $load = 'texte'; if (!isset($champs['chapo']) && isset($desc['field']['chapo'])) $load = 'chapo'; if ($load){ $champs[$load] = ""; $row = sql_fetsel($load, $spip_table_objet, "$id_table_objet=".sql_quote($id)); if ($row AND isset($row[$load])) $champs[$load] = $row[$load]; } include_spip('inc/texte'); include_spip('base/abstract_sql'); $GLOBALS['doublons_documents_inclus'] = array(); traiter_modeles($champs['chapo'].$champs['texte'],true); // detecter les doublons sql_updateq("spip_documents_liens", array("vu" => 'non'), "id_objet=$id AND objet=".sql_quote($type)); if (count($GLOBALS['doublons_documents_inclus'])){ // on repasse par une requete sur spip_documents pour verifier que les documents existent bien ! $in_liste = sql_in('id_document', $GLOBALS['doublons_documents_inclus']); $res = sql_select("id_document", "spip_documents", $in_liste); while ($row = sql_fetch($res)) { // Mettre le lien a jour ou le creer s'il n'existe pas deja if (!sql_updateq("spip_documents_liens", array("vu" => 'oui'), "id_objet=$id AND objet=".sql_quote($type)." AND id_document=".$row['id_document']) OR !sql_getfetsel("id_document", "spip_documents_liens", "id_document=".$row['id_document']." AND id_objet=$id AND objet=".sql_quote($type))) { sql_insertq("spip_documents_liens", array('id_objet' => $id, 'objet' => $type, 'id_document' => $row['id_document'], 'vu' => 'oui')); pipeline('post_edition', array( 'args' => array( 'operation' => 'lier_document', 'table' => 'spip_documents', 'id_objet' => $row['id_document'], 'objet' => $type, 'id' => $id ), 'data' => null ) ); } } } }
function exec_rubriques_edit_args($id_rubrique, $id_parent, $new, $lier_trad) { global $connect_toutes_rubriques, $connect_statut, $spip_lang_right; $titre = false; if ($new == "oui") { $id_rubrique = 0; $titre = filtrer_entites(_T('titre_nouvelle_rubrique')); if (!autoriser('creerrubriquedans','rubrique',$id_parent)) { $id_parent = intval(reset($GLOBALS['connect_id_rubrique'])); } } else { $row = sql_fetsel("*", "spip_rubriques", "id_rubrique=$id_rubrique"); if ($row) { $id_parent = $row['id_parent']; $titre = $row['titre']; $id_secteur = $row['id_secteur']; } } $commencer_page = charger_fonction('commencer_page', 'inc'); if ($titre === false OR ($new=='oui' AND !autoriser('creerrubriquedans','rubrique',$id_parent)) OR ($new!='oui' AND !autoriser('modifier','rubrique',$id_rubrique))) { include_spip('inc/minipres'); echo minipres(); } else { pipeline('exec_init',array('args'=>array('exec'=>'rubriques_edit','id_rubrique'=>$id_rubrique),'data'=>'')); echo $commencer_page(_T('info_modifier_titre', array('titre' => $titre)), "naviguer", "rubriques", $id_rubrique); if ($id_parent == 0) $ze_logo = "secteur-24.gif"; else $ze_logo = "rubrique-24.gif"; echo debut_grand_cadre(true); echo afficher_hierarchie($id_parent,'',$id_rubrique,'rubrique'); echo fin_grand_cadre(true); echo debut_gauche('', true); // Pave "documents associes a la rubrique" if (!$new){ # affichage sur le cote des pieces jointes, en reperant les inserees # note : traiter_modeles($texte, true) repere les doublons # aussi efficacement que propre(), mais beaucoup plus rapidement traiter_modeles(join('',$row), true); echo afficher_documents_colonne($id_rubrique, 'rubrique'); } echo pipeline('affiche_gauche',array('args'=>array('exec'=>'rubriques_edit','id_rubrique'=>$id_rubrique),'data'=>'')); echo creer_colonne_droite('', true); echo pipeline('affiche_droite',array('args'=>array('exec'=>'rubriques_edit','id_rubrique'=>$id_rubrique),'data'=>'')); echo debut_droite('', true); $contexte = array( 'icone_retour'=>icone_inline(_T('icone_retour'), generer_url_ecrire("naviguer","id_rubrique=$id_rubrique"), $ze_logo, "rien.gif",$GLOBALS['spip_lang_left']), 'redirect'=>generer_url_ecrire("naviguer"), 'titre'=>$titre, 'new'=>$new == "oui"?$new:$id_rubrique, 'id_rubrique'=>$id_parent, // pour permettre la specialisation par la rubrique appelante 'config_fonc'=>'rubriques_edit_config', 'lier_trad'=>$lier_trad ); echo recuperer_fond("prive/editer/rubrique", $contexte); echo pipeline('affiche_milieu',array('args'=>array('exec'=>'rubriques_edit','id_rubrique'=>$id_rubrique),'data'=>'')); echo fin_gauche(), fin_page(); } }
function articles_edit($id_article, $id_rubrique, $lier_trad, $id_version, $new, $config_fonc, $row) { $id_article = $row['id_article']; $id_rubrique = $row['id_rubrique']; $titre = sinon($row["titre"],_T('info_sans_titre')); $commencer_page = charger_fonction('commencer_page', 'inc'); pipeline('exec_init',array('args'=>array('exec'=>'articles_edit','id_article'=>$id_article),'data'=>'')); if ($id_version) $titre.= ' ('._T('version')." $id_version)"; echo $commencer_page(_T('titre_page_articles_edit', array('titre' => $titre)), "naviguer", "articles", $id_rubrique); echo debut_grand_cadre(true); echo afficher_hierarchie($id_rubrique,'',$id_article,'article'); echo fin_grand_cadre(true); echo debut_gauche("",true); // Pave "documents associes a l'article" if (!$new){ # affichage sur le cote des pieces jointes, en reperant les inserees # note : traiter_modeles($texte, true) repere les doublons # aussi efficacement que propre(), mais beaucoup plus rapidement traiter_modeles(join('',$row), true); echo afficher_documents_colonne($id_article, 'article'); } else { # ICI GROS HACK # ------------- # on est en new ; si on veut ajouter un document, on ne pourra # pas l'accrocher a l'article (puisqu'il n'a pas d'id_article)... # on indique donc un id_article farfelu (0-id_auteur) qu'on ramassera # le moment venu, c'est-a-dire lors de la creation de l'article # dans editer_article. echo afficher_documents_colonne( 0-$GLOBALS['visiteur_session']['id_auteur'], 'article'); } echo pipeline('affiche_gauche',array('args'=>array('exec'=>'articles_edit','id_article'=>$id_article),'data'=>'')); echo creer_colonne_droite("",true); echo pipeline('affiche_droite',array('args'=>array('exec'=>'articles_edit','id_article'=>$id_article),'data'=>'')); echo debut_droite("",true); $oups = ($lier_trad ? generer_url_ecrire("articles","id_article=$lier_trad") : ($new ? generer_url_ecrire("naviguer","id_rubrique=".$row['id_rubrique']) : generer_url_ecrire("articles","id_article=".$row['id_article']) )); $contexte = array( 'icone_retour'=>icone_inline(_T('icone_retour'), $oups, "article-24.gif", "rien.gif",$GLOBALS['spip_lang_left']), 'redirect'=>generer_url_ecrire("articles"), 'titre'=>$titre, 'new'=>$new?$new:$row['id_article'], 'id_rubrique'=>$row['id_rubrique'], 'id_secteur'=>$row['id_secteur'], 'lier_trad'=>$lier_trad, 'config_fonc'=>$config_fonc, // passer row si c'est le retablissement d'une version anterieure 'row'=> $id_version ? $row : null ); $milieu = recuperer_fond("prive/editer/article", $contexte); echo pipeline('affiche_milieu',array('args'=>array('exec'=>'articles_edit','id_article'=>$id_article),'data'=>$milieu)); echo fin_gauche(), fin_page(); }
function breves_edit_ok($row, $id_breve, $id_rubrique, $new) { global $connect_statut, $spip_lang_right; if ($new != 'oui') { $id_breve=$row['id_breve']; $titre=$row['titre']; $statut=$row['statut']; $id_rubrique=$row['id_rubrique']; } else { $titre = filtrer_entites(_T('titre_nouvelle_breve')); $statut = "prop"; } $commencer_page = charger_fonction('commencer_page', 'inc'); pipeline('exec_init',array('args'=>array('exec'=>'breves_edit','id_breve'=>$id_breve),'data'=>'')); echo $commencer_page(_T('titre_page_breves_edit', array('titre' => $titre)), "naviguer", "breves", $id_rubrique); echo debut_grand_cadre(true); echo afficher_hierarchie($id_rubrique); echo fin_grand_cadre(true); echo debut_gauche('', true); if ($new != 'oui' AND ($connect_statut=="0minirezo" OR $statut=="prop")) { # affichage sur le cote des images, en reperant les inserees # note : traiter_modeles($texte, true) repere les doublons # aussi efficacement que propre(), mais beaucoup plus rapidement traiter_modeles("$titre$texte", true); echo afficher_documents_colonne($id_breve, "breve"); } echo pipeline('affiche_gauche',array('args'=>array('exec'=>'breves_edit','id_breve'=>$id_breve),'data'=>'')); echo creer_colonne_droite('', true); echo pipeline('affiche_droite',array('args'=>array('exec'=>'breves_edit','id_breve'=>$id_breve),'data'=>'')); echo debut_droite('', true); $contexte = array( 'icone_retour'=>$new=='oui'?'':icone_inline(_T('icone_retour'), generer_url_ecrire("breves_voir","id_breve=$id_breve"), "breve-24.gif", "rien.gif",$GLOBALS['spip_lang_left']), 'redirect'=>generer_url_ecrire("breves_voir"), 'titre'=>$titre, 'new'=>$new == "oui"?$new:$id_breve, 'id_rubrique'=>$id_rubrique, 'config_fonc'=>'breves_edit_config' ); echo recuperer_fond("prive/editer/breve", $contexte); echo fin_gauche(), fin_page(); }