Exemplo n.º 1
0
/**
 * 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
}
Exemplo n.º 2
0
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'));
    }
}
Exemplo n.º 3
0
/**
 * 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'));
    }
}
Exemplo n.º 5
0
/**
 * 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));
}