/** * À chaque insertion d'un nouvel objet editorial * auquel on a attaché des documents, restituer l'identifiant * du nouvel objet crée sur les liaisons documents/objet, * qui ont ponctuellement un identifiant id_objet négatif. * * @see medias_affiche_gauche() * @pipeline post_insertion * * @param array $flux * Données du pipeline * @return array * Données du pipeline **/ function medias_post_insertion($flux) { $objet = objet_type($flux['args']['table']); $id_objet = $flux['args']['id_objet']; include_spip('inc/autoriser'); if (autoriser('joindredocument', $objet, $id_objet) and $id_auteur = intval($GLOBALS['visiteur_session']['id_auteur'])) { # cf. HACK medias_affiche_gauche() # rattrapper les documents associes a cet objet nouveau # ils ont un id = 0-id_auteur # utiliser l'api editer_lien pour les appels aux pipeline edition_lien include_spip('action/editer_liens'); $liens = objet_trouver_liens(array('document' => '*'), array($objet => 0 - $id_auteur)); foreach ($liens as $lien) { objet_associer(array('document' => $lien['document']), array($objet => $id_objet), $lien); } // un simple delete pour supprimer les liens temporaires sql_delete("spip_documents_liens", array("id_objet = " . (0 - $id_auteur), "objet=" . sql_quote($objet))); } return $flux; }
/** * Lister les id objet_source associés à l'objet id_objet * via la table de lien objet_lien * * Utilisé pour les listes de #FORMULAIRE_EDITER_LIENS * * @param string $objet_source * @param string $objet * @param int $id_objet * @param string $objet_lien * @return array */ function lister_objets_lies($objet_source, $objet, $id_objet, $objet_lien) { include_spip('action/editer_liens'); $l = array(); // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source if ($objet_lien == $objet and $objet_lien !== $objet_source) { $res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*')); } else { $res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet)); } while ($row = array_shift($res)) { $l[] = $row[$objet_source]; } return $l; }
/** * Traiter le post des informations d'édition de liens * * Les formulaires postent dans trois variables ajouter_lien et supprimer_lien * et remplacer_lien * * Les deux premieres peuvent etre de trois formes differentes : * ajouter_lien[]="objet1-id1-objet2-id2" * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi" * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2" * Dans ce dernier cas, la valeur ne sera prise en compte * que si _request('clenonnumerique') est vrai (submit associe a l'input) * * remplacer_lien doit etre de la forme * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2" * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute * * @param string $a * @param string|int $b * @param int|string $c * @param bool $editable * @return array */ function formulaires_editer_liens_traiter_dist($a, $b, $c, $editable = true) { $res = array('editable' => $editable ? true : false); list($table_source, $objet, $id_objet, $objet_lien) = determine_source_lien_objet($a, $b, $c); if (!$table_source or !$objet or !$objet_lien) { return $res; } if (_request('tout_voir')) { set_request('recherche', ''); } if (autoriser('modifier', $objet, $id_objet)) { // annuler les suppressions du coup d'avant ! if (_request('annuler_oups') and $oups = _request('_oups') and $oups = unserialize($oups)) { $objet_source = objet_type($table_source); include_spip('action/editer_liens'); foreach ($oups as $oup) { if ($objet_lien == $objet_source) { objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup); } else { objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup); } } # oups ne persiste que pour la derniere action, si suppression set_request('_oups'); } $supprimer = _request('supprimer_lien'); $ajouter = _request('ajouter_lien'); // il est possible de preciser dans une seule variable un remplacement : // remplacer_lien[old][new] if ($remplacer = _request('remplacer_lien')) { foreach ($remplacer as $k => $v) { if ($old = lien_verifier_action($k, '')) { foreach (is_array($v) ? $v : array($v) as $kn => $vn) { if ($new = lien_verifier_action($kn, $vn)) { $supprimer[$old] = 'x'; $ajouter[$new] = '+'; } } } } } if ($supprimer) { include_spip('action/editer_liens'); $oups = array(); foreach ($supprimer as $k => $v) { if ($lien = lien_verifier_action($k, $v)) { $lien = explode("-", $lien); list($objet_source, $ids, $objet_lie, $idl) = $lien; if ($objet_lien == $objet_source) { $oups = array_merge($oups, objet_trouver_liens(array($objet_source => $ids), array($objet_lie => $idl))); objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl)); } else { $oups = array_merge($oups, objet_trouver_liens(array($objet_lie => $idl), array($objet_source => $ids))); objet_dissocier(array($objet_lie => $idl), array($objet_source => $ids)); } } } set_request('_oups', $oups ? serialize($oups) : null); } if ($ajouter) { $ajout_ok = false; include_spip('action/editer_liens'); foreach ($ajouter as $k => $v) { if ($lien = lien_verifier_action($k, $v)) { $ajout_ok = true; list($objet1, $ids, $objet2, $idl) = explode("-", $lien); if ($objet_lien == $objet1) { objet_associer(array($objet1 => $ids), array($objet2 => $idl)); } else { objet_associer(array($objet2 => $idl), array($objet1 => $ids)); } set_request('id_lien_ajoute', $ids); } } # oups ne persiste que pour la derniere action, si suppression # une suppression suivie d'un ajout dans le meme hit est un remplacement # non annulable ! if ($ajout_ok) { set_request('_oups'); } } } return $res; }
/** * Lorsqu'un champ versionée est une jointure, récuperer tous les liens * et les mettre sous forme de liste énumérée * * @param string $objet * @param string $id_objet * @param string $jointure * @return string */ function recuperer_valeur_champ_jointure($objet, $id_objet, $jointure) { $objet_joint = objet_type($jointure); include_spip('action/editer_liens'); $v = array(); if (objet_associable($objet_joint)) { $liens = objet_trouver_liens(array($objet_joint => '*'), array($objet => $id_objet)); foreach ($liens as $l) { $v[] = $l[$objet_joint]; } } elseif (objet_associable($objet)) { $liens = objet_trouver_liens(array($objet => $id_objet), array($objet_joint => '*')); foreach ($liens as $l) { $v[] = $l[$objet]; } } sort($v); return implode(",", $v); }
/** * Optimiser la base de donnee en supprimant les forums orphelins * * @param int $n * @return int */ function forum_optimiser_base_disparus($flux) { $n =& $flux['data']; $mydate = $flux['args']['date']; # les forums lies a une id_objet inexistant $r = sql_select("DISTINCT objet", 'spip_forum'); while ($t = sql_fetch($r)) { if ($type = $t['objet']) { $spip_table_objet = table_objet_sql($type); $id_table_objet = id_table_objet($type); # les forums lies a un objet inexistant $res = sql_select("forum.id_forum AS id", "spip_forum AS forum\n\t\t\t\t\t\t\t\tLEFT JOIN {$spip_table_objet} AS O\n\t\t\t\t\t\t\t\t\tON O.{$id_table_objet}=forum.id_objet", "forum.objet=" . sql_quote($type) . " AND O.{$id_table_objet} IS NULL AND forum.id_objet>0"); $n += optimiser_sansref('spip_forum', 'id_forum', $res); } } // // Forums // sql_delete("spip_forum", "statut='redac' AND maj < {$mydate}"); // nettoyer les documents des forums en spam&poubelle pour eviter de sortir des quota disques // bizarrement on ne nettoie jamais les messages eux meme ? include_spip('action/editer_liens'); if (objet_associable('document')) { $res = sql_select('L.id_document,F.id_forum', "spip_documents_liens AS L JOIN spip_forum AS F ON (F.id_forum=L.id_objet AND L.objet='forum')", "F.statut IN ('off','spam')"); while ($row = sql_fetch($res)) { include_spip('inc/autoriser'); // si un seul lien (ce forum donc), on supprime le document // si un document est attache a plus d'un forum, c'est un cas bizarre ou gere a la main // on ne touche a rien ! if (count(objet_trouver_liens(array('document' => $row['id_document']), '*')) == 1) { autoriser_exception('supprimer', 'document', $row['id_document']); if ($supprimer_document = charger_fonction('supprimer_document', 'action', true)) { $supprimer_document($row['id_document']); } } } } // // CNIL -- Informatique et libertes // // masquer le numero IP des vieux forums // ## date de reference = 4 mois ## definir a 0 pour desactiver if (!defined('_CNIL_PERIODE')) { define('_CNIL_PERIODE', 3600 * 24 * 31 * 4); } if (_CNIL_PERIODE) { $critere_cnil = 'date_heure<"' . date('Y-m-d', time() - _CNIL_PERIODE) . '"' . ' AND statut != "spam"' . ' AND (ip LIKE "%.%" OR ip LIKE "%:%")'; # ipv4 ou ipv6 $c = sql_countsel('spip_forum', $critere_cnil); if ($c > 0) { spip_log("CNIL: masquer IP de {$c} forums anciens"); sql_update('spip_forum', array('ip' => 'MD5(ip)'), $critere_cnil); } } return $flux; }
/** * Lister des rôles présents sur une liaion, pour un objet sur un autre, * classés par identifiant de l'objet * * Lister les id objet_source associés à l'objet id_objet * via la table de lien objet_lien, et groupe cette liste * par identifiant (la clé) et ses roles attribués (tableau de valeur) * * On retourne cette liste dans l'index 'ids' et la description des roles * pour la liaison dans l'index 'roles' pour éviter le le faire recalculer * aux fonctions utilisant celle ci. * * @param string $objet_source Objet dont on veut récupérer la liste des identifiants * @param string $objet Objet sur lequel est liée la source * @param int $id_objet Identifiant d'objet sur lequel est liée la source * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) * @return array|bool * - Tableau d'index * - roles : tableau de description des roles, * - ids : tableau des identifiants / roles. * - False si pas de role déclarés */ function roles_presents_liaisons($objet_source, $objet, $id_objet, $objet_lien) { static $done = array(); // stocker le résultat $hash = "{$objet_source}-{$objet}-{$id_objet}-{$objet_lien}"; if (isset($done[$hash])) { return $done[$hash]; } // pas de roles sur ces objets, on sort $roles = roles_presents($objet_lien, $objet_lien == $objet ? $objet_source : $objet); if (!$roles) { return $done[$hash] = false; } // inspiré de lister_objets_lies() if ($objet_lien == $objet) { $res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*')); } else { $res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet)); } // types de roles possibles $roles_possibles = $roles['roles']['choix']; // colonne du role $colonne = $roles['colonne']; // on recupere par id, et role existant $ids = array(); while ($row = array_shift($res)) { $id = $row[$objet_source]; if (!isset($ids[$id])) { $ids[$id] = array(); } // tableau des roles présents $ids[$id][] = $row[$colonne]; } return $done[$hash] = array('roles' => $roles, 'ids' => $ids); }
/** * 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')); } }
/** * Traiter le post des informations d'édition de liens * * Les formulaires peuvent poster dans quatre variables * - ajouter_lien et supprimer_lien * - remplacer_lien * - qualifier_lien * * Les deux premières peuvent être de trois formes différentes : * ajouter_lien[]="objet1-id1-objet2-id2" * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi" * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2" * Dans ce dernier cas, la valeur ne sera prise en compte * que si _request('clenonnumerique') est vrai (submit associé a l'input) * * remplacer_lien doit être de la forme * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2" * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute * * qualifier_lien doit être de la forme, et sert en complément de ajouter_lien * qualifier_lien[objet1-id1-objet2-id2][role] = array("role1", "autre_role") * qualifier_lien[objet1-id1-objet2-id2][valeur] = array("truc", "chose") * produira 2 liens chacun avec array("role"=>"role1","valeur"=>"truc") et array("role"=>"autre_role","valeur"=>"chose") * * @param string $a * @param string|int $b * @param int|string $c * @param array|bool $options * - Si array, tableau d'options * - Si bool : valeur de l'option 'editable' uniquement * * @return array */ function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = array()) { // compat avec ancienne signature ou le 4eme argument est $editable if (!is_array($options)) { $options = array('editable' => $options); } elseif (!isset($options['editable'])) { $options['editable'] = true; } $editable = $options['editable']; $res = array('editable' => $editable ? true : false); list($table_source, $objet, $id_objet, $objet_lien) = determine_source_lien_objet($a, $b, $c); if (!$table_source or !$objet or !$objet_lien) { return $res; } if (_request('tout_voir')) { set_request('recherche', ''); } include_spip('inc/autoriser'); if (autoriser('modifier', $objet, $id_objet)) { // annuler les suppressions du coup d'avant ! if (_request('annuler_oups') and $oups = _request('_oups') and $oups = unserialize($oups)) { if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", "action", true)) { $oups_objets($oups); } else { $objet_source = objet_type($table_source); include_spip('action/editer_liens'); foreach ($oups as $oup) { if ($objet_lien == $objet_source) { objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup); } else { objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup); } } } # oups ne persiste que pour la derniere action, si suppression set_request('_oups'); } $supprimer = _request('supprimer_lien'); $ajouter = _request('ajouter_lien'); // il est possible de preciser dans une seule variable un remplacement : // remplacer_lien[old][new] if ($remplacer = _request('remplacer_lien')) { foreach ($remplacer as $k => $v) { if ($old = lien_verifier_action($k, '')) { foreach (is_array($v) ? $v : array($v) as $kn => $vn) { if ($new = lien_verifier_action($kn, $vn)) { $supprimer[$old] = 'x'; $ajouter[$new] = '+'; } } } } } if ($supprimer) { if ($supprimer_objets = charger_fonction("editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}", "action", true)) { $oups = $supprimer_objets($supprimer); } else { include_spip('action/editer_liens'); $oups = array(); foreach ($supprimer as $k => $v) { if ($lien = lien_verifier_action($k, $v)) { $lien = explode("-", $lien); list($objet_source, $ids, $objet_lie, $idl, $role) = $lien; // appliquer une condition sur le rôle si défini ('*' pour tous les roles) $cond = !is_null($role) ? array('role' => $role) : array(); if ($objet_lien == $objet_source) { $oups = array_merge($oups, objet_trouver_liens(array($objet_source => $ids), array($objet_lie => $idl), $cond)); objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl), $cond); } else { $oups = array_merge($oups, objet_trouver_liens(array($objet_lie => $idl), array($objet_source => $ids), $cond)); objet_dissocier(array($objet_lie => $idl), array($objet_source => $ids), $cond); } } } } set_request('_oups', $oups ? serialize($oups) : null); } if ($ajouter) { if ($ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", "action", true)) { $ajout_ok = $ajouter_objets($ajouter); } else { $ajout_ok = false; include_spip('action/editer_liens'); foreach ($ajouter as $k => $v) { if ($lien = lien_verifier_action($k, $v)) { $ajout_ok = true; list($objet1, $ids, $objet2, $idl) = explode("-", $lien); $qualifs = lien_retrouver_qualif($objet_lien, $lien); if ($objet_lien == $objet1) { lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs); } else { lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs); } set_request('id_lien_ajoute', $ids); } } } # oups ne persiste que pour la derniere action, si suppression # une suppression suivie d'un ajout dans le meme hit est un remplacement # non annulable ! if ($ajout_ok) { set_request('_oups'); } } } return $res; }
/** * Fonction d'autorisation interne à la fonction restreindre_extras() * spécifique au test de la présence d'un mot lié * * @param string $objet * Objet possédant les extras * @param int $id_objet * Identifiant de l'objet possédant les extras * @param array $opt * Options des autorisations * @param mixed $ids * Identifiant(s) des mots sur lesquels s'appliquent les champs * @param bool $recursif * Inutile, la récursivité est prise en charge par compositions_determiner() * @return bool * Autorisé ou non */ function inc_restreindre_extras_objet_sur_mot_dist($objet, $id_objet, $opt, $ids, $recursif) { include_spip('action/editer_liens'); $liens = objet_trouver_liens(array('mot' => $ids), array($objet => $id_objet)); if (count($liens)) { return true; } return false; }
/** * Marquer un message dans l'etat indique par $vu * * @param int $id_auteur * @param array $liste * @param string $vu * @return void */ function messagerie_marquer_message($id_auteur, $liste, $vu) { include_spip('action/editer_liens'); if (!is_array($liste)) { $liste = array($liste); } // completer les liens qui n'existent pas encore // ex : pour marquer lue une annonce, on ajoute le lien d'abord (n'existe pas) // puis on le marque 'oui' $liens = objet_trouver_liens(array('auteur' => $id_auteur), array('message' => $liste)); $l = array(); foreach ($liens as $lien) { $l[] = $lien['message']; } objet_associer(array('auteur' => $id_auteur), array('message' => array_diff($liste, $l)), array('vu' => $vu)); // puis les marquer tous lus objet_qualifier_liens(array('auteur' => $id_auteur), array('message' => $liste), array('vu' => $vu)); include_spip('inc/invalideur'); suivre_invalideur("message/" . implode(',', $liste)); }
/** * Dupliquer tous les liens entrant ou sortants d'un objet * vers un autre (meme type d'objet, mais id different) * si $types est fourni, seuls les liens depuis/vers les types listes seront copies * si $exclure_types est fourni, les liens depuis/vers les types listes seront ignores * * @api * @param string $objet * @param int $id_source * @param int $id_cible * @param array $types * @param array $exclure_types * @return int * Nombre de liens copiés */ function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $exclure_types = null) { include_spip('base/objets'); $tables = lister_tables_objets_sql(); $n = 0; foreach ($tables as $table_sql => $infos) { if ((is_null($types) or in_array($infos['type'], $types)) and (is_null($exclure_types) or !in_array($infos['type'], $exclure_types))) { if (objet_associable($infos['type'])) { $liens = $infos['type'] == $objet ? objet_trouver_liens(array($objet => $id_source), '*') : objet_trouver_liens(array($infos['type'] => '*'), array($objet => $id_source)); foreach ($liens as $lien) { $n++; if ($infos['type'] == $objet) { objet_associer(array($objet => $id_cible), array($lien['objet'] => $lien[$lien['objet']]), $lien); } else { objet_associer(array($infos['type'] => $lien[$infos['type']]), array($objet => $id_cible), $lien); } } } } } return $n; }
/** * Lister les id objet_source associés à l'objet id_objet * via la table de lien objet_lien * * Utilisé pour les listes de #FORMULAIRE_EDITER_LIENS * * @param string $objet_source * @param string $objet * @param int $id_objet * @param string $objet_lien * @return array */ function lister_objets_lies($objet_source, $objet, $id_objet, $objet_lien) { include_spip('action/editer_liens'); $l = array(); if ($objet_lien == $objet) { $res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*')); } else { $res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet)); } while ($row = array_shift($res)) { $l[] = $row[$objet_source]; } return $l; }
/** * Supprimer les traitements lorsqu'on supprime un logo * * @pipeline formulaire_traiter * @param array $flux Données du pipeline * @return array Données du pipeline */ function massicot_formulaire_traiter($flux) { if ($flux['args']['form'] === 'editer_logo' and _request('supprimer_logo_on')) { include_spip('base/abstract_sql'); include_spip('action/editer_liens'); $objet = $flux['args']['args'][0]; $id_objet = $flux['args']['args'][1]; $massicotages = objet_trouver_liens(array('massicotage' => '*'), array($objet => $id_objet)); $id_massicotages = array_map(function ($el) { return $el['id_massicotage']; }, $massicotages); sql_delete('spip_massicotages', sql_in('id_massicotage', $id_massicotages)); sql_delete('spip_massicotages_liens', sql_in('id_massicotage', $id_massicotages)); } return $flux; }
/** * Revision des parents d'un document * chaque parent est liste au format objet|id_objet * * @param int $id_document * @param array $parents * @param bool $ajout */ function medias_revision_document_parents($id_document, $parents = null, $ajout = false) { if (!is_array($parents)) { return; } $insertions = array(); $objets_parents = array(); // array('article'=>array(12,23)) // au format objet|id_objet foreach ($parents as $p) { $p = explode('|', $p); if (preg_match('/^[a-z0-9_]+$/i', $objet = $p[0]) and $p[1] = intval($p[1])) { // securite $objets_parents[$p[0]][] = $p[1]; } } include_spip('action/editer_liens'); // les liens actuels $liens = objet_trouver_liens(array('document' => $id_document), '*'); $deja_parents = array(); // si ce n'est pas un ajout, il faut supprimer les liens actuels qui ne sont pas dans $objets_parents if (!$ajout) { foreach ($liens as $k => $lien) { if (!isset($objets_parents[$lien['objet']]) or !in_array($lien['id_objet'], $objets_parents[$lien['objet']])) { objet_dissocier(array('document' => $id_document), array($lien['objet'] => $lien['id_objet'])); unset($liens[$k]); } else { $deja_parents[$lien['objet']][] = $lien['id_objet']; } } } objet_associer(array('document' => $id_document), $objets_parents); }