Browse Source

v1.2.5. Prendre en compte les roles choisis depuis la liste des documents-joints. Simplification de code et correction de quelques bugs (liste des rôles proposés selon le contexte : formulaire de logo ou liste des documents joints).

master
tcharlss@bravecassine.com 5 years ago
parent
commit
7d779e8f8a
  1. 2
      base/roles_documents.php
  2. 9
      formulaires/editer_logo.php
  3. 1
      formulaires/inc-selecteur_role.html
  4. 3
      paquet.xml
  5. 85
      roles_documents_fonctions.php
  6. 43
      roles_documents_pipelines.php

2
base/roles_documents.php

@ -48,7 +48,7 @@ function roles_documents_declarer_tables_objets_sql($tables) {
'defaut' => 'document',
'principaux' => array(
'logo',
'logo_survol'
'logo_survol',
),
)
),

9
formulaires/editer_logo.php

@ -107,11 +107,8 @@ function formulaires_editer_logo_charger_dist($objet, $id_objet, $retour = '', $
}
// 1) Cherchons ensuite les documents avec des rôles de logos
$roles = roles_presents('document', $objet); // Tous les rôles pour cet objet
$roles_logos_possibles = isset($roles['roles']['choix']) ? $roles['roles']['choix'] : array();
$roles_logos_possibles = filtrer_roles_logos($roles_logos_possibles); // Tous les rôles de logos possibles pour cet objet
$roles_logos_attribues = roles_presents_sur_document($objet, $id_objet, true); // Les rôles de logos attribués pour cet objet
foreach ($roles_logos_attribues as $role) {
$roles_logos = roles_presents_sur_document($objet, $id_objet, true); // Tableau des rôles attribués ou non
foreach ($roles_logos['attribues'] as $role) {
// Vérifier la config de certains rôles connus
$config_actif = (!in_array($role, array_keys($config)) or (in_array($role, array_keys($config)) and $config[$role] == 'oui'));
if ($config_actif
@ -122,7 +119,7 @@ function formulaires_editer_logo_charger_dist($objet, $id_objet, $retour = '', $
}
// S'il y a moins de rôles attribués que de rôles possibles, on peut en ajouter
$joindre_documents = count($roles_logos_possibles) > count($roles_logos_attribues);
$joindre_documents = count($roles_logos['possibles']) > count($roles_logos['attribues']);
// Autorisation
if (!isset($options['editable'])) {

1
formulaires/inc-selecteur_role.html

@ -5,7 +5,6 @@
]
<div class="selecteur-role">
[(#REM) Plusieurs roles : select ]
<B_select_roles>
<label for="role"><:roles_documents:champ_role_logo_label:>&nbsp;:</label>
#SET{readonly, #TOTAL_BOUCLE|=={1}|?{readonly}}

3
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="roles_documents"
categorie="edition"
version="1.2.4"
version="1.2.5"
etat="dev"
compatibilite="[3.1.1;3.2.*]"
logo="prive/themes/spip/images/roles_documents-48.png"
@ -26,5 +26,6 @@
<pipeline nom="quete_logo_objet" inclure="roles_documents_pipelines.php" />
<pipeline nom="pre_boucle" inclure="roles_documents_pipelines.php" />
<pipeline nom="formulaire_charger" inclure="roles_documents_pipelines.php" />
<pipeline nom="formulaire_traiter" inclure="roles_documents_pipelines.php" />
<pipeline nom="recuperer_fond" inclure="roles_documents_pipelines.php" />
</paquet>

85
roles_documents_fonctions.php

@ -16,9 +16,12 @@ if (!defined('_ECRIRE_INC_VERSION')) {
/**
* Lister les rôles de documents attribués à un objet
* Lister les rôles de documents distincts pour un objet : ceux possibles, ceux attribués et non attribués
*
* @note
* Vaguement basé sur la fonction roles_presents_sur_id() de l'API, sauf qu'on retourne des rôles uniques,
* et on fait le détail entre ceux atribués et non attribués.
*
* l'API des rôles permet de lister les rôles attribués pour un document précis,
* mais pas pour TOUS les documents liés à l'objet.
* Ex. pas possible : roles_presents_sur_id('*', 'document', $objet, $id_objet, 'document')
@ -31,70 +34,64 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Type d'objet lié
* @param integer $id_objet
* Identifiant de l'objet lié
* @param mixed $logos
* true pour filtrer les rôles de logos
* false pour filtrer les rôles hors logos
* @param mixed $principaux
* true : ne renvoyer que les rôles principaux (logos)
* false : exclure les rôles principaux (logos)
* @return array
* Tableau linéaire avec les rôles
* Tableau associatif avec 3 clés
* - possibles : tous les rôles possibles
* - attribués : ceux attribués
* - non_attribues : ceux non attribues
*/
function roles_presents_sur_document($objet, $id_objet, $logos = null) {
function roles_presents_sur_document($objet, $id_objet, $principaux = null) {
static $done = array();
// Stocker le résultat
$hash = "$objet-$id_objet";
$hash = "$objet-$id_objet-$principaux";
if (isset($done[$hash])) {
return $done[$hash];
}
// Pas de rôles sur ces objets, on sort
$roles = roles_presents('document', $objet);
if (!$roles) {
// Liste de tous les rôles possibles
// Si pas de rôles sur ces objets, on sort
$infos_roles = roles_presents('document', $objet);
if (!$infos_roles) {
return $done['hash'] = false;
}
$roles_possibles = $infos_roles['roles']['choix'];
// On récupère les rôles
// Liste des rôles attribués
$res = sql_allfetsel(
"distinct(role)",
'distinct(role)',
'spip_documents_liens',
array(
'objet=' . sql_quote($objet),
'id_objet=' . intval($id_objet),
"role!=''",
)
);
$roles_presents = array_column($res, 'role');
// On filtre éventuellement les rôles de logos
if (is_bool($logos)) {
$roles_presents = filtrer_roles_logos($roles_presents, $logos);
}
return $done[$hash] = $roles_presents;
}
$roles_attribues = array_column($res, 'role');
/**
* Filtrer une liste de rôles de documents pour inclure ou exclure les rôles de logos
*
* @param array $roles
* Tableau linéaire de rôles
* @param boolean $logo
* true (défaut) : uniquement les rôles de logos
* false (défaut) : uniquement les rôles non logos
* @return array Tableau associatif rôle => titre
*/
function filtrer_roles_logos($roles, $logos = true) {
// Liste des rôles non attribués
$roles_non_attribues = array_diff($roles_possibles, $roles_attribues);
// Uniquement les logos
$roles_logos = array_filter($roles, function($v){
return substr($v, 0, 4) === 'logo';
});
// On filtre
if ($logos) {
$roles = $roles_logos;
} else {
$roles = array_diff($roles, $roles_logos);
// On filtre éventuellement les rôles principaux (=logos)
if (!is_null($principaux)
and !empty($infos_roles['roles']['principaux'])
and $roles_principaux = $infos_roles['roles']['principaux']
){
$filtrer = ($principaux ? 'array_intersect' : 'array_diff');
$roles_possibles = $filtrer($roles_possibles, $roles_principaux);
$roles_attribues = $filtrer($roles_attribues, $roles_principaux);
$roles_non_attribues = $filtrer($roles_non_attribues, $roles_principaux);
}
return $roles;
// On renvoie le détail
$roles = array(
'possibles' => $roles_possibles,
'attribues' => $roles_attribues,
'non_attribues' => $roles_non_attribues,
);
return $done[$hash] = $roles;
}

43
roles_documents_pipelines.php

@ -324,8 +324,26 @@ function roles_documents_formulaire_charger($flux) {
function roles_documents_formulaire_traiter($flux) {
// Formulaire d'ajout de document
if ($flux['args']['form'] == 'joindre_document') {
// TODO
// En présence d'un role sélectionne, on requalifie le lien créé
if ($flux['args']['form'] == 'joindre_document'
and $role = _request('role')
and $role != 'document'
and $objet = $flux['args']['args'][2]
and $id_objet = $flux['args']['args'][1]
and !empty($flux['data']['ids'])
) {
foreach ($flux['data']['ids'] as $id_document) {
$update = sql_updateq(
'spip_documents_liens',
array('role' => $role),
array(
'id_document=' . intval($id_document),
'objet=' . sql_quote($objet),
'id_objet=' . intval($id_objet),
'role=' . sql_quote('document'),
)
);
}
}
return $flux;
@ -350,29 +368,18 @@ function roles_documents_recuperer_fond($flux) {
and !empty($flux['args']['contexte']['objet'])
and !empty($flux['args']['contexte']['id_objet'])
) {
// Est-ce qu'il s'agit d'un ajout de logo ?
$logo = !empty($flux['args']['contexte']['editer_logo']);
$editer_logo = !empty($flux['args']['contexte']['editer_logo']);
$principaux = $editer_logo ? true : false;
// Retrouver les rôles restant à associer
$objet = $flux['args']['contexte']['objet'];
$id_objet = $flux['args']['contexte']['id_objet'];
//
$roles_possibles = roles_presents('document', $objet); // Les rôles possibles pour cet objet
$roles_possibles = isset($roles_possibles['roles']['choix']) ? $roles_possibles['roles']['choix'] : array();
$roles_possibles_logos = filtrer_roles_logos($roles_possibles, $logo); // Les rôles de logos possibles pour cet objet
$roles_presents_objet = roles_presents_sur_document($objet, $id_objet); // Les rôles attribués pour cet objet
$roles_presents_objet_logos = filtrer_roles_logos($roles_presents_objet, $logo);
// Les rôles restants
if ($logo) {
$roles_restants = array_diff($roles_possibles_logos, $roles_presents_objet_logos);
} else {
$roles_restants = $roles_possibles_logos;
}
//
$roles = roles_presents_sur_document($objet, $id_objet, $principaux);
$contexte = array(
'role' => $flux['args']['contexte']['role'],
'roles' => $roles_restants,
'roles' => $editer_logo ? $roles['non_attribues'] : $roles['possibles'],
);
$selecteur_roles = recuperer_fond('formulaires/inc-selecteur_role', $contexte);

Loading…
Cancel
Save