You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svp_typologie/formulaires/editer_affectations.php

116 lines
3.8 KiB
PHP

<?php
/**
* Gestion du formulaire d'affectation d'un type de plugin à un plugin.
**/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Chargement du formulaire d'affectation d'un type de plugin à un plugin donné.
*
* @param int $id_plugin Identifiant unique du plugin
* @param string $typologie Identifiant de la typologie
* @param null|array $options Options de chargement du formulaire :
*
* @return array Variables de contexte en entrée du formulaire
*/
function formulaires_editer_affectations_charger(int $id_plugin, string $typologie, array $options = []) : array {
// Les options peuvent être limitées au booléen d'éditabilité
if (!isset($options['editable'])) {
$options['editable'] = true;
}
// L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
include_spip('inc/autoriser');
$editable = ($options['editable'] and autoriser('affecter', 'plugin', $id_plugin));
// On récupère le préfixe du plugin qui sert à indexer les affectations de types de plugin.
include_spip('inc/svp_plugin');
$prefixe = plugin_lire($id_plugin, 'prefixe');
// Acquérir la configuration de la typologie.
include_spip('inc/config');
$configuration_typologie = lire_config("svptype/typologies/{$typologie}", []);
// On détermine si la typologie n'accepte qu'un type de plugin par plugin ou plus.
$typologie_singuliere = ($configuration_typologie['max_affectations'] == 1);
// On détermine la liste des types de plugin de la catégorie concernée qui sont déjà affectés au plugin.
include_spip('inc/svptype_plugin');
$affectations = plugin_lister_type_plugin($prefixe, $typologie);
// Envoi des valeurs au formulaire.
$valeurs = [
'id_plugin' => $id_plugin,
'prefixe' => $prefixe,
'typologie' => $typologie,
'affectations' => $affectations,
'profondeur_max' => $configuration_typologie['max_profondeur'],
'typologie_singuliere' => $typologie_singuliere,
'attribut_id' => "plugin-{$typologie}",
'affecter_plugin' => '',
'desaffecter_plugin' => '',
'visible' => 0,
'editable' => $editable,
];
// Les options non definies dans $valeurs sont passees telles quelles au formulaire html
$valeurs = array_merge($options, $valeurs);
return $valeurs;
}
/**
* Traitement du formulaire d'affectation d'un type de plugin à un plugin donné.
*
* @param int $id_plugin Identifiant unique du plugin
* @param string $typologie Identifiant de la typologie
* @param null|array $options Options de chargement du formulaire :
*
* @return array Tableau des messages à afficher sur le formulaire
*/
function formulaires_editer_affectations_traiter(int $id_plugin, string $typologie, array $options = []) : array {
// Les options peuvent être limitées au booléen d'éditabilité
if (!isset($options['editable'])) {
$options['editable'] = true;
}
// Initialisation du retour
$retour = [
'editable' => $options['editable']
];
include_spip('inc/autoriser');
if ($options['editable']
and autoriser('affecter', 'plugin', $id_plugin)) {
$action_desaffecter_plugin = _request('desaffecter_plugin');
$action_affecter_plugin = _request('affecter_plugin');
if ($action_desaffecter_plugin) {
$affectation_courante = key($action_desaffecter_plugin);
$desaffecter = charger_fonction(
'desaffecter_plugin',
'action',
true
);
$desaffecter($affectation_courante);
}
if ($action_affecter_plugin) {
$nouvelle_affectation = reset($action_affecter_plugin);
if ($nouvelle_affectation) {
$affecter = charger_fonction(
'affecter_plugin',
'action',
true
);
$ancien_type_plugin = (int) (key($action_affecter_plugin));
$affecter("{$ancien_type_plugin}:{$nouvelle_affectation}");
}
}
}
return $retour;
}