@ -24,15 +24,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* #URL_ACTION_AUTEUR{dissocier_album, tous/#OBJET/#ID_OBJET, #SELF}
* ```
*
* @param string $arg
* Arguments séparés par un slash «/»
* sous la forme `$album/$objet/$ id_objet`
* @param string|null $arg
* Arguments séparés par un slash `/`,
* sous la forme `id_album_ou_tous/objet/ id_objet`
*
* - album : identifiant d'un album pour dissocier un album unique
* «tous» pour dissocier tous les albums
* - objet : type d'objet à dissocier
* - id_objet : identifiant de l'objet à dissocier
* @return void
* - id_album_ou_tous : soit l'identifiant d'un album
* soit le mot-clé `tous` pour dissocier en masse
* - objet : type d'objet à dissocier
* - id_objet : identifiant de l'objet à dissocier
* @return bool
*/
function action_dissocier_album_dist($arg = null) {
@ -41,41 +41,43 @@ function action_dissocier_album_dist($arg = null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
[$album, $objet, $id_objet] = explode('/', $arg) ;
$ok = false ;
// si l'identifiant de l'objet est négatif, vérifier qu'il correspondant à celui du visiteur,
// (cas d'un album lié à un objet pas encore enregistré en base).
if (
$id_objet = intval($id_objet)
and (
($id_objet < 0 and $ id_objet = = - $ GLOBALS [ ' visiteur_session ' ] [ ' id_auteur ' ] )
or autoriser('modifier', $objet, $id_objet)
)
) {
// Éviter les notices si arg mal formaté
if (substr_count($arg, '/') === 2) {
[$id_album_ou_tous, $objet, $id_objet] = explode('/', $arg);
$id_objet = (int) $id_objet;
include_spip('action/editer_liens');
switch ($album) {
case 'tous':
// Ne dissocier que les albums non insérés dans le texte.
// = autorisation à dissocier un album d'un objet,
// sauf qu'on économise des requêtes.
if (is_array($liens = objet_trouver_liens(['album' => '*'], [$objet => $id_objet]))) {
$ids_albums = [];
foreach ($liens as $lien) {
if ($lien['vu'] == 'non') {
$ids_albums[] = $lien['id_album'];
}
}
objet_dissocier(['album' => $ids_albums], [$objet => $id_objet]);
}
break;
default:
if (
$id_album = intval($album)
and autoriser('dissocier', 'album', $id_album, '', ['objet' => $objet, 'id_objet' => $id_objet])
) {
objet_dissocier(['album' => $id_album], [$objet => $id_objet]);
}
break;
// On liste tous les albums à dissocier
$ids_albums = [];
if ($id_album_ou_tous === 'tous') {
$liens = objet_trouver_liens(['album' => '*'], [$objet => $id_objet]);
$ids_albums = array_column($liens, 'id_album');
$ids_albums = array_map('intval', $ids_albums);
} else {
$ids_albums = [(int) $id_album_ou_tous];
}
// On ne garde que ceux qu'on a le droit de dissocier
$ids_albums_autorises = [];
foreach ($ids_albums as $id_album) {
if (autoriser('dissocier', 'album', $id_album, '', ['objet' => $objet, 'id_objet' => $id_objet])) {
$ids_albums_autorises[] = $id_album;
}
}
// Il faut qu'il reste au moins 1 autorisé à être dissocié
if (count($ids_albums_autorises) > 0) {
// objet_dissocier retourne le nombre de liens traités en cas de succès, sinon false
$dissocier = objet_dissocier(['album' => $ids_albums_autorises], [$objet => $id_objet]);
$ok = ($dissocier === count($ids_albums_autorises) ? true : false);
}
}
if (!$ok) {
spip_log("dissocier_album : erreur, ou action pas autorisée, ou arg pas compris : $arg", 'albums');
}
return $ok;
}