/**
 * À 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;
}
Beispiel #2
0
/**
 * 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;
}
Beispiel #3
0
/**
 * 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;
}
Beispiel #4
0
/**
 * 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);
}
Beispiel #5
0
/**
 * 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;
}
Beispiel #6
0
/**
 * 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'));
    }
}
Beispiel #8
0
/**
 * 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;
}
Beispiel #10
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));
}
/**
 * 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;
}
Beispiel #12
0
/**
 * 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;
}
Beispiel #14
0
/**
 * 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);
}