Changeset 84174 in spip-zone for _plugins_/pages


Ignore:
Timestamp:
Aug 12, 2014, 5:25:38 PM (5 years ago)
Author:
eric@…
Message:

Evolutions du plugin dont certaines peuvent être considérées comme des corrections:

  • la page pages_tous devient pages ce qui est plus cohérent avec les autres objets.
  • ajout et utilisation des autorisations classiques pour un obet 'page' : creer, modifier et voir. Ces autorisations et les suivantes sont par défaut positionnées à admin complet. Une fonction surchargeable permet de toutes les modifier d'un coup.
  • ajout de l'autorisation pages_voir pour afficher la liste des pages uniques (exec=pages)
  • ajout des autorisations d'affichage des menus pages et pagecreer. Ces autorisations font appel respectivement à pages_voir et page_creer.
  • utilisation du pipeline pre_boucle sur la boucle ARTICLES afin de clairement séparer les listes de pages uniques et celles d'articles éditoriaux. Par exemple, les listes d'articles de la page d'acceuil et de la page articles sont exemptes de pages uniques.

Tout n'est pas parfait en particulier pour les autorisations car il est toujours possible d'accéder à une page unique en saisissant l'url même si on est pas autorisé. C'est en effet l'autorisation de l'article qui se déroule. Pour combler ce manque il faudrait surcharger l'autorisation de l'article en testant l'id de rubrique mais cela produirait des effets de bords avec d'autres plugins comme accès restreint.
En fait, spécialiser un objet pour en créer un autre n'est pas une opération prévue dans l'api SPIP actuelle.

Autre remarque : lors de la désinstallation du plugin on supprime la colonne 'page' de la table spip_articles. On se retrouve avec des articles possédant un id_rubrique à -1. Est-ce bien de laisser cela ainsi ? Ne faudrait-il pas soit les supprimer soit les transférer dans une rubrique existante ?

Location:
_plugins_/pages/trunk
Files:
2 added
2 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/pages/trunk/pages_administrations.php

    r81419 r84174  
    4242 * Supprimer la colonne 'page' du plugin
    4343 *
     44 * TODO : que deviennent les article avec un id_rubrique=-1 ? Ne faut-il pas les traiter ?
     45 *
    4446 * @param string $nom_meta_base_version
    4547 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
  • _plugins_/pages/trunk/pages_pipelines.php

    r81419 r84174  
    246246 * Insertion dans le pipeline boite_infos (SPIP)
    247247 *
    248  * Ajouter un lien pour transformer une article normal en page inversement
     248 * Ajouter un lien pour transformer un article éditorial en page ou inversement
    249249 *
    250250 * @param array $flux
     
    254254 */
    255255function pages_boite_infos($flux){
    256         if ($flux['args']['type'] == 'article' and autoriser('modifier', 'article', $flux['args']['id'])){
     256        if ($flux['args']['type'] == 'article') {
    257257                include_spip('inc/presentation');
    258                 if (sql_getfetsel('page', 'spip_articles', 'id_article='. intval($flux['args']['id'])) == '')
    259                         $flux['data'] .= icone_horizontale(_T('pages:convertir_page'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'page'), 'page', $fonction="", $dummy="", $javascript="");
    260                 else
    261                         $flux['data'] .= icone_horizontale(_T('pages:convertir_article'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'article'), 'article', $fonction="", $dummy="", $javascript="");
     258                if (sql_getfetsel('page', 'spip_articles', 'id_article='. intval($flux['args']['id'])) == '') {
     259                        if (autoriser('creer', 'page', $flux['args']['id']))
     260                                $flux['data'] .= icone_horizontale(_T('pages:convertir_page'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'page'), 'page', $fonction="", $dummy="", $javascript="");
     261                }
     262                else {
     263                        if (autoriser('modifier', 'page', $flux['args']['id']))
     264                                $flux['data'] .= icone_horizontale(_T('pages:convertir_article'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'article'), 'article', $fonction="", $dummy="", $javascript="");
     265                }
    262266        }
    263267        return $flux;
     
    284288        ){
    285289                $cherche = "<a href=\"". generer_url_ecrire('rubriques') . "\">" . _T('info_racine_site') . "</a>";
    286                 $remplace = "<a href=\"". generer_url_ecrire('pages_tous') . "\">" . _T('pages:pages_uniques') . "</a>";
     290                $remplace = "<a href=\"". generer_url_ecrire('pages') . "\">" . _T('pages:pages_uniques') . "</a>";
    287291                $flux['data'] = str_replace($cherche,$remplace,$flux['data']);
    288292        }
     
    290294}
    291295
     296
     297/**
     298 * Insertion dans le pipeline pre_boucle (SPIP)
     299 * Pour les listes d'articles purement éditoriaux, il faut exclure les pages uniques afin d'éviter la confusion des genres
     300 * ainsi que les liens vers des pages parfois inaccessibles en fonction de l'autorisation de l'auteur.
     301 *
     302 * @param array $flux
     303 *              Le contexte du pipeline
     304 * @return array $flux
     305 *              Le contexte modifié
     306 */
     307function pages_pre_boucle($boucle){
     308
     309        // On ne s'intéresse qu'à la boucle ARTICLES
     310        if ($boucle->type_requete == 'articles') {
     311                // On n'insère le filtre {id_rubriques>0} pour exclure les pages uniques que si aucune des conditions
     312                // suivantes n'est vérifiée:
     313                // - pas de critère page
     314                // - pas de critère explicite {id_rubrique=-1} ou {id_rubrique<0}
     315                // - pas de critère {id_rubrique?} pour lequel l'environnement renvoie -1 pour l'id de la rubrique
     316                $boucle_articles = true;
     317                $critere_page = false;
     318
     319                // On cherche les critères id_rubrique, id_article ou page
     320                foreach($boucle->criteres as $_critere){
     321                        if (($_critere->op == 'page') // {page} ou {page?}
     322                        OR ($_critere->param[0][0]->texte == 'page')) { // {page=x}
     323                                // On considère qu'on cherche toujours des pages uniques donc on force le filtre id_rubrique=-1
     324                                $boucle_articles = false;
     325                                $critere_page = true;
     326                                break;
     327                        }
     328                        elseif (($_critere->op == 'id_article') // {id_article} ou {id_article?}
     329                                OR ($_critere->param[0][0]->texte == 'id_article')) { // {id_article=x}
     330                                // On pointe sur un article précis, il est donc inutile de rajouter un test sur la rubrique
     331                                // Pour le critère {id_article?} on considère que si l'on veut sélectionner des pages uniques
     332                                // ou des articles éditoriaux on doit préciser le critère {id_rubrique}
     333                                $boucle_articles = false;
     334                        }
     335                        elseif ((($_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique=-1}
     336                                        AND ($_critere->op == '=')
     337                                        AND ($_critere->param[1][0]->texte == '-1'))
     338                                OR (($_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique<0}
     339                                        AND ($_critere->op == '<')
     340                                        AND ($_critere->param[1][0]->texte == '0'))) {
     341                                // On cherche explicitement des pages uniques
     342                                $boucle_articles = false;
     343                                break;
     344                        }
     345                        elseif (($_critere->op == 'id_rubrique')) {
     346                                // On connait pas à ce stade la valeur de id_rubrique qui est passé dans le env.
     347                                // Aussi, on créer une condition where qui se compile différemment suivant la valeur de l'id_rubrique.
     348                                // En fait, il suffit de tester si l'id_rubrique est null. Dans ce cas il faut bien rajouter id_rubrique>0
     349                                // pour éliminer les pages uniques.
     350                                $boucle_articles = false;
     351                                $env_id = "\$Pile[0]['id_rubrique']";
     352                                $boucle->where[] =
     353                                        array("'?'", "(is_array($env_id)?count($env_id):strlen($env_id))", "''", "'articles.id_rubrique>0'");
     354                                break;
     355                        }
     356                }
     357
     358                // Si on est en présence d'une boucle article purement éditoriale, on ajoute le filtre id_rubrique>0
     359                if ($boucle_articles) {
     360                        $boucle->where[] = array("'>'", "'articles.id_rubrique'", "'\"0\"'");
     361                }
     362
     363                // Si on est en présence d'un critère {page} quelconque, on force le filtre id_rubrique=-1
     364                if ($critere_page) {
     365                        $boucle->where[] = array("'='", "'articles.id_rubrique'", "'\"-1\"'");
     366                }
     367        }
     368
     369        return $boucle;
     370}
     371
    292372?>
  • _plugins_/pages/trunk/paquet.xml

    r82059 r84174  
    22        prefix="pages"
    33        categorie="divers"
    4         version="1.1.0"
     4        version="1.2.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.0.*]"
     
    1515        <auteur>RastaPopoulos</auteur>
    1616        <auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
    17         <licence>GPL v3</licence>
     17
     18        <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL v3</licence>
    1819
    1920        <pipeline nom="declarer_tables_objets_sql" inclure="base/pages_tables.php" />
     
    2627        <pipeline nom="editer_contenu_objet" inclure="pages_pipelines.php" />
    2728        <pipeline nom="pre_edition" action="pre_edition_ajouter_page" inclure="pages_pipelines.php" />
     29        <pipeline nom="autoriser" inclure="pages_autorisations.php" />
     30        <pipeline nom="pre_boucle" inclure="pages_pipelines.php" />
    2831
    2932        <utilise nom="polyhier" />
    3033
    31         <menu nom="pages_tous" titre="pages:pages_uniques" parent="menu_edition" icone="images/page-16.png" />
     34        <menu nom="pages" titre="pages:pages_uniques" parent="menu_edition" icone="images/page-16.png" />
    3235        <menu nom="page_creer" titre="pages:creer_page" parent="outils_rapides" icone="images/page-new-16.png" action="article_edit" parametres="new=oui&amp;modele=page&amp;id_rubrique=-1" />
    3336</paquet>
Note: See TracChangeset for help on using the changeset viewer.