/** * Associer un ou des objets à des objets listés * * `$objets_source` et `$objets_lies` sont de la forme * `array($objet=>$id_objets,...)` * `$id_objets` peut lui même être un scalaire ou un tableau pour une liste d'objets du même type * ou de la forme `array("NOT", $id_objets)` pour une sélection par exclusion * * Les objets sources sont les pivots qui portent les liens * et pour lesquels une table spip_xxx_liens existe * (auteurs, documents, mots) * * On peut passer optionnellement une qualification du (des) lien(s) qui sera * alors appliquée dans la foulée. * En cas de lot de liens, c'est la même qualification qui est appliquée a tous * * @api * @param array $objets_source * @param array|string $objets_lies * @param array $qualif * @return bool|int */ function objet_associer($objets_source, $objets_lies, $qualif = null) { $modifs = objet_traiter_liaisons('lien_insert', $objets_source, $objets_lies, $qualif); if ($qualif) { objet_qualifier_liens($objets_source, $objets_lies, $qualif); } return $modifs; // pas d'erreur }
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')); } }
/** * Qualifier le lien d'un auteur avec les objets listes * array($objet=>$id_objets,...) * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type * * exemple : * $c = array('vu'=>'oui'); * un * pour $id_auteur,$objet,$id_objet permet de traiter par lot * * @param int $id_auteur * @param array $objets * @param array $qualif * @return bool|int */ function auteur_qualifier($id_auteur, $objets, $qualif) { include_spip('action/editer_liens'); return objet_qualifier_liens(array('auteur' => $id_auteur), $objets, $qualif); }
/** * 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')); } }
/** * 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)); }