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; }
/** * 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); } }
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; }
/** * 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); }
/** * 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; }
/** * 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; }
/** * 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); }
/** * 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)); } } }
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; }
/** * 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); }