Changeset 109668 in spip-zone


Ignore:
Timestamp:
Mar 25, 2018, 10:33:42 AM (3 years ago)
Author:
eric@…
Message:

Gestion du changement de statut d'une espèce.

Location:
_plugins_/taxonomie/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/taxonomie/trunk/formulaires/decrire_taxon.php

    r109602 r109668  
    183183        // Récupération des informations de base du taxon
    184184        $select = array('tsn', 'nom_scientifique', 'edite', $element, 'sources');
    185         $where = array('id_taxon=' . sql_quote($id_taxon));
     185        $where = array('id_taxon=' . intval($id_taxon));
    186186        $taxon = sql_fetsel($select, 'spip_taxons', $where);
    187187
     
    232232                $maj['sources'] = serialize($maj['sources']);
    233233                // - Mise à jour
    234                 sql_updateq('spip_taxons', $maj, 'id_taxon=' . sql_quote($id_taxon));
     234                sql_updateq('spip_taxons', $maj, 'id_taxon=' . intval($id_taxon));
    235235
    236236                // Redirection vers la page d'édition du taxon
  • _plugins_/taxonomie/trunk/paquet.xml

    r109630 r109668  
    1919        <pipeline nom="declarer_tables_interfaces" inclure="base/taxonomie_declarations.php" />
    2020        <pipeline nom="pre_edition" inclure="taxonomie_pipelines.php" />
     21        <pipeline nom="post_edition" inclure="taxonomie_pipelines.php" />
    2122
    2223        <necessite nom="saisies"  compatibilite="[1.24.0;]" />
  • _plugins_/taxonomie/trunk/prive/objets/liste/taxons.html

    r109662 r109668  
    3434                <tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
    3535                        <td class="picto">[(#CHEMIN_IMAGE{taxon-16.png}|balise_img)]</td>
    36                         <td class="statut">[(#STATUT|puce_statut{taxon, #ID_TAXON})]</td>
     36                        <td class="statut">[(#STATUT|taxon_afficher_statut{#ID_TAXON})]</td>
    3737                        <td class="titre principale nom_scientifique">
    3838                                [(#LOGO_TAXON|image_reduire{20,26})]
  • _plugins_/taxonomie/trunk/taxonomie_autorisations.php

    r109604 r109668  
    132132/**
    133133 * Autorisation de modifier le statut d'un taxon.
    134  * Cela n'est possible que pour les espèces ne possédant aucun enfant.
     134 * Cela n'est possible que :
     135 * - si l'auteur possède l'autorisation de modifier le taxon
     136 * - et le taxon est une espèce
     137 * - et que l'espèce est soit une feuille de la hiérarchie soit possède des enfants dont aucun n'est au statut
     138 *   publié.
    135139 *
    136140 * @param object $faire
     
    139143 * @param object $qui
    140144 * @param object $opt
     145 *
    141146 * @return
     147 *        `true`si autorisé, `false`sinon.
    142148 */
    143149function autoriser_taxon_instituer_dist($faire, $type, $id, $qui, $opt) {
     
    146152
    147153        if ($id_taxon = intval($id)) {
     154                // On récupère les informations sur le taxon concerné et en particulier si celui-ci est bien une espèce
     155                // ou un descendant d'espèce.
    148156                $from = 'spip_taxons';
    149157                $where = array("id_taxon=$id_taxon");
    150                 $espece = sql_getfetsel('espece', $from, $where);
    151 
    152                 $autoriser = (($espece == 'oui') and  autoriser('modifier', 'taxon', $id_taxon, $qui, $opt));
     158                $select = array('espece', 'statut', 'tsn');
     159                $taxon = sql_fetsel($select, $from, $where);
     160
     161                if (($taxon['espece'] == 'oui') and  autoriser('modifier', 'taxon', $id_taxon, $qui, $opt)) {
     162                        // On vérifie que l'espèce ne possède pas des descendants directs
     163                        $where = array('tsn_parent=' . intval($taxon['tsn']));
     164                        $select = array('statut');
     165                        $enfants = sql_allfetsel($select, $from, $where);
     166                        if (!$enfants) {
     167                                // Si le taxon est une feuille de la hiérarchie alors il peut toujours être institué.
     168                                $autoriser = true;
     169                        } else {
     170                                // Le taxon a des descendants.
     171                                // - si un descendants est publié alors l'espèce concernée l'est aussi et ne peut pas être
     172                                //   instituée (prop ou poubelle) sous peine de casser la hiérarchie.
     173                                // - si aucun descendant n'est publié alors quelque soit le statut de l'espèce concernée celle-ci
     174                                //   peut être instituée.
     175                                if (!in_array('publie', array_column($enfants, 'statut'))) {
     176                                        $autoriser = true;
     177                                }
     178                        }
     179                }
    153180        }
    154181
    155182        return $autoriser;
    156183}
     184
     185
    157186/**
    158187 * Autorisation de voir la liste des taxons : tout le monde est autorisé.
  • _plugins_/taxonomie/trunk/taxonomie_fonctions.php

    r109602 r109668  
    301301        return $sources;
    302302}
     303
     304
     305/**
     306 * Affiche la puce de statut d'un taxon sans proposer le formulaire de changement de statut.
     307 *
     308 * @package SPIP\TAXONOMIE\TAXON
     309 *
     310 * @api
     311 * @filtre
     312 *
     313 * @param string $statut
     314 *        Statut du taxon, `prop`, `publie`ou `poubelle`.
     315 * @param int    $id_taxon
     316 *        Id du taxon.
     317 *
     318 * @return array
     319 *        Image de la puce.
     320 */
     321function taxon_afficher_statut($statut, $id_objet = 0) {
     322
     323        // On évite de charger la fonction n fois.
     324        static $afficher_puce = null;
     325
     326        if (!$afficher_puce) {
     327                // Chargement de la fonction d'affichage
     328                $afficher_puce = charger_fonction('puce_statut', 'inc');
     329        }
     330
     331        // On affiche la puce sans proposer le formulaire rapide de changement de statut qui pose un problème avec
     332        // l'ajax sachant qu'un changement peut en provoquer d'autres, la liste n'est plus à jour.
     333        $puce = $afficher_puce($id_objet, $statut, 0, 'taxon', false, false);
     334
     335        return $puce;
     336}
  • _plugins_/taxonomie/trunk/taxonomie_pipelines.php

    r109384 r109668  
    4444        return $flux;
    4545}
     46
     47
     48/**
     49 * Surcharge l'action `instituer` d'un taxon.
     50 * Si une espèce est instituée à publié, alors ses ascendants de type espèce non encore publiés sont automatiquement
     51 * publiés.
     52 *
     53 * @pipeline pre_edition
     54 * @package SPIP\TAXONOMIE\TAXON
     55 *
     56 * @param array         $flux
     57 *              Données du pipeline fournie en entrée (chaque pipeline possède une structure de donnée propre).
     58 *
     59 * @return array
     60 *              Données du pipeline modifiées pour refléter le traitement.
     61 *
     62**/
     63function taxonomie_post_edition($flux) {
     64
     65        $table = $flux['args']['table'];
     66        $id = intval($flux['args']['id_objet']);
     67        $action = $flux['args']['action'];
     68
     69        // Traitements particuliers de l'objet taxon quand celui-ci est institué manuellement
     70        if (($table == 'spip_taxons') and $id) {
     71                // Instituer : on ne peut instituer qu'une espèce dont aucun enfant n'est publié. Il est donc inutile de
     72                // considérer ces cas.
     73                if ($action == 'instituer') {
     74                        // On vérifie qu'on institue l'espèce de 'prop' à 'publie'. Si c'est le cas, alors on vérifie
     75                        // qu'il est aussi nécessaire d'instituer à 'publie' les enfants de type espèce encore à prop.
     76                        $statut_nouveau = $flux['data']['statut'];
     77                        $statut_ancien = $flux['args']['statut_ancien'];
     78                        if (($statut_ancien == 'prop') and ($statut_nouveau == 'publie')) {
     79                                // On récupère le TSN et le TSN parent de l'espèce concernée.
     80                                $from = 'spip_taxons';
     81                                $select = array('tsn', 'tsn_parent');
     82                                $where = array("id_taxon=$id");
     83                                $taxon = sql_fetsel($select, $from, $where);
     84
     85                                // On récupère les ascendants de type espèce de l'espèce concernée si ils existent.
     86                                include_spip('taxonomie_fonctions');
     87                                $ascendance = taxon_informer_ascendance($id, $taxon['tsn_parent'], 'ascendant');
     88                                if ($ascendance) {
     89                                        // On publie les taxons en évitant une ré-entrance (donc sans appeler l'api objet)
     90                                        // mais en utilisant directement une mise à jour sql.
     91//                                      include_spip('action/editer_objet');
     92                                        foreach ($ascendance as $_parent) {
     93                                                if ($_parent['espece'] == 'oui') {
     94                                                        if (($_parent['statut'] <> 'publie')) {
     95                                                                $maj = array('statut' => $statut_nouveau, 'edite' => 'oui');
     96                                                                sql_updateq($from, $maj, 'id_taxon=' . intval($_parent['id_taxon']));
     97//                                                              objet_modifier('taxon', intval($_parent['id_taxon']), array('statut' => $statut_nouveau));
     98                                                        }
     99                                                } else {
     100                                                        // Dès que l'on est sur un taxon non espèce on peut s'arrêter vu que les ascendants sont
     101                                                        // classé du parent le plus proche au plus éloigné.
     102                                                        break;
     103                                                }
     104                                        }
     105                                }
     106                        }
     107                }
     108        }
     109
     110        return $flux;
     111}
Note: See TracChangeset for help on using the changeset viewer.