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;
}
/**
* À 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;
}
/**
* Enregistre un massicotage dans la base de données
*
* @param string $objet : le type d'objet
* @param integer $id_objet : l'identifiant de l'objet
* @param array parametres : Un tableau de parametres pour le
* massicotage, doit contenir les clés
* 'zoom', 'x1', 'x2', 'y1', et 'y2'
*
* @return mixed Rien si tout s'est bien passé, un message d'erreur
* sinon
*/
function massicot_enregistrer($objet, $id_objet, $parametres)
{
include_spip('action/editer_objet');
include_spip('action/editer_liens');
/* Tester l'existence des parametres nécessaires */
if (!isset($parametres['zoom'])) {
return _T('massicot:erreur_parametre_manquant', array('parametre' => 'zoom'));
} elseif (!isset($parametres['x1'])) {
return _T('massicot:erreur_parametre_manquant', array('parametre' => 'x1'));
} elseif (!isset($parametres['x2'])) {
return _T('massicot:erreur_parametre_manquant', array('parametre' => 'x2'));
} elseif (!isset($parametres['y1'])) {
return _T('massicot:erreur_parametre_manquant', array('parametre' => 'y1'));
} elseif (!isset($parametres['y2'])) {
return _T('massicot:erreur_parametre_manquant', array('parametre' => 'y2'));
}
/* le rôle est traité à part */
if (isset($parametres['role'])) {
$role = $parametres['role'];
unset($parametres['role']);
} else {
$role = '';
}
$chemin_image = massicot_chemin_image($objet, $id_objet);
list($width, $height) = getimagesize($chemin_image);
$id_massicotage = sql_getfetsel('id_massicotage', 'spip_massicotages_liens', array('objet=' . sql_quote($objet), 'id_objet=' . intval($id_objet), 'role=' . sql_quote($role)));
if (!$id_massicotage) {
$id_massicotage = objet_inserer('massicotage');
objet_associer(array('massicotage' => $id_massicotage), array($objet => $id_objet), array('role' => $role));
/* Le logo du site est un cas spécial. SPIP le traite comme le « site »
* avec l'id 0, alors on fait pareil. */
if ($id_objet == 0) {
// peut être le string '0'
sql_insertq('spip_massicotages_liens', array('id_massicotage' => $id_massicotage, 'id_objet' => 0, 'objet' => 'site', 'role' => $role));
}
}
if ($err = objet_modifier('massicotage', $id_massicotage, array('traitements' => serialize($parametres)))) {
return $err;
}
}
/**
* 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'));
}
}
/**
* Ajoute les liens demandés en prenant éventuellement en compte le rôle
*
* Appelle la fonction objet_associer. L'appelle autant de fois qu'il y
* a de rôles demandés pour cette liaison.
*
* @internal
* @param string $objet_source Objet source de la liaison (qui a la table de liaison)
* @param array|string $ids Identifiants pour l'objet source
* @param string $objet_lien Objet à lier
* @param array|string $idl Identifiants pour l'objet lié
* @param array $qualifs
* @return void
**/
function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs)
{
// retrouver la colonne de roles s'il y en a a lier
if (is_array($qualifs) and count($qualifs)) {
foreach ($qualifs as $qualif) {
objet_associer(array($objet_source => $ids), array($objet_lien => $idl), $qualif);
}
} else {
objet_associer(array($objet_source => $ids), array($objet_lien => $idl));
}
}
/**
* Associer un mot a 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
*
* on peut passer optionnellement une qualification du (des) lien(s) qui sera
* alors appliquee dans la foulee.
* En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
*
* Exemples:
* mot_associer(3, array('auteur'=>2));
* mot_associer(3, array('auteur'=>2), array('vu'=>'oui)); // ne fonctionnera pas ici car pas de champ 'vu' sur spip_mots_liens
*
* @param int $id_mot
* @param array $objets
* @param array $qualif
* @return string
*/
function mot_associer($id_mot, $objets, $qualif = null)
{
include_spip('action/editer_liens');
// si il s'agit d'un groupe avec 'unseul', alors supprimer d'abord les autres
// mots de ce groupe associe a ces objets
$id_groupe = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . intval($id_mot));
if (un_seul_mot_dans_groupe($id_groupe)) {
$mots_groupe = sql_allfetsel("id_mot", "spip_mots", "id_groupe=" . intval($id_groupe));
$mots_groupe = array_map('reset', $mots_groupe);
objet_dissocier(array('mot' => $mots_groupe), $objets);
}
return objet_associer(array('mot' => $id_mot), $objets, $qualif);
}
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;
}
/**
* Gerer le renouvellement lors de la notification de paiement d'une echeance par le presta bancaire
*
* @param array
* @return array
*/
function souscription_bank_abos_renouveler($flux)
{
if (!$flux['data']) {
$id = $flux['args']['id'];
if (strncmp($id, "uid:", 4) == 0) {
$where = "abonne_uid=" . sql_quote(substr($id, 4));
} else {
$where = "id_souscription=" . intval($id);
}
if ($row = sql_fetsel("*", "spip_souscriptions", $where, '', 'date_souscription DESC')) {
$options = array('auteur' => $row['courriel'], 'parrain' => 'souscription', 'tracking_id' => $row['id_souscription'], 'id_auteur' => $row['id_auteur']);
$inserer_transaction = charger_fonction("inserer_transaction", "bank");
include_spip("action/editer_liens");
// verifier que c'est bien l'echeance attendue
// et sinon generer des transactions offline de rattrapage
if (!intval($row["date_echeance"])) {
$row["date_echeance"] = $row["date_souscription"];
}
$date_echeance = $row['date_echeance'];
$datem45 = date('Y-m-d H:i:s', strtotime("-45 day"));
while ($date_echeance < $datem45) {
$o = $options;
$o['champs']['date_transaction'] = $date_echeance;
$o['champs']['mode'] = 'offline';
$prochaine_echeance = date('Y-m-d H:i:s', strtotime("+1 month", strtotime($date_echeance)));
if ($id_transaction = $inserer_transaction($row['montant'], $o)) {
// regler la transacton offline
$regler_transaction = charger_fonction('regler_transaction', 'bank');
$regler_transaction($id_transaction);
// mettre a jour la souscription
$set = array('statut' => 'ok', 'abo_statut' => 'ok', 'montant_cumul' => round(floatval($row['montant_cumul']) + floatval($row['montant']), 2), 'date_echeance' => $prochaine_echeance, 'abo_fin_raison' => '');
sql_updateq('spip_souscriptions', $set, "id_souscription=" . intval($row['id_souscription']));
$row = sql_fetsel("*", "spip_souscriptions", "id_souscription=" . intval($row['id_souscription']));
objet_associer(array("souscription" => $row['id_souscription']), array("transaction" => $id_transaction));
}
$date_echeance = $prochaine_echeance;
}
// si il y a deja eu une transaction echeance il y a moins de 15j sur cette souscription
// c'est un double appel, renvoyer l'id_transaction concerne
$datem15 = date('Y-m-d H:i:s', strtotime("-15 day"));
if ($id_transaction = sql_getfetsel("id_transaction", "spip_transactions", "statut<>" . sql_quote('commande') . " AND date_transaction>" . sql_quote($datem15) . " AND parrain=" . sql_quote('souscription') . " AND tracking_id=" . intval($row['id_souscription']) . " AND id_auteur=" . intval($row['id_auteur']), "", "date_transaction")) {
$flux['data'] = $id_transaction;
} elseif ($id_transaction = $inserer_transaction($row['montant'], $options)) {
$prochaine_echeance = $row['date_echeance'];
$datep15 = date('Y-m-d H:i:s', strtotime("+15 day"));
// recaler la prochaine echeance si trop en avance (double appel anterieur ou erreur de calcul)
while ($prochaine_echeance > $datep15) {
$prochaine_echeance = date('Y-m-d H:i:s', strtotime("-1 month", strtotime($prochaine_echeance)));
}
// l'incrementer pour atteindre celle du mois prochain
while ($prochaine_echeance < $datep15) {
$prochaine_echeance = date('Y-m-d H:i:s', strtotime("+1 month", strtotime($prochaine_echeance)));
}
// a ce stade on ne sait pas encore si la transaction est reussie ou en echec
// on ne peut donc pas incrementer le montant cumul, mais seulement mettre a jour les echeances etc
// si echec => declenchera une resiliation
// si succes => declenchera un traitement reglement ou l'on mettra a jour le cumul
$set = array('id_transaction_echeance' => $id_transaction, 'statut' => 'ok', 'abo_statut' => 'ok', 'date_echeance' => $prochaine_echeance, 'abo_fin_raison' => '');
sql_updateq('spip_souscriptions', $set, "id_souscription=" . intval($row['id_souscription']));
$row = sql_fetsel("*", "spip_souscriptions", "id_souscription=" . intval($row['id_souscription']));
objet_associer(array("souscription" => $row['id_souscription']), array("transaction" => $id_transaction));
$flux['data'] = $id_transaction;
// verifier si ce n'est pas la derniere transaction, auquel cas on notifie
if ($row['date_echeance'] > $row['date_fin'] and $row['date_fin'] > $row['date_souscription']) {
// Notifications
if ($notifications = charger_fonction('notifications', 'inc', true)) {
$notifications('informersouscriptionterminee', $row['id_souscription']);
}
}
}
}
}
return $flux;
}
/**
* Chargement du formulaire d'édition de souscription
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int$id_souscription_campagne
* Identifiant de la campagne de souscription
* @return array
* Retours des traitements
*/
function formulaires_souscription_traiter_dist($id_souscription_campagne)
{
$lier_trad = 0;
$config_fonc = '';
$row = array();
$hidden = '';
$retour = '';
$ret = array();
$campagne = sql_fetsel("*", "spip_souscription_campagnes", "id_souscription_campagne=" . intval($id_souscription_campagne));
set_request("id_souscription_campagne", $id_souscription_campagne);
set_request('type_souscription', $campagne['type_objectif']);
if (!in_array(_request('envoyer_info'), array('on', 'off'))) {
set_request('envoyer_info', 'off');
}
$where_deja = array('courriel=' . sql_quote(_request('courriel')), 'statut=' . sql_quote('prepa'), "date_souscription>" . sql_quote(date('Y-m-d H:i:s', strtotime("-1 day"))), 'id_souscription_campagne=' . intval($id_souscription_campagne));
$erreurs = array();
$montant = formulaires_souscription_trouver_montant($campagne, $erreurs);
$abo = false;
if (strncmp($montant, "abo", 3) == 0) {
$abo = true;
$montant = substr($montant, 3);
set_request("abo_statut", "commande");
$where_deja[] = 'abo_statut=' . sql_quote('commande');
} else {
$where_deja[] = 'abo_statut=' . sql_quote('non');
}
set_request('montant', $montant);
$where_deja[] = 'montant=' . sql_quote($montant, '', 'text');
// si on a une souscription du meme montant, meme email, en commande, qui date de moins de 24h
// on la reutilise pour pas generer plein de souscription en base en cas de retour arriere/modif saisie/revalidation
if (!($id_souscription = sql_getfetsel('id_souscription', 'spip_souscriptions', $where_deja))) {
$id_souscription = 'new';
}
$ret = formulaires_editer_objet_traiter('souscription', $id_souscription, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
if ($ret['id_souscription']) {
// recuperer l'id_auteur de la souscription, qui a pu etre renseigne en post_edition par un autre plugin
// ou recupere de la session courante hors espace prive
$souscription = sql_fetsel("*", "spip_souscriptions", "id_souscription=" . intval($ret['id_souscription']));
$id_auteur = $souscription['id_auteur'];
// generer la transaction et l'associer a la souscription
$inserer_transaction = charger_fonction('inserer_transaction', 'bank');
$options = array("auteur" => _request('courriel'), "id_auteur" => $id_auteur, "parrain" => "souscription", "tracking_id" => $ret['id_souscription'], "force" => false);
if ($id_transaction = $inserer_transaction($montant, $options) and $hash = sql_getfetsel('transaction_hash', "spip_transactions", "id_transaction=" . intval($id_transaction))) {
// associer transaction et souscription
include_spip("action/editer_liens");
objet_associer(array("souscription" => $ret['id_souscription']), array("transaction" => $id_transaction));
sql_updateq("spip_souscriptions", array('id_transaction_echeance' => $id_transaction), "id_souscription=" . intval($ret['id_souscription']));
// si pas d'auteur ni en base ni en session, passer nom et prenom en session pour un eventuel usage dans le paiement (SEPA)
if (!$id_auteur and (!isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur'])) {
include_spip('inc/session');
if ($souscription['nom']) {
session_set("session_nom", $souscription['nom']);
}
if ($souscription['prenom']) {
session_set("session_prenom", $souscription['prenom']);
}
}
$target = $abo ? "payer-abonnement" : "payer-acte";
spip_log(sprintf("La souscription [%s], associee a la transaction [%s] a bien ete cree.", $ret['id_souscription'], $id_transaction), "souscription");
if (lire_config("souscription/processus_paiement", "redirige") === "redirige") {
$ret['redirect'] = generer_url_public($target, "id_transaction={$id_transaction}&transaction_hash={$hash}", false, false);
} else {
$ret['message_ok'] = _T('souscription:message_regler_votre_' . $campagne['type_objectif']);
$GLOBALS['formulaires_souscription_paiement'] = recuperer_fond("content/{$target}", array('id_transaction' => $id_transaction, 'transaction_hash' => $hash, 'class' => 'souscription_paiement'));
}
} else {
spip_log(sprintf("Erreur lors de la creation de la transaction liee a la souscription [%s].", $ret['id_souscription']), "souscription");
$ret['message_erreur'] = _T('souscription:erreur_echec_creation_transaction');
}
}
// si API newsletter est dispo ET que case inscription est cochee, inscrire a la newsletter
if (_request("envoyer_info") === "on" and $subscribe = charger_fonction("subscribe", "newsletter", true)) {
$email = _request("courriel");
$nom = array(_request("prenom"), _request("nom"));
$nom = array_filter($nom);
$nom = implode(" ", $nom);
$subscribe($email, array('nom' => $nom));
}
return $ret;
}
/**
* 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;
}
/**
* Mettre à jour les liens objets/zones.
*
* @param int|array|string $zones
* Identifiant ou liste d'identifiants zones à affecter.
* Si zones vaut '', associe toutes les zones a(aux) objets(s).
* @param string $type
* Type d'objet (rubrique, auteur).
* @param int|array $ids
* Identifiant ou liste d'identifiants de l'objet
* @param string $operation
* Action à effectuer parmi `add`, `set` ou `del` pour ajouter, affecter uniquement,
* ou supprimer les objets listés dans ids.
*/
function zone_lier($zones, $type, $ids, $operation = 'add')
{
include_spip('inc/autoriser');
include_spip('action/editer_liens');
if (!$zones) {
$zones = "*";
}
if (!$ids) {
$ids = array();
} elseif (!is_array($ids)) {
$ids = array($ids);
}
if ($operation == 'del') {
// on supprime les ids listes
objet_dissocier(array('zone' => $zones), array($type => $ids));
} else {
// si c'est une affectation exhaustive, supprimer les existants qui ne sont pas dans ids
// si c'est un ajout, ne rien effacer
if ($operation == 'set') {
objet_dissocier(array('zone' => $zones), array($type => array("NOT", $ids)));
// bugfix temporaire : objet_associer ne gere pas id=0
if (!in_array(0, $ids) and $type == "rubrique") {
sql_delete("spip_zones_liens", "id_zone=" . intval($zones) . " AND id_objet=0 AND objet=" . sql_quote($type));
}
}
foreach ($ids as $id) {
if (autoriser('affecterzones', $type, $id, null, array('id_zone' => $zones))) {
// bugfix temporaire : objet_associer ne gere pas id=0
if ($id == 0 and $type == "rubrique") {
sql_insertq("spip_zones_liens", array('id_zone' => $zones, "id_objet" => $id, "objet" => $type));
} else {
objet_associer(array('zone' => $zones), array($type => $id));
}
}
}
}
}
请发表评论