function type_urls_URL_objet_exec() { global $type_urls; $type = _request('type_objet'); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table(table_objet($type)); $table = $desc['table']; $champ_titre = $desc['titre']?$desc['titre']:'titre'; $col_id = @$desc['key']["PRIMARY KEY"]; if (!$col_id) return false; // Quand $type ne reference pas une table $id_objet = intval(_request('id_objet')); // chercher dans la table des URLS include_spip('base/abstract_sql'); // Recuperer une URL propre correspondant a l'objet. $row = sql_fetsel("U.url, O.$champ_titre", "$table AS O LEFT JOIN spip_urls AS U ON (U.type='$type' AND U.id_objet=O.$col_id)", "O.$col_id=$id_objet", '', 'U.date DESC', 1); if (!$row) return false; # Quand $id_objet n'est pas un numero connu // Calcul de l'URL complete $url = str_replace('.././','../',generer_url_entite($id_objet, $type, '', '', true)); $row2 = !strlen($url2 = $row['url']) // si l'URL n'etait pas presente en base, maintenant elle l'est ! ?sql_fetsel("url", "spip_urls", "id_objet=$id_objet AND type='$type'", '', 'date DESC', 1) :array('url'=>$url2); include_spip('inc/charsets'); // titre || url complete || type d'URLs || URL recalculee || url propre en base echo charset2unicode($row['titre']).'||'.$url.'||'.$type_urls.'||'.$row2['url'].'||'.$url2; }
function cextras_objets_valides(){ $objets = array(); $objets_extensibles = pipeline("objets_extensibles", array( 'article' => _T('cextras:table_article'), 'auteur' => _T('cextras:table_auteur'), 'breve' => _T('cextras:table_breve'), 'groupes_mot' => _T('cextras:table_groupes_mot'), 'mot' => _T('cextras:table_mot'), 'rubrique' => _T('cextras:table_rubrique'), 'site' => _T('cextras:table_site') )); ksort($objets_extensibles); foreach ($objets_extensibles as $objet => $traduction) { $objets[$objet] = array( 'table' => table_objet_sql($objet), 'type' => objet_type(table_objet($objet)), 'nom' => $traduction, ); } return $objets; }
function formulaires_forum_prive_charger_dist($objet, $id_objet, $id_forum, $afficher_previsu, $statut, $retour = '') { if (!function_exists($f = 'forum_recuperer_titre')) { $f = 'forum_recuperer_titre_dist'; } // si objet, il faut un titre, sinon on est dans un statut privrac/privadm qui permet un forum sans objet if ($objet and $id_objet and !($titre = $f($objet, $id_objet, $id_forum, false))) { return false; } $primary = id_table_objet($objet); $table = table_objet($objet); // Tableau des valeurs servant au calcul d'une signature de securite. // Elles seront placees en Input Hidden pour que inc/forum_insert // recalcule la meme chose et verifie l'identite des resultats. // Donc ne pas changer la valeur de ce tableau entre le calcul de // la signature et la fabrication des Hidden // Faire attention aussi a 0 != '' $ids = array(); $ids[$primary] = ($x = intval($id_objet)) ? $x : ''; $ids['id_objet'] = ($x = intval($id_objet)) ? $x : ''; $ids['objet'] = $objet; $ids['id_forum'] = ($x = intval($id_forum)) ? $x : ''; // ne pas mettre '', sinon le squelette n'affichera rien. $previsu = ' '; // pour les hidden $script_hidden = ""; foreach ($ids as $id => $v) { $script_hidden .= "<input type='hidden' name='{$id}' value='{$v}' />"; } $config = array(); foreach (array('afficher_barre', 'forum_titre', 'forums_texte', 'forums_urlref') as $k) { $config[$k] = ' '; } return array('nom_site' => '', 'table' => $table, 'texte' => '', 'config' => $config, 'titre' => $titre, '_hidden' => $script_hidden, 'url_site' => "http://", 'id_forum' => $id_forum, '_sign' => implode('_', $ids), '_autosave_id' => $ids); }
/** * Supprimer un lien entre un document et un objet * * @param int $id_document * @param string $objet * @param int $id_objet * @param bool $supprime * si true, le document est supprime si plus lie a aucun objet * @param bool $check * si true, on verifie les documents references dans le texte de l'objet * et on les associe si pas deja fait * @return bool */ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) { if (!($id_document = intval($id_document))) { return false; } // D'abord on ne supprime pas, on dissocie include_spip('action/editer_liens'); objet_dissocier(array('document' => $id_document), array($objet => $id_objet)); // Si c'est une vignette, l'eliminer du document auquel elle appartient // cas tordu peu probable sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=" . $id_document); // verifier son statut apres une suppression de lien include_spip('action/editer_document'); document_instituer($id_document); pipeline('post_edition', array('args' => array('operation' => 'delier_document', 'action' => 'delier_document', 'table' => 'spip_documents', 'id_objet' => $id_document, 'objet' => $objet, 'id' => $id_objet), 'data' => null)); if ($check) { // si demande, on verifie que ses documents vus sont bien lies ! $spip_table_objet = table_objet_sql($objet); $table_objet = table_objet($objet); $id_table_objet = id_table_objet($objet, $serveur); $champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . "=" . intval($id_objet)); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc($champs, $id_objet, $objet, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur); } // On supprime ensuite s'il est orphelin // et si demande // ici on ne bloque pas la suppression d'un document rattache a un autre if ($supprime and !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . $id_document)) { $supprimer_document = charger_fonction('supprimer_document', 'action'); return $supprimer_document($id_document); } }
function action_dereferencer_traduction_rubrique_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); list($type, $id_objet) = explode('/', $arg); if (!$type = objet_type($type) or !$id_objet = intval($id_objet)) { if (!_AJAX) { include_spip('inc/minipres'); minipres('Arguments incompris'); } else { spip_log('Arguments incompris dans action dereferencer_traduction_rubrique'); return false; } } $objet = table_objet($type); $_id_objet = id_table_objet($objet); $table = table_objet_sql($objet); $id_trad_old = sql_getfetsel('id_trad', $table, "$_id_objet = " . sql_quote($id_objet)); if ($id_trad_old) { include_spip('inc/modifier'); modifier_contenu($objet, $id_objet, array('invalideur' => "id='$objet/$id_objet'"), array('id_trad' => 0)); // si la deliaison fait qu'il ne reste plus que la source // dans le groupe de traduction on lui remet l'id_trad a 0 if (1 == $nb_dans_groupe = sql_countsel($table, array('id_trad = ' . sql_quote($id_trad_old)))) { modifier_contenu($objet, $id_trad_old, array('invalideur' => "id='$objet/$id_trad_old'"), array('id_trad' => 0)); } } }
/** * Retrouve la traduction d'un rôle dans un objet donné * * @param string $role * Le role dans la base de donnée * @param string $objet * L'objet sur lequel est le rôle * @return string * Le texte du rôle dans la langue en cours * **/ function filtre_role_dist($role, $objet) { if (!$role) return ''; if (!$objet) return $role; $roles = roles_presents(table_objet(objet_type($objet))); if (isset($roles['titres'][$role])) { return _T($roles['titres'][$role]); } return $role; }
/** * Boite de configuration des objets articles * * @param array $flux * @return array */ function petitions_afficher_config_objet($flux) { if (($type = $flux['args']['type']) == 'article' and $id = $flux['args']['id']) { if (autoriser('modererpetition', $type, $id)) { $table = table_objet($type); $id_table_objet = id_table_objet($type); $flux['data'] .= recuperer_fond("prive/configurer/petitionner", array($id_table_objet => $id)); } } return $flux; }
/** * Retourne le code HTML du portfolio, liste des documents et formulaire d'ajout de documents * * @note * Marque les documents vus dans les textes de l'objet avant le calcul ! * * @uses inc_marquer_doublons_doc_dist() * * @param int $id Identifiant de l'objet * @param string $type Type d'objet * @return string code HTML **/ function inc_documenter_objet_dist($id, $type) { $serveur = ''; // avant de documenter un objet, on verifie que ses documents vus sont bien lies ! $spip_table_objet = table_objet_sql($type); $table_objet = table_objet($type); $id_table_objet = id_table_objet($type, $serveur); $champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . "=" . intval($id)); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur); $contexte = array('objet' => $type, 'id_objet' => $id); return recuperer_fond('prive/objets/contenu/portfolio_document', array_merge($_GET, $contexte)); }
function definir($params=array()) { foreach ($params as $cle=>$valeur) { if (isset($this->$cle)) { $this->$cle = $valeur; } } // calculer _objet et _table_sql $this->_type = objet_type(table_objet($this->table)); // article $this->_objet = table_objet($this->_type); // articles $this->_table_sql = table_objet_sql($this->table); // spip_articles // calculer l'id du champ extra $this->make_id(); }
/** * Charger les données de #FORMULAIRE_TRADUIRE * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de retour * @param bool $traduire * Permet de désactiver la gestion de traduction sur un objet ayant id_trad * @return array|bool * False si l'identifiant n'est pas numérique ou si l'objet n'a pas de langue * Contexte à transmettre au squelette du formulaire sinon */ function formulaires_traduire_charger_dist($objet, $id_objet, $retour = '', $traduire = true) { if (!intval($id_objet)) { return false; } $valeurs = formulaires_editer_objet_charger($objet, $id_objet, null, 0, $retour, ''); // verifier que l'objet indique possede bien des champs id_trad et lang // attention, charger renomme lang => langue pour ne pas perturber la langue d'affichage du squelette if (!isset($valeurs['langue'])) { return false; } $valeurs['editable'] = autoriser('changerlangue', $objet, $id_objet); $valeurs['_langue'] = ''; $langue_parent = ''; $id_parent = ''; if (isset($valeurs['id_rubrique'])) { $id_parent = $valeurs['id_rubrique']; } if (isset($valeurs['id_parent'])) { $id_parent = $valeurs['id_parent']; } if ($id_parent) { $langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=" . intval($id_parent)); } if (!$langue_parent) { $langue_parent = $GLOBALS['meta']['langue_site']; } if ($valeurs['editable'] and in_array(table_objet_sql($objet), explode(',', $GLOBALS['meta']['multi_objets']))) { $valeurs['_langue'] = $valeurs['langue']; } $valeurs['langue_parent'] = $langue_parent; $valeurs['_objet'] = $objet; $valeurs['_id_objet'] = $id_objet; $valeurs['changer_lang'] = ''; $valeurs['_traduisible'] = autoriser('changertraduction', $objet, $id_objet); $valeurs['_traduire'] = ''; if (isset($valeurs['id_trad']) and $valeurs['_traduisible']) { $valeurs['_traduire'] = $traduire ? ' ' : ''; $valeurs['_vue_traductions'] = "prive/objets/liste/" . (trouver_fond($f = table_objet($objet) . "-trad", "prive/objets/liste") ? $f : "objets-trad"); // pour afficher la liste des trad sur la base de l'id_trad en base // independamment d'une saisie en cours sur id_trad $valeurs['_lister_id_trad'] = $valeurs['id_trad']; $valeurs['_id_parent'] = $id_parent; } $valeurs['_saisie_en_cours'] = (!_request('annuler') and (_request('changer_lang') !== null or _request('changer_id_trad') !== null)); $valeurs['_pipeline'] = array('traduire', array('type' => $objet, 'id' => $id_objet)); return $valeurs; }
function inc_editer_mots_dist($objet, $id_objet, $cherche_mot, $select_groupe, $flag, $visible = false, $url_base='') { if ($GLOBALS['meta']["articles_mots"] == 'non') return ''; if (!preg_match('/^[0-9, ]*$/', $select_groupe)) return ''; $trouver_table = charger_fonction('trouver_table', 'base'); $nom = table_objet($objet); $desc = $trouver_table($nom); $table_id = @$desc['key']["PRIMARY KEY"]; $reponse = ($flag AND $cherche_mot) ? chercher_inserer_mot($cherche_mot, $select_groupe, $objet, $id_objet, $nom, $table_id, $url_base) : ''; list($liste, $mots) = afficher_mots_cles($flag, $objet, $id_objet, $nom, $table_id, $url_base); $aff =false; $bouton = _T('titre_mots_cles').aide ("artmots"); if ($liste) $aff = true; if ($flag) { // si droit de modif donner le formulaire $visible = ($visible OR $cherche_mot OR ($flag === 'ajax')); list($visible, $res) = formulaire_mots_cles($id_objet, $mots, $nom, $table_id, $url_base, $visible, $objet); if ($res) { $liste .= debut_block_depliable($visible,"lesmots") . $res . creer_mot($nom, $id_objet, $table_id, $url_base, $cherche_mot, $select_groupe) . fin_block(); $bouton = bouton_block_depliable($bouton, $visible,"lesmots"); $aff = true; } } if (!$aff) return ''; $res = debut_cadre_enfonce("mot-cle-24.gif", true, "", $bouton) . $reponse . $liste . fin_cadre_enfonce(true); return ajax_action_greffe("editer_mots", $id_objet, $res); }
function nettoyer_url_page($url, $contexte=array()) { $url_objets = urls_liste_objets(); $raccourci_url_page_html = ',^(?:[^?]*/)?('. $url_objets . ')([0-9]+)(?:\.html)?([?&].*)?$,'; $raccourci_url_page_id = ',^(?:[^?]*/)?('. $url_objets .')\.php3?[?]id_\1=([0-9]+)([?&].*)?$,'; $raccourci_url_page_spip = ',^(?:[^?]*/)?(?:spip[.]php)?[?]('. $url_objets .')([0-9]+)(&.*)?$,'; if (preg_match($raccourci_url_page_html, $url, $regs) OR preg_match($raccourci_url_page_id, $url, $regs) OR preg_match($raccourci_url_page_spip, $url, $regs)) { $type = preg_replace(',s$,', '', table_objet($regs[1])); if ($type == 'syndic') $type = 'site'; $_id = id_table_objet($regs[1]); $contexte[$_id] = $regs[2]; $suite = $regs[3]; return array($contexte, $type, null, $type, $suite); } return array(); }
function exec_iconifier_args($id, $primary, $script, $iframe=false) { $type = objet_type(table_objet(substr($primary, 3))); if (!preg_match('/^\w+$/', "$primary$script") OR !autoriser('iconifier', $type, $id)) { include_spip('inc/minipres'); echo minipres(); } else { $iconifier = charger_fonction('iconifier', 'inc'); $ret = $iconifier($primary, $id, $script, $visible=true); if ($iframe!=='iframe') ajax_retour($ret); else { echo "<div class='upload_answer upload_document_added'>$ret</div>"; } } }?>
/** * Ajouter un traitement automatique sur une balise * * On peut restreindre l'application du traitement au balises appelées dans un * type de boucle via le paramètre optionnel $table. * * @param array $interfaces * Les interfaces du pipeline declarer_tables_interfaces * @param string $traitement * Un format comme pour sprintf, dans lequel le compilateur passera la valeur de la balise * @param string $balise * Le nom de la balise à laquelle on veut appliquer le traitement * @param string $table (optionnel) * Un type de boucle auquel on veut restreindre le traitement. */ function ajouter_traitement_automatique($interfaces, $traitement, $balise, $table = 0) { $table_traitements = $interfaces['table_des_traitements']; if (!isset($table_traitements[$balise])) { $table_traitements[$balise] = array(); } /* On essaie d'être tolérant sur le nom de la table */ if ($table) { include_spip('base/objets'); $table = table_objet($table); } if (isset($table_traitements[$balise][$table])) { $traitement_existant = $table_traitements[$balise][$table]; } if (!isset($traitement_existant) or !$traitement_existant) { $traitement_existant = '%s'; } $interfaces['table_des_traitements'][$balise][$table] = sprintf($traitement, $traitement_existant); return $interfaces; }
function action_plan_dist() { include_spip('inc/autoriser'); if (!autoriser('ecrire')) { return false; } include_spip('base/objets'); include_spip('inc/utils'); $objet = table_objet(_request('objet')); $env = array('id_rubrique' => intval(_request('id_rubrique')), 'lister' => $objet == 'rubriques' ? 'rubrique' : 'tout', 'conteneur' => 'non'); if ($statut = _request('statut')) { $env['statut'] = $statut; } $fond = "prive/squelettes/inclure/plan-{$objet}"; header("Content-Type: text/html; charset=" . $GLOBALS['meta']['charset']); if (trouver_fond($fond)) { echo recuperer_fond($fond, $env); } else { echo ""; } }
/** * Retrouve la source et l'objet de la liaison * * À partir des 3 premiers paramètres transmis au formulaire, * la fonction retrouve : * - l'objet dont on utilise sa table de liaison (table_source) * - l'objet et id_objet sur qui on lie des éléments (objet, id_objet) * - l'objet que l'on veut lier dessus (objet_lien) * * @param string $a * @param string|int $b * @param int|string $c * @return array * ($table_source,$objet,$id_objet,$objet_lien) */ function determine_source_lien_objet($a, $b, $c) { $table_source = $objet_lien = $objet = $id_objet = null; // auteurs, article, 23 : // associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens if (is_numeric($c) and !is_numeric($b)) { $table_source = table_objet($a); $objet_lien = objet_type($a); $objet = objet_type($b); $id_objet = $c; } // article, 23, auteurs // associer des auteurs à l'article 23, sur la table pivot spip_articles_liens if (is_numeric($b) and !is_numeric($c)) { $table_source = table_objet($c); $objet_lien = objet_type($a); $objet = objet_type($a); $id_objet = $b; } return array($table_source, $objet, $id_objet, $objet_lien); }
/** * Vérifie qu'un objet dispose de rôles fonctionnels * * Retourne une description des rôles si c'est le cas * * @param string $objet * Objet source qui possède la table de liaison * @param string $objet_destination * Objet sur quoi on veut lier * Si défini, le retour ne contient que les roles possibles pour cet objet * Sinon retourne tous les roles possibles quelque soit l'objet * @return bool|array * false si rôles indisponibles on non déclarés * array : description des roles applicables dans 3 index : colonne, titres, roles **/ function roles_presents($objet, $objet_destination = '') { $desc = lister_tables_objets_sql(table_objet_sql($objet)); // pas de liste de roles, on sort if (!isset($desc['roles_titres']) or !($titres = $desc['roles_titres'])) { return false; } // on vérifie que la table de liaison existe include_spip('action/editer_liens'); if (!($lien = objet_associable($objet))) { return false; } // on cherche ensuite si la colonne existe bien dans la table de liaison (par défaut 'role') $colonne = isset($desc['roles_colonne']) ? $desc['roles_colonne'] : 'role'; $trouver_table = charger_fonction('trouver_table', 'base'); list(, $table_lien) = $lien; $desc_lien = $trouver_table($table_lien); if (!isset($desc_lien['field'][$colonne])) { return false; } // sur quoi peuvent s'appliquer nos rôles if (!($application = $desc['roles_objets'])) { return false; } // destination presente, on restreint si possible if ($objet_destination) { $objet_destination = table_objet($objet_destination); // pour l'objet if (isset($application[$objet_destination])) { $application = $application[$objet_destination]; // sinon pour tous les objets } elseif (isset($application['*'])) { $application = $application['*']; } else { return false; } } // tout est ok return array('titres' => $titres, 'roles' => $application, 'colonne' => $colonne); }
/** * Chargement du formulaire d'édition d'un mot * * @see formulaires_editer_objet_charger() * * @param int|string $id_mot * Identifiant du mot. 'new' pour un nouveau mot. * @param int $id_groupe * Identifiant du groupe parent (si connu) * @param string $retour * URL de redirection après le traitement * @param string $associer_objet * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet, * tel que 'article|3' * @param string $dummy1 ? * @param string $dummy2 ? * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL du mot, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Environnement du formulaire **/ function formulaires_editer_mot_charger_dist($id_mot = 'new', $id_groupe = 0, $retour = '', $associer_objet = '', $dummy1 = '', $dummy2 = '', $config_fonc = 'mots_edit_config', $row = array(), $hidden = '') { $valeurs = formulaires_editer_objet_charger('mot', $id_mot, $id_groupe, '', $retour, $config_fonc, $row, $hidden); if ($valeurs['id_parent'] && !$valeurs['id_groupe']) { $valeurs['id_groupe'] = $valeurs['id_parent']; } if ($associer_objet) { if (intval($associer_objet)) { // compat avec l'appel de la forme ajouter_id_article $objet = 'article'; $id_objet = intval($associer_objet); } else { list($objet, $id_objet) = explode('|', $associer_objet); } } $valeurs['table'] = $associer_objet ? table_objet($objet) : ''; // Si nouveau et titre dans l'url : fixer le titre if ($id_mot == 'oui' and strlen($titre = _request('titre'))) { $valeurs['titre'] = $titre; } return $valeurs; }
function dater_table($id, $type) { $trouver_table = charger_fonction('trouver_table', 'base'); $nom = table_objet($type); $desc = $trouver_table($nom); $table = $desc['table']; $col_id = @$desc['key']["PRIMARY KEY"]; if (!$table OR !$col_id) { spip_log("action_dater: table $type ?"); return; } include_spip('public/interfaces'); $champ = @$GLOBALS['table_date'][$nom]; if (!$champ) $champ = 'date'; $date = format_mysql_date(_request('annee'), _request('mois'), _request('jour'), _request('heure'), _request('minute')); // utiliser instituer_xx si dispo if (include_spip('action/editer_'.$type) AND function_exists($f='instituer_'.$type)){ $f($id,array($champ => $date)); } else sql_updateq($table, array($champ => $date), "$col_id=$id"); return $date; }
function balise_FORMULAIRE_UPLOAD_stat($args, $filtres) { // si on force les parametres par #FORMULAIRE_UPLOAD{article,12,inc-upload_truc} // on enleve les parametres calcules if (isset($args[3])) { array_shift($args); array_shift($args); } $objet = $args[0]; $id_objet = $args[1]; if(!$fond_documents = $args[2]) $fond_documents = 'inc-upload_documents'; // pas dans une boucle ? on attache a l'auteur connecté if ($objet == 'balise_hors_boucle') { $objet = 'auteur'; $id_objet = $GLOBALS['auteur_session']['id_auteur']; } else { $objet = table_objet($objet); } // on envoie les arguments a la fonction charger // du formulaire CVT fomulaires/upload.php return array($objet, $id_objet, $fond_documents); }
function styliser_par_objets($flux) { if (test_espace_prive() and !($squelette = $flux['data']) and strncmp($flux['args']['fond'], 'prive/objets/', 13) == 0 and $echafauder = charger_fonction('echafauder', 'prive', true)) { if (strncmp($flux['args']['fond'], 'prive/objets/liste/', 19) == 0) { $table = table_objet(substr($flux['args']['fond'], 19)); $table_sql = table_objet_sql($table); $objets = lister_tables_objets_sql(); if (isset($objets[$table_sql])) { $flux['data'] = $echafauder($table, $table, $table_sql, "prive/objets/liste/objets", $flux['args']['ext']); } } if (strncmp($flux['args']['fond'], 'prive/objets/contenu/', 21) == 0) { $type = substr($flux['args']['fond'], 21); $table = table_objet($type); $table_sql = table_objet_sql($table); $objets = lister_tables_objets_sql(); if (isset($objets[$table_sql])) { $flux['data'] = $echafauder($type, $table, $table_sql, "prive/objets/contenu/objet", $flux['args']['ext']); } } } return $flux; }
function medias_post_edition($flux) { // le serveur n'est pas toujours la $serveur = isset($flux['args']['serveur']) ? $flux['args']['serveur'] : ''; // si on ajoute un document, mettre son statut a jour if ($flux['args']['action'] == 'ajouter_document') { include_spip('action/editer_document'); // mettre a jour le statut si necessaire document_instituer($flux['args']['id_objet']); } elseif ($flux['args']['table'] !== 'spip_documents') { $type = isset($flux['args']['type']) ? $flux['args']['type'] : objet_type($flux['args']['table']); // verifier d'abord les doublons ! include_spip('inc/autoriser'); if (autoriser('autoassocierdocument', $type, $flux['args']['id_objet'])) { $table_objet = isset($flux['args']['table_objet']) ? $flux['args']['table_objet'] : table_objet($flux['args']['table'], $serveur); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc($flux['data'], $flux['args']['id_objet'], $type, id_table_objet($type, $serveur), $table_objet, $flux['args']['table'], '', $serveur); } if ($flux['args']['action'] == 'instituer' or isset($flux['data']['statut'])) { include_spip('base/abstract_sql'); $id = $flux['args']['id_objet']; $docs = array_map('reset', sql_allfetsel('id_document', 'spip_documents_liens', 'id_objet=' . intval($id) . ' AND objet=' . sql_quote($type))); include_spip('action/editer_document'); foreach ($docs as $id_document) { // mettre a jour le statut si necessaire document_instituer($id_document); } } } else { if ($flux['args']['table'] !== 'spip_documents') { // verifier les doublons ! $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc($flux['data'], $flux['args']['id_objet'], $flux['args']['type'], id_table_objet($flux['args']['type'], $serveur), $flux['args']['table_objet'], $flux['args']['spip_table_objet'], '', $serveur); } } return $flux; }
/** * Affichage des liste d'objets * * Surcharge pour aiguiller vers la mise en squelettes des listes * * @deprecated Créer ou utiliser un squelette dans `prive/objets/liste/` * pour la table en question et l'appeler avec une inclusion. * * @param string $vue * Nom de l'objet * @param array $contexte * Contexte du squelette * @param bool $force * Si `true` le titre est affiché même s'il n'y a aucun élément dans la liste. * @return string * Code HTML de la liste */ function inc_lister_objets_dist($vue, $contexte = array(), $force = false) { $res = ""; // debug if (!is_array($contexte)) { return _L('$contexte doit etre un tableau dans inc/lister_objets'); } $fond = "prive/objets/liste/{$vue}"; if (!find_in_path($fond . "." . _EXTENSION_SQUELETTES)) { // traiter les cas particuliers include_spip('base/connect_sql'); $vue = table_objet($vue); $fond = "prive/objets/liste/{$vue}"; if (!find_in_path($fond . "." . _EXTENSION_SQUELETTES)) { return _L("vue {$vue} introuvable pour lister les objets"); } } $contexte['sinon'] = $force ? $contexte['titre'] : ''; $res = recuperer_fond($fond, $contexte, array('ajax' => true)); if (_request('var_liste')) { echo var_export($contexte, true); } return $res; }
function base_trouver_table_dist($nom, $serveur=''){ static $nom_cache_desc_sql=array(); global $tables_principales, $tables_auxiliaires, $table_des_tables; if (!spip_connect($serveur) OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom)) return null; $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe // ce qui permet une auto invalidation en cas de modif manuelle du fichier // de connexion, et tout risque d'ambiguite if (!isset($nom_cache_desc_sql[$serveur])) $nom_cache_desc_sql[$serveur] = _DIR_CACHE . 'sql_desc_' . ($serveur ? "$serveur_":"") . substr(md5($connexion['db'].":".$connexion['prefixe']),0,8) .'.txt'; // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions if (!$nom){ spip_unlink($nom_cache_desc_sql[$serveur]); $connexion['tables'] = array(); return null; } $nom_sql = $nom; if (preg_match('/\.(.*)$/', $nom, $s)) $nom_sql = $s[1]; else $nom_sql = $nom; $desc = ''; // base sous SPIP: gerer les abreviations explicites des noms de table if ($connexion['spip_connect_version']) { include_spip('public/interfaces'); if (isset($table_des_tables[$nom])) { $nom = $table_des_tables[$nom]; $nom_sql = 'spip_' . $nom; } } // si c'est la premiere table qu'on cherche // et si on est pas explicitement en recalcul // on essaye de recharger le cache des decriptions de ce serveur // dans le fichier cache if (!isset($connexion['tables'][$nom]) AND $GLOBALS['var_mode']!=='recalcul' AND (!isset($connexion['tables']) OR !$connexion['tables'])) { if (lire_fichier($nom_cache_desc_sql[$serveur],$desc_cache) AND $desc_cache=unserialize($desc_cache)) $connexion['tables'] = $desc_cache; } if (!isset($connexion['tables'][$nom])) { include_spip('base/serial'); if (isset($tables_principales[$nom_sql])) $fdesc = $tables_principales[$nom_sql]; // meme si pas d'abreviation declaree, trouver la table spip_$nom // si c'est une table principale, // puisqu'on le fait aussi pour les tables auxiliaires elseif ($nom_sql==$nom AND isset($tables_principales['spip_' .$nom])){ $nom_sql = 'spip_' . $nom; $fdesc = &$tables_principales[$nom_sql]; } else { include_spip('base/auxiliaires'); if (isset($tables_auxiliaires['spip_' .$nom])) { $nom_sql = 'spip_' . $nom; $fdesc = &$tables_auxiliaires[$nom_sql]; } else { # table locale a cote de SPIP, comme non SPIP: $fdesc = array(); } } // faut il interpreter le prefixe 'spip_' ? $transposer_spip = ($nom_sql != $nom); // La *vraie* base a la priorite if (true /* !$bdesc OR !$bdesc['field'] */) { $desc = sql_showtable($nom_sql, $transposer_spip, $serveur); if (!$desc OR !$desc['field']) { if (!$fdesc) { spip_log("trouver_table: table inconnue '$serveur' '$nom'"); return null; } // on ne sait pas lire la structure de la table : // on retombe sur la description donnee dans les fichiers spip $desc = $fdesc; } } // S'il n'y a pas de key (cas d'une VIEW), // on va inventer une PRIMARY KEY en prenant le premier champ // de la table if (!$desc['key']){ $p = array_keys($desc['field']); $desc['key']['PRIMARY KEY'] = array_shift($p); } $desc['table']= $nom_sql; $desc['connexion']= $serveur; // objet_type peut provoquer un appel reentrant ici. // pour ne pas faire de boucle infinie, on stocke ce qu'on a deja trouve $connexion['tables'][$nom] = $desc; $table = table_objet(objet_type($nom)); $desc['titre'] = isset($GLOBALS['table_titre'][$table]) ? $GLOBALS['table_titre'][$table] : (isset($desc['field']['titre']) ? 'titre' : ''); $connexion['tables'][$nom] = $desc; // une nouvelle table a ete decrite // mettons donc a jour le cache des descriptions de ce serveur if (is_writeable(_DIR_CACHE)) ecrire_fichier($nom_cache_desc_sql[$serveur],serialize($connexion['tables'])); } $connexion['tables'][$nom]['id_table']=$nom; return $connexion['tables'][$nom]; }
function inc_recherche_to_array_dist($recherche, $options = array()) { // options par defaut $options = array_merge(array('score' => true, 'champs' => false, 'toutvoir' => false, 'matches' => false, 'jointures' => false), $options); include_spip('inc/rechercher'); include_spip('inc/autoriser'); $requete = array("SELECT" => array(), "FROM" => array(), "WHERE" => array(), "GROUPBY" => array(), "ORDERBY" => array(), "LIMIT" => "", "HAVING" => array()); $table = sinon($options['table'], 'article'); if ($options['champs']) { $champs = $options['champs']; } else { $l = liste_des_champs(); $champs = $l['article']; } $serveur = $options['serveur']; list($methode, $q, $preg) = expression_recherche($recherche, $options); $jointures = $options['jointures'] ? liste_des_jointures() : array(); $_id_table = id_table_objet($table); // c'est un pis-aller : ca a peu de chance de marcher, mais mieux quand meme que en conservant la ',' // (aka ca marche au moins dans certains cas comme avec spip_formulaires_reponses_champs) if (strpos($_id_table, ",") !== false) { $_id_table = explode(',', $_id_table); $_id_table = reset($_id_table); } $requete['SELECT'][] = "t." . $_id_table; $a = array(); // Recherche fulltext foreach ($champs as $champ => $poids) { if (is_array($champ)) { spip_log("requetes imbriquees interdites"); } else { if (strpos($champ, ".") === FALSE) { $champ = "t.{$champ}"; } $requete['SELECT'][] = $champ; $a[] = $champ . ' ' . $methode . ' ' . $q; } } if ($a) { $requete['WHERE'][] = join(" OR ", $a); } $requete['FROM'][] = table_objet_sql($table) . ' AS t'; $results = array(); $s = sql_select($requete['SELECT'], $requete['FROM'], $requete['WHERE'], implode(" ", $requete['GROUPBY']), $requete['ORDERBY'], $requete['LIMIT'], $requete['HAVING'], $serveur); while ($t = sql_fetch($s, $serveur) and (!isset($t['score']) or $t['score'] > 0)) { $id = intval($t[$_id_table]); if ($options['toutvoir'] or autoriser('voir', $table, $id)) { // indiquer les champs concernes $champs_vus = array(); $score = 0; $matches = array(); $vu = false; foreach ($champs as $champ => $poids) { $champ = explode('.', $champ); $champ = end($champ); // translitteration_rapide uniquement si on est deja en utf-8 $value = $GLOBALS['meta']['charset'] == 'utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ]); if ($n = $options['score'] || $options['matches'] ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER) : preg_match($preg, $value)) { $vu = true; if ($options['champs']) { $champs_vus[$champ] = $t[$champ]; } if ($options['score']) { $score += $n * $poids; } if ($options['matches']) { $matches[$champ] = $regs; } if (!$options['champs'] and !$options['score'] and !$options['matches']) { break; } } } if ($vu) { if (!isset($results)) { $results = array(); } $results[$id] = array(); if ($champs_vus) { $results[$id]['champs'] = $champs_vus; } if ($score) { $results[$id]['score'] = $score; } if ($matches) { $results[$id]['matches'] = $matches; } } } } // Gerer les donnees associees // ici on est un peu naze : pas capables de reconstruire une jointure complexe // on ne sait passer que par table de laison en 1 coup if (isset($jointures[$table]) and $joints = recherche_en_base($recherche, $jointures[$table], array_merge($options, array('jointures' => false)))) { include_spip('action/editer_liens'); $trouver_table = charger_fonction('trouver_table', 'base'); $cle_depart = id_table_objet($table); $table_depart = table_objet($table, $serveur); $desc_depart = $trouver_table($table_depart, $serveur); $depart_associable = objet_associable($table); foreach ($joints as $table_liee => $ids_trouves) { // on peut definir une fonction de recherche jointe pour regler les cas particuliers if (!($rechercher_joints = charger_fonction("rechercher_joints_{$table}_{$table_liee}", "inc", true) or $rechercher_joints = charger_fonction("rechercher_joints_objet_{$table_liee}", "inc", true) or $rechercher_joints = charger_fonction("rechercher_joints_{$table}_objet_lie", "inc", true))) { $cle_arrivee = id_table_objet($table_liee); $table_arrivee = table_objet($table_liee, $serveur); $desc_arrivee = $trouver_table($table_arrivee, $serveur); // cas simple : $cle_depart dans la table_liee if (isset($desc_arrivee['field'][$cle_depart])) { $s = sql_select("{$cle_depart}, {$cle_arrivee}", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); } elseif (isset($desc_depart['field'][$cle_arrivee])) { $s = sql_select("{$cle_depart}, {$cle_arrivee}", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); } elseif ($l = objet_associable($table_liee)) { list($primary, $table_liens) = $l; $s = sql_select("id_objet as {$cle_depart}, {$primary} as {$cle_arrivee}", $table_liens, array("objet='{$table}'", sql_in($primary, array_keys($ids_trouves))), '', '', '', '', $serveur); } elseif ($l = $depart_associable) { list($primary, $table_liens) = $l; $s = sql_select("{$primary} as {$cle_depart}, id_objet as {$cle_arrivee}", $table_liens, array("objet='{$table_liee}'", sql_in('id_objet', array_keys($ids_trouves))), '', '', '', '', $serveur); } elseif ($t = $trouver_table($table_arrivee . "_" . $table_depart, $serveur) or $t = $trouver_table($table_depart . "_" . $table_arrivee, $serveur)) { $s = sql_select("{$cle_depart},{$cle_arrivee}", $t["table_sql"], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); } } else { list($cle_depart, $cle_arrivee, $s) = $rechercher_joints($table, $table_liee, array_keys($ids_trouves), $serveur); } while ($t = is_array($s) ? array_shift($s) : sql_fetch($s)) { $id = $t[$cle_depart]; $joint = $ids_trouves[$t[$cle_arrivee]]; if (!isset($results)) { $results = array(); } if (!isset($results[$id])) { $results[$id] = array(); } if (isset($joint['score']) and $joint['score']) { if (!isset($results[$id]['score'])) { $results[$id]['score'] = 0; } $results[$id]['score'] += $joint['score']; } if (isset($joint['champs']) and $joint['champs']) { foreach ($joint['champs'] as $c => $val) { $results[$id]['champs'][$table_liee . '.' . $c] = $val; } } if (isset($joint['matches']) and $joint['matches']) { foreach ($joint['matches'] as $c => $val) { $results[$id]['matches'][$table_liee . '.' . $c] = $val; } } } } } return $results; }
function cextras_pre_edition($flux){ // recuperer les champs crees par les plugins if ($extras = cextras_get_extras_match($flux['args']['table'])) { // recherchons un eventuel prefixe utilise pour poster les champs $type = objet_type(table_objet($flux['args']['table'])); $prefixe = _request('prefixe_champs_extras_' . $type); if (!$prefixe) { $prefixe = ''; } foreach ($extras as $c) { if (_request('cextra_' . $prefixe . $c->champ)) { $extra = _request($prefixe . $c->champ); if (is_array($extra)) $extra = join(',',$extra); $flux['data'][$c->champ] = corriger_caracteres($extra); } } } return $flux; }
/** * Charger l'env du squelette de #FORMULAIRE_FORUM * @param string $objet * @param int $id_objet * @param int $id_forum * @param int|array $ajouter_mot * mots ajoutés cochés par defaut * @param $ajouter_groupe * groupes ajoutables * @param $afficher_previsu * previsu oui ou non * @param $retour * url de retour * @return array|bool */ function formulaires_forum_charger_dist($objet, $id_objet, $id_forum, $ajouter_mot, $ajouter_groupe, $afficher_previsu, $retour) { if (!function_exists($f = 'forum_recuperer_titre')) { $f = 'forum_recuperer_titre_dist'; } if (!($titre = $f($objet, $id_objet, $id_forum))) { return false; } // ca s'apparenterait presque a une autorisation... // si on n'avait pas a envoyer la valeur $accepter_forum au formulaire $accepter_forum = controler_forum($objet, $id_objet); if ($accepter_forum == 'non') { return false; } $primary = id_table_objet($objet); // table a laquelle sont associes les mots : if ($GLOBALS['meta']["mots_cles_forums"] != "oui") { $table = ''; } else { $table = table_objet($objet); } // exiger l'authentification des posteurs pour les forums sur abo if ($accepter_forum == "abo") { if (!isset($GLOBALS["visiteur_session"]['statut']) or !$GLOBALS["visiteur_session"]['statut']) { return array('action' => '', 'editable' => false, 'login_forum_abo' => ' ', 'inscription' => generer_url_public('identifiants', 'lang=' . $GLOBALS['spip_lang']), 'oubli' => generer_url_public('spip_pass', 'lang=' . $GLOBALS['spip_lang'], true)); } } // Tableau des valeurs servant au calcul d'une signature de securite. // Elles seront placees en Input Hidden pour que inc/forum_insert // recalcule la meme chose et verifie l'identite des resultats. // Donc ne pas changer la valeur de ce tableau entre le calcul de // la signature et la fabrication des Hidden // Faire attention aussi a 0 != '' $ids = array(); $ids[$primary] = ($x = intval($id_objet)) ? $x : ''; $ids['id_objet'] = ($x = intval($id_objet)) ? $x : ''; $ids['objet'] = $objet; $ids['id_forum'] = ($x = intval($id_forum)) ? $x : ''; // ne pas mettre '', sinon le squelette n'affichera rien. $previsu = ' '; if (_request('formulaire_action')) { $arg = forum_fichier_tmp(join('', $ids)); $securiser_action = charger_fonction('securiser_action', 'inc'); // on sait que cette fonction est dans le fichier associe $hash = calculer_action_auteur("ajout_forum-{$arg}"); } else { $arg = $hash = ''; } // pour les hidden $script_hidden = ""; foreach ($ids as $id => $v) { $script_hidden .= "<input type='hidden' name='{$id}' value='{$v}' />"; } $script_hidden .= "<input type='hidden' name='arg' value='{$arg}' />"; $script_hidden .= "<input type='hidden' name='hash' value='{$hash}' />"; $script_hidden .= "<input type='hidden' name='verif_{$hash}' value='ok' />"; if ($formats = forum_documents_acceptes()) { include_spip('inc/securiser_action'); $cle = calculer_cle_action('ajouter-document-' . $objet . '-' . $id_objet); } else { $cle = null; } // Valeurs par defaut du formulaire // si le formulaire a ete sauvegarde, restituer les valeurs de session $vals = array('titre' => $titre, 'texte' => '', 'nom_site' => '', 'url_site' => 'http://'); return array_merge($vals, array('modere' => $accepter_forum != 'pri' ? '' : ' ', 'table' => $table, 'config' => array('afficher_barre' => $GLOBALS['meta']['forums_afficher_barre'] != 'non' ? ' ' : ''), '_hidden' => $script_hidden, 'cle_ajouter_document' => $cle, 'formats_documents_forum' => forum_documents_acceptes(), 'ajouter_document' => isset($_FILES['ajouter_document']['name']) ? $_FILES['ajouter_document']['name'] : '', 'nobot' => $cle ? _request($cle) : _request('nobot'), 'ajouter_groupe' => $ajouter_groupe, 'ajouter_mot' => is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot), 'id_forum' => $id_forum, '_sign' => implode('_', $ids), '_autosave_id' => $ids)); }
/** * Autorisation de changer la date d'un contenu * * @param string $faire Action demandée * @param string $type Type d'objet sur lequel appliquer l'action * @param int $id Identifiant de l'objet * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon **/ function autoriser_dater_dist($faire, $type, $id, $qui, $opt) { if (!isset($opt['statut'])) { $table = table_objet($type); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table); if (!$desc) { return false; } if (isset($desc['field']['statut'])) { $statut = sql_getfetsel("statut", $desc['table'], id_table_objet($type) . "=" . intval($id)); } else { $statut = 'publie'; } // pas de statut => publie } else { $statut = $opt['statut']; } if ($statut == 'publie' or $statut == 'prop' and $type == 'article' and $GLOBALS['meta']["post_dates"] == "non") { return autoriser('modifier', $type, $id); } return false; }
/** * Determininer si un objet est publie ou non * * On se base pour cela sur sa declaration de statut * pour des cas particuliers non declarables, on permet de fournir une fonction * base_xxxx_test_si_publie qui sera appele par la fonction * * @param string $objet * @param int $id_objet * @param string $serveur * @return bool */ function objet_test_si_publie($objet, $id_objet, $serveur = '') { // voir si une fonction est definie pour faire le boulot // elle a la priorite dans ce cas if ($f = charger_fonction($objet . "_test_si_publie", "base", true)) { return $f($objet, $id_objet, $serveur); } // sinon on se fie a la declaration de l'objet si presente $id_table = $table_objet = table_objet($objet); $id_table_objet = id_table_objet($objet, $serveur); $trouver_table = charger_fonction('trouver_table', 'base'); if ($desc = $trouver_table($table_objet, $serveur) and isset($desc['statut']) and $desc['statut']) { $boucle = new Boucle(); $boucle->show = $desc; $boucle->nom = 'objet_test_si_publie'; $boucle->id_boucle = $id_table; $boucle->id_table = $id_table; $boucle->sql_serveur = $serveur; $boucle->select[] = $id_table_objet; $boucle->from[$table_objet] = table_objet_sql($objet, $serveur); $boucle->where[] = $id_table . "." . $id_table_objet . '=' . intval($id_objet); include_spip('public/compiler'); include_spip('public/composer'); instituer_boucle($boucle, false); $res = calculer_select($boucle->select, $boucle->from, $boucle->from_type, $boucle->where, $boucle->join, $boucle->group, $boucle->order, $boucle->limit, $boucle->having, $table_objet, $id_table, $serveur); if (sql_fetch($res)) { return true; } return false; } // si pas d'info statut ni de fonction : l'objet est publie return true; }
function get_table_id($table) { static $catab = array('tables_principales' => 'base/serial', 'tables_auxiliaires' => 'base/auxiliaires'); $try = array($table, 'spip_' . $table); foreach ($catab as $categ => $catinc) { include_spip($catinc); foreach ($try as $nom) { if (isset($GLOBALS[$categ][$nom])) { return array($nom, preg_split('/\\s*,\\s*/', $GLOBALS[$categ][$nom]['key']['PRIMARY KEY'])); } } } if ($try = table_objet($table)) { return array('spip_' . $try, array(id_table_objet($table))); } return array(false, false); }