function formulaires_editer_mot_article_traiter_dist($id_article = 'new', $id_groupe = '', $retour = '')
{
    $message = array('editable' => true, 'message_ok' => '');
    $id_mot_ancien = sql_getfetsel('mot.id_mot', 'spip_mots as mot left join spip_mots_liens as mots_liens ON (mot.id_mot=mots_liens.id_mot)', 'mots_liens.id_objet=' . intval($id_article) . ' AND mots_liens.objet = "article" AND mot.id_groupe=' . intval($id_groupe));
    include_spip('action/editer_liens');
    // si aucun mot selectionne on delie le mot de ce groupe
    if (!($id_mot = _request('id_mot'))) {
        objet_dissocier(array("mot" => $id_mot_ancien), array("article" => $id_article));
    } else {
        if ($id_mot_ancien != $id_mot) {
            // on delie l'ancien mot
            objet_dissocier(array("mot" => $id_mot_ancien), array("article" => $id_article));
            // on lie le nouveau
            objet_associer(array("mot" => $id_mot), array("article" => $id_article));
        }
    }
    // on invalide le cache
    include_spip('inc/invalideur');
    suivre_invalideur("id='id_article/{$id_article}'");
    if ($retour) {
        include_spip('inc/headers');
        $message .= redirige_formulaire($retour);
    }
    return $message;
}
示例#2
0
/**
 * 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);
    }
}
示例#3
0
function inc_profils_fusionner_dist($id_auteur, $id_import)
{
    spip_log($s = "Fusion auteur #{$id_import} => #{$id_auteur}", "profils" . _LOG_INFO_IMPORTANTE);
    // dupliquer les liens
    include_spip('action/editer_liens');
    objet_dupliquer_liens('auteur', $id_import, $id_auteur);
    // supprimer les liens
    objet_dissocier(array('auteur' => $id_import), '*');
    objet_dissocier('*', array('auteur' => $id_import));
    // changer le id_auteur dans toutes les tables qui en ont un
    $tables = lister_tables_objets_sql();
    foreach ($tables as $table_sql => $desc) {
        if (isset($desc['field']['id_auteur'])) {
            spip_log("{$table_sql} : id_auteur #{$id_import} => #{$id_auteur}", "profils" . _LOG_INFO_IMPORTANTE);
            sql_updateq($table_sql, array('id_auteur' => $id_auteur), 'id_auteur=' . intval($id_import));
        }
    }
    // log/poubelle sur l'import
    $log = date('Y-m-d H:i:s') . ' par #' . $GLOBALS['visiteur_session']['id_auteur'] . ' : ' . $s . "\n";
    $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_import));
    $set = array("statut" => "5poubelle", "email" => $auteur['email'] . "-xxdoublon", "login" => $auteur['login'] . "-xxdoublon", 'log' => $auteur['log'] . $log);
    sql_updateq("spip_auteurs", $set, "id_auteur=" . intval($auteur['id_auteur']));
    // log sur le nouveau
    $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
    $set = array('log' => $auteur['log'] . $log);
    sql_updateq("spip_auteurs", $set, "id_auteur=" . intval($auteur['id_auteur']));
}
/**
 * Action pour dissocier 2 objets entre eux
 *
 * L'argument attendu est `objet1-id1-objet2-id2` (type d'objet, identifiant)
 * tel que `mot-7-rubrique-3`.
 *
 * @uses objet_dissocier()
 *
 * @param null|string $arg
 *     Clé des arguments. En absence utilise l'argument
 *     de l'action sécurisée.
 * @return void
 */
function action_supprimer_lien_dist($arg = null)
{
    if (is_null($arg)) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $arg = $securiser_action();
    }
    $arg = explode("-", $arg);
    list($objet_source, $ids, $objet_lie, $idl) = $arg;
    include_spip('action/editer_liens');
    objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl));
}
function action_supprimer_document_dist($id_document = 0)
{
    if (!$id_document) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $id_document = $securiser_action();
    }
    include_spip('inc/autoriser');
    if (!autoriser('supprimer', 'document', $id_document)) {
        spip_log("Echec : Suppression document {$id_document} interdite", _LOG_ERREUR);
        return false;
    }
    // si c'etait une vignette, modifier le document source !
    if ($source = sql_getfetsel('id_document', 'spip_documents', 'id_vignette=' . intval($id_document))) {
        include_spip('action/editer_document');
        document_modifier($source, array("id_vignette" => 0));
    }
    include_spip('inc/documents');
    if (!($doc = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($id_document)))) {
        spip_log("Echec : Suppression document {$id_document} : le document n'existe pas en base", _LOG_ERREUR);
        return false;
    }
    spip_log("Suppression du document {$id_document} (" . $doc['fichier'] . ")");
    include_spip('action/editer_liens');
    // Si c'est un document ayant une vignette, supprimer aussi la vignette
    if ($doc['id_vignette']) {
        action_supprimer_document_dist($doc['id_vignette']);
        objet_dissocier(array('document' => $doc['id_vignette']), '*');
    }
    // Si c'est un document ayant des documents annexes (sous-titre, ...)
    // les supprimer aussi
    $annexes = array_map('reset', sql_allfetsel("id_document", "spip_documents_liens", "objet='document' AND id_objet=" . intval($id_document)));
    foreach ($annexes as $id) {
        action_supprimer_document_dist($id);
    }
    // dereferencer dans la base
    objet_dissocier(array('document' => $id_document), '*', array('role' => '*'));
    sql_delete('spip_documents', 'id_document=' . intval($id_document));
    // Supprimer le fichier si le doc est local,
    // et la copie locale si le doc est distant
    if ($doc['distant'] == 'oui') {
        include_spip('inc/distant');
        if ($local = _DIR_RACINE . copie_locale($doc['fichier'], 'test')) {
            spip_unlink($local);
        }
    } else {
        spip_unlink(get_spip_doc($doc['fichier']));
    }
    pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'action' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $id_document, 'document' => $doc), 'data' => null));
    return true;
}
示例#6
0
/**
 * Dissocier un auteur des objets listes sous forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * un * pour $id_auteur,$objet,$id_objet permet de traiter par lot
 *
 * @param int $id_auteur
 * @param array $objets
 * @return string
 */
function auteur_dissocier($id_auteur, $objets)
{
    include_spip('action/editer_liens');
    return objet_dissocier(array('auteur' => $id_auteur), $objets);
}
示例#7
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;
}
示例#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;
}
示例#9
0
/**
 * Dossocier un mot des objets listes sous forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * un * pour $id_mot,$objet,$id_objet permet de traiter par lot
 *
 * @param int $id_mot
 * @param array $objets
 * @return string
 */
function mot_dissocier($id_mot, $objets)
{
    include_spip('action/editer_liens');
    return objet_dissocier(array('mot' => $id_mot), $objets);
}
示例#10
0
/**
 * Supprimer une zone
 *
 * @param int $id_zone
 * @return int
 */
function zone_supprimer($id_zone)
{
    include_spip('action/editer_liens');
    objet_dissocier(array('zone' => $id_zone), array('*' => '*'));
    // puis la zone
    sql_delete("spip_zones", "id_zone=" . intval($id_zone));
    $id_zone = 0;
    return $id_zone;
}
function csv2auteurs_supprimer_auteurs($Tid, $statut, $traitement = "supprimer_articles", $id_rubrique_archive = 1)
{
    // passage à la poubelle
    $objet = 'auteur';
    $set = array('statut' => '5poubelle');
    foreach ($Tid as $id) {
        $Tarticles = sql_allfetsel('id_objet', 'spip_auteurs_liens', array('id_auteur=' . $id, 'objet="article"'));
        // auteur sans article et demande de suppression: suppression complète
        if (count($Tarticles) == 0 and _request('abs_poubelle') == 'supprimer') {
            sql_delete('spip_auteurs', "id_auteur={$id}");
        } else {
            objet_modifier($objet, $id, $set);
        }
        // traitement des articles de l'auteur
        if (count($Tarticles) != 0) {
            // supprimer les articles
            $table_idarticle = array();
            if ($traitement == 'supprimer_articles') {
                objet_dissocier(array('id_auteur' => $id), array('article' => $Tarticles));
                foreach ($Tarticles as $idarticle) {
                    $table_idarticle[] = $idarticle['id_objet'];
                }
                $inarticle = join(',', $table_idarticle);
                sql_delete('spip_articles', "id_article IN ({$inarticle})");
            }
            // deplacer les articles dans la rubrique d'archivage
            if ($traitement == 'transferer_articles') {
                foreach ($Tarticles as $idarticle) {
                    objet_modifier('article', $idarticle['id_objet'], array('id_parent' => $id_rubrique_archive));
                }
            }
        }
        if (test_plugin_actif("accesrestreint")) {
            // suppression des zones de l'auteur
            $Tzones = sql_allfetsel('id_zone', 'spip_zones_liens', array('id_objet=' . $id, 'objet="auteur"'));
            foreach ($Tzones as $id_zone) {
                zone_lier($id_zone, 'auteur', $id, 'del');
            }
        }
        // suppression des rubriques des admins restreints
        if ($statut == '0minirezo') {
            $Trubriques = sql_allfetsel('id_objet', 'spip_auteurs_liens', array('id_auteur=' . $id, 'objet="rubrique"'));
            objet_dissocier(array('id_auteur' => $id), array('rubrique' => $Trubriques));
        }
    }
}
示例#12
0
function agenda_post_edition_lien($flux)
{
    // Si on est en train de lier ou délier quelque chose a un événement
    if ($flux['args']['objet'] == 'evenement') {
        // On cherche si cet événement a des répétitions
        if ($id_evenement = $flux['args']['id_objet'] and $id_evenement > 0 and $repetitions = sql_allfetsel('id_evenement', 'spip_evenements', 'id_evenement_source = ' . $id_evenement) and is_array($repetitions)) {
            include_spip('action/editer_liens');
            // On a la liste des ids des répétitions
            $repetitions = array_map('reset', $repetitions);
            // Si c'est un ajout de lien, on l'ajoute à toutes les répétitions
            if ($flux['args']['action'] == 'insert') {
                objet_associer(array($flux['args']['objet_source'] => $flux['args']['id_objet_source']), array('evenement' => $repetitions));
            } elseif ($flux['args']['action'] == 'delete') {
                objet_dissocier(array($flux['args']['objet_source'] => $flux['args']['id_objet_source']), array('evenement' => $repetitions));
            }
        }
    }
    return $flux;
}
示例#13
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);
}