Changeset 99665 in spip-zone


Ignore:
Timestamp:
Sep 27, 2016, 7:20:25 PM (3 years ago)
Author:
tcharlss@…
Message:

v1.0.0 : premier jet d'une nouvelle version complètement refactorisée, et toujours aussi expérimentale.
Désolé pour le gros commit en 1 seule fois.

Les URLs des pages ne sont plus stockées dans le meta du plugin, mais dans le table spip_urls comme les autres URLs, avec type=, id_objet=0.
On ajoute une colonne 'page' utilisée uniquement pour les URLs des pages.
La migration est effectuée automatiquement lors de la mise à jour du plugin. Seules les URLs éventuellement non migrées (doublon dans la BDD) sont conservées dans la meta urls_pages. Réfléchir à leur prise en charge (message sur la page de gestion des URLs ?).

Le gros avantage de cette version, c'est qu'on à plus besoin de modifier le htaccess, ni d'indiquer le rewritebase dans la configuration.
On a juste à saisir une URL, et c'est tout.
De plus, on peut rentrer manuellement les pages, on ne se repose pas sur la détection automatique des squelettes, qui n'est donnée qu'à titre indicatif.

La fonction qui détecte les fonds de page a été refactorisée et migrée pour être utilisée dans une boucle DATA : <BOUCLE_fonds(DATA){source fonds_pages}>.
Par défaut, une boucle <BOUCLE_urls(URLS)> ne retourne pas les URLs des pages, à moins d'utiliser le critère {tout}.

On est obligé de surcharger la fonction urls_propres_dist() pour prendre en compte les pages, faute de pipeline.
Néammoins, la fonction dist est toujours utilisée pour tout autre URL que les pages.

Les URLs des pages sont gérées à partir du menu des URLs : publication -> gestion des URLs. On ajoute un menu sur cette page pour basculer entre la gestion des URLs des objets éditoriaux, et celle des URLs des pages.

Cette version est compatible SPIP >= 3.1

C'est un premier jet donc, il reste quelques pétouilles à finir.
À tester, mais pas en production !

Location:
_plugins_/urls_pages/trunk
Files:
23 added
4 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/urls_pages/trunk/base/urls_pages.php

    r70628 r99665  
    33 * Déclarations relatives à la base de données
    44 *
    5  * @plugin     urls_pages
    6  * @copyright  2013
    7  * @author     Charles Razack
     5 * @plugin     URLs Pages Personnalisées
     6 * @copyright  2016
     7 * @author     tcharlss
    88 * @licence    GNU/GPL
    9  * @package    SPIP\urls_pages\Pipelines
    109 */
    1110
    12 if (!defined('_ECRIRE_INC_VERSION')) return;
     11if (!defined('_ECRIRE_INC_VERSION')) {
     12        return;
     13}
    1314
    1415
     
    2324 */
    2425function urls_pages_declarer_tables_interfaces($interfaces) {
    25         $interfaces['table_des_traitements']['URL_PAGE'][]= 'url_perso(%s)';
     26        $interfaces['table_des_traitements']['URL_PAGE'][]= 'url_page_personnalisee(%s)';
    2627        return $interfaces;
    2728}
  • _plugins_/urls_pages/trunk/lang/paquet-urls_pages_fr.php

    r70628 r99665  
    22// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
    33
    4 if (!defined('_ECRIRE_INC_VERSION')) return;
     4if (!defined('_ECRIRE_INC_VERSION')) {
     5        return;
     6}
    57
    68$GLOBALS[$GLOBALS['idx_lang']] = array(
    79
    810        // C
    9         'urls_pages_nom' => 'URLs Pages étendues',
    10         'urls_pages_slogan' => 'Gestion des urls de type "page"',
    11         'urls_pages_description' => 'Ce plugin permet de mettre en place des urls personnalisées
    12         pour les squelettes ne correspondant à aucun objet éditorial.<br>
    13         Par défaut, une page "<code>toto.html</code>" est accessible à l\'adresse <code>monsite.com/spip.php?page=toto</code>.<br>
    14         Ce plugin offre la possibilité d\'utiliser une url personnalisée pour ce type de pages :<br>
    15         <ul class="spip">
    16                 <li><code>monsite.com/toto</code></li>
    17                 <li><code>monsite.com/toto.html</code></li>
    18                 <li><code>monsite.com/url-personnalisee-pour-la-page-toto</code></li>
    19         </ul>
    20         La balise <code>#URL_PAGE</code> utilisera ces urls pour les pages concernées.'
     11        'urls_pages_nom' => 'URLs Pages Personnalisées',
     12        'urls_pages_slogan' => 'Gestion des URLs de type « page »',
     13        'urls_pages_description' => 'Ce plugin étend la gestion des URLs personnalisées aux « pages »,
     14        ces squelettes ne correspondant pas aux objets éditoriaux, et pris en charge par la balise #URL_PAGE.
     15
     16        Ainsi, {{spip.php?page=truc}} pourra devenir l\'URL de votre choix : {{url-personnalisee-pour-la-page-truc}}.
     17
     18        Rendez-vous dans dans le menu [{{Publication &rarr; Gestion des URLs &rarr; URLs des pages->?exec=controler_urls_pages]}}.'
    2119
    2220);
  • _plugins_/urls_pages/trunk/lang/urls_pages_fr.php

    r77649 r99665  
    77
    88        // C
    9         'cfg_titre_parametrages' => 'URLs pages personnalisées',
    10 
    11         // L
    12         'label_liste_pages' => 'Pages et urls correspondantes',
    13         'label_code_htaccess' => 'Code .htaccess',
     9        'champ_page_label' => 'Page',
     10        'champ_page_tri' => 'Page',
     11        'champ_page_explication' => 'Indiquez le nom de fichier du squelette correspondant à la page, sans l\'extension .html et en respectant la casse : unePage.html &rarr; unePage.
     12        Les objets éditoriaux et leurs déclinaisons sont proscris !',
     13        'champ_page_explication_fond' => 'Squelette de la page : @fond@',
     14        'champ_fond_label' => 'Fond',
     15        'champ_statut' => 'Statut',
     16        'champ_url_label' => 'URL',
     17        'champ_url_explication' => 'N\'indiquez que la partie après la racine du site : @racine@',
     18        'champ_dossier_tri' => 'Dossier',
     19        'champ_action' => 'Action',
    1420
    1521        // E
    16         'explication_formulaire_1' => 'Ce formulaire permet de mettre en place des urls personnalisées pour les squelettes ne correspondant à aucun objet éditorial : les pages. Leurs urls seront prises en charge par la balise <tt>#URL_PAGE</tt>.',
    17         'explication_code_htacess' => 'Après validation du formulaire, copiez le code ci-dessous dans le fichier <tt>.htaccess</tt>.',
    18         'explication_rewritebase' => 'Si votre fichier <tt>.htaccess</tt> comporte une directive RewriteBase, indiquez la ici.',
    1922        'explication_dossier' => 'Dossier contenant les squelettes',
    20         'erreur_url_non_libre' => 'Cette url est déjà utilisée',
    21         'erreur_url_doublon' => 'Une url doit être unique',
    22         'erreur_pages_obsoletes' => 'Les pages suivantes sont enregistrées en configuration mais ne sont plus actives. Les squelettes correspondants ont du être renommés, supprimés, ou le plugin d\'où ils proviennent désactivé. Il est recommandé de vider ces champs.',
     23        'explication_generale' => 'Les « pages » sont des squelettes ne correspondant à aucun objet éditorial.
     24
     25        Gérez ici leurs URLs, elles sont prises en compte par la balise <tt>#URL_PAGE</tt>.
     26
     27        L\'onglet « fonds des pages » contient une liste des pages sans URL personnalisée, à titre indicatif.
     28        Si une page n\'y figure pas, vous pouvez tout de même lui en attribuer une en saisissant la page manuellement.',
     29        'erreur_fond_absent' => 'Fond absent !',
     30        'erreur_page_fond_absent' => 'Aucun squelette ne correspond à cette page !',
     31        'erreur_page_fond_objet_editorial' => 'Il s\'agit d\'un objet éditorial. Utilisez la méthode habituelle pour éditer leurs URLs.',
     32        'erreur_page_mauvais_format' => 'Le nom de la page est incorrect. Il doit s\'agir du nom de fichier d\'un squelette, sans l\'extension .html',
     33        'erreur_url_doublon' => 'Cette URL est déjà utilisée',
     34        'erreur_page_doublon_url' => 'Une URL existe déjà pour cette page : « @url@ »',
    2335
    2436        // I
    25         'info_aucun_squelette' => 'Aucun squelette n\'a été trouvé',
     37        'info_0_url_page' => 'Aucune URL de page',
     38        'info_1_url_page' => '1 URL de page',
     39        'info_nb_urls_pages' => '@nb@ URLs de pages',
     40        'info_0_fond_page' => 'Aucun fond de page',
     41        'info_1_fond_page' => '1 fond de page',
     42        'info_nb_fonds_pages' => '@nb@ fonds de pages',
     43        'info_fonds_pages' => 'Fonds de pages',
     44        'info_0_fond' => 'Aucun squelette n\'a été trouvé',
     45        'icone_ajouter_url_page' => 'Ajouter l\'URL d\'une page',
     46        'icone_attribuer_url_page' => 'Attribuer une URL',
     47        'icone_supprimer_url_page' => 'Supprimer l\'URL de cette page',
     48        'icone_editer_url_page' => 'Éditer l\'URL de cette page',
     49        'icone_choisir_page' => 'Choisir une page',
     50        'icone_supprimer' => 'Supprimer',
     51        'icone_editer' => 'Éditer',
     52        'icone_choisir' => 'Choisir',
     53        'icone_retour' => 'Retour',
    2654
    2755        // M
    28         'message_ok_code' => '. <br>N\'oubliez pas de copier le code présent en fin du formulaire dans le fichier .htaccess'
     56        'message_url_update_ok' => 'L\'URL a été mise à jour',
     57        'message_url_insert_ok' => 'L\'URL a été enregistrée',
     58        'menu_onglet_pages' => 'URLs des pages',
     59        'menu_onglet_fonds' => 'Fonds des pages',
     60        'menu_urls_pages' => 'URLs des pages',
     61        'menu_urls_objets' => 'URLs des objets éditoriaux',
     62
     63        // T
     64        'titre_pages_detectees' => 'Pages détectées',
     65        'titre_urls_pages' => 'URLs des pages',
     66        'titre_editer_url_page' => 'Éditer l\'URL d\'une page',
     67        'titre_creer_url_page' => 'Créer l\'URL d\'une page',
     68        'titre_nouvelle_url' => 'Nouvelle URL',
     69
    2970);
    3071
  • _plugins_/urls_pages/trunk/paquet.xml

    r99322 r99665  
    22        prefix="urls_pages"
    33        categorie="statistique"
    4         version="0.1.13"
     4        version="1.0.0"
     5        schema="1.0.0"
    56        etat="experimental"
    6         compatibilite="[3.0.0;3.1.*]"
     7        compatibilite="[3.1.0;3.2.*]"
    78        logo="prive/themes/spip/images/urls_pages.png"
    8         documentation="http://contrib.spip.net/URLs-pages-personnalisees"
     9        documentation="http://contrib.spip.net/4345"
    910>
    1011
    11         <nom>URLs pages personnalisées</nom>
    12         <!-- Gestion des variantes d'URL des pages (squelettes ne correspondant à aucun objet éditorial) -->
     12        <nom>URLs Pages Personnalisées</nom>
     13        <!-- Gestion des variantes des URLs des pages (squelettes ne correspondant à aucun objet éditorial) -->
    1314
    14         <auteur>Charles Razack</auteur>
     15        <auteur lien="http://www.bravecassine.com">tcharlss</auteur>
    1516
    1617        <credit lien="http://www.openstudio.fr/Pages-personnalisees-et-reecriture.html">OpenStudio pour le tutoriel d'origine</credit>
     
    2021        <necessite nom="urls" compatibilite="[1.4.0;]" />
    2122
    22         <pipeline nom="declarer_tables_interfaces" inclure="base/urls_pages.php" /><!-- traitement balise #URL_PAGE -->
    23         <pipeline nom="affiche_milieu" inclure="urls_pages_pipelines.php" /><!-- formulaire page configurer_urls -->
     23        <pipeline nom="declarer_tables_interfaces" inclure="base/urls_pages.php" />
     24        <pipeline nom="affiche_milieu" inclure="urls_pages_pipelines.php" />
     25        <pipeline nom="pre_boucle" inclure="urls_pages_pipelines.php" />
    2426
    2527</paquet>
  • _plugins_/urls_pages/trunk/prive/style_prive_plugin_urls_pages.html

    r77680 r99665  
    55#SET{foncee,##ENV{couleur_foncee,9dba00}}
    66
    7 .formulaire_spip .editer_url_page .url          { margin-#ENV{left}:.66em; float:#ENV{right}; font-size:.8em; font-weight:normal; }
    8 .formulaire_spip .editer_url_page.on            { background-color:[#(#GET{claire}|couleur_eclaircir|couleur_eclaircir)]; }
    9 .formulaire_spip .editer_url_page.on .text      { border-color:#GET{foncee}; }
     7.liste-objets.urls_pages .liste .erreur {color: red; vertical-align: middle;}
     8/*.liste-objets.fonds_pages tbody .dossier {border-right: 1px solid #dfdfdf}*/
     9.liste-objets.urls_pages .page,
     10.liste-objets.fonds_pages .page {font-weight: bold}
     11/*.liste-objets.urls_pages tbody .fond,
     12.liste-objets.fonds_pages tbody .dossier {font-family: mono}*/
     13.pseudo.bouton_action_post .submit {display: inline-block}
     14
     15/* formulaire d'édition */
     16.formulaire_editer_url_page .editer_page {position: relative}
     17.formulaire_editer_url_page #choisir_page {z-index: 2; position: absolute; bottom: 10px; #ENV{right}: 15px;}
  • _plugins_/urls_pages/trunk/todo.txt

    r99322 r99665  
    1 Plugin URLs pages personnalisées : A faire
     1Plugin URLs Pages Personnalisées : choses à faire
    22
    3 - Si le plugin "squelettes par mot clé" est actif, exclure de la liste les squelettes <objet>-xxx.html
    4 - Actuellement, les urls des pages sont enregistrées dans le meta du plugin.
    5   Il faudrait peut-être les enregistrer dans la table spip_urls pour éviter les doublons.
    63- Lorsqu'on désactive le plugin, on se retrouve avec un message d'erreur lié à l'absence de la fonction url_perso.
    74  On est obligé de faire un ?var_mode=recalcul
    8 
  • _plugins_/urls_pages/trunk/urls_pages_fonctions.php

    r71114 r99665  
    11<?php
    22/**
    3  * Fonctions
     3 * Fonctions utiles au plugin URLs Pages Personnalisées
    44 *
    5  * @plugin     URLs pages personnalisées
    6  * @copyright  2013
    7  * @author     Charles Razack
     5 * @plugin     URLs Pages Personnalisées
     6 * @copyright  2016
     7 * @author     tcharlss
    88 * @licence    GNU/GPL
    9  * @package    SPIP\URLs Personnalisées étendues\Fonctions
     9 * @package    SPIP\Urls_pages_personnalisees\Fonctions
    1010 */
    1111
    12 if (!defined('_ECRIRE_INC_VERSION')) return;
     12if (!defined('_ECRIRE_INC_VERSION')) {
     13        return;
     14}
    1315
    14 /*
    15  * Ré-écriture des urls produites par la balise #URL_PAGE
    16  * en fonction des valeurs enregistrées dans la meta du plugin
    17  * spip.php?page=toto => une-belle-url-pour-toto
    18  * cf. http://www.openstudio.fr/Pages-personnalisees-et-reecriture.html
     16/**
     17 * Prendre en compte les URLs personnalisées pour la balise #URL_PAGE
     18 *
     19 * On utilise l'URL personnalisée si présente en base :
     20 * `spip.php?page=X => une-belle-url-pour-la-page-X`
     21 *
     22 * @see http://www.openstudio.fr/Pages-personnalisees-et-reecriture.html
    1923 *
    2024 * @param string $url
    21  *     url de base
     25 *     URL de base : spip.php?page=X
    2226 * @return string $url
    23  *     url éventuellement ré-écrite
    24 **/
    25 function url_perso ( $url ) {
    26         include_spip('inc/config');
    27         $rewritebase = lire_config('urls_pages/rewritebase');
    28         if ( is_array(lire_config('urls_pages')) )
    29                 $liste_pages = array_filter(lire_config('urls_pages'));
    30         $page = parametre_url($url, 'page');
    31         if ( $page
    32           and is_array($liste_pages)
    33           and in_array($page, array_flip($liste_pages)) ) {
    34                 $rewrite = $liste_pages[$page]; // nouvelle url
    35                 $path = parse_url($url, PHP_URL_PATH); // analyse l'url et retourne un tableau des composants
    36                 $url = parametre_url($path, 'page', ''); // vide l'url du parametre 'page'
    37                 $url = str_replace($path, '/'.$rewrite, $url); // ajoute la nouvelle url
    38                 if (isset($rewritebase) AND strlen($rewritebase)) $url = $rewritebase.$url; // ajoute le rewritebase si present
     27 *     URL personnalisée si elle existe,
     28 *     sinon l'URL de base
     29 */
     30function url_page_personnalisee($url) {
     31
     32        if (!function_exists('url_de_base')){
     33                include_spip('inc/utils');
     34        }
     35        $url_de_base = url_de_base();
     36        // retrouver la page d'après spip.php?page=X
     37        $query = parse_url($url, PHP_URL_QUERY);
     38        parse_str(parse_str($query));
     39        if (isset($page)
     40                and $url_personnalisee = sql_getfetsel('url', 'spip_urls', array('page = ' . sql_quote($page)))
     41        ){
     42                $url = rtrim($url_de_base, '/') . '/' . $url_personnalisee;
    3943        }
    4044
     
    4347
    4448
    45 ?>
     49/**
     50 * Trouver le fond d'une page
     51 *
     52 * @uses trouver_fond()
     53 *
     54 * @return string | boolean
     55 *     Chemin du squelette s'il existe
     56 *     False sinon
     57 */
     58function trouver_fond_page($page) {
     59
     60        // D'abord dans les dossiers de ZCore/ZPIP
     61        $dossier_z =
     62                (defined('_DIR_PLUGIN_ZCORE') ? 'content' :
     63                (defined('_DIR_PLUGIN_ZPIP') ? 'contenu' :
     64                false));
     65        if ($dossier_z) {
     66                $fond = trouver_fond($page, $dossier_z);
     67        }
     68        // Sinon dans le dossier des squelettes
     69        if (!$fond) {
     70                $fond = trouver_fond($page);
     71        }
     72
     73        return $fond;
     74}
     75
     76
     77/**
     78 * Renvoie une liste des pages et le chemin de leurs squelettes.
     79 *
     80 * @uses inc_pages_to_array()
     81 */
     82function urls_pages_lister_pages(){
     83        $pages_to_array = charger_fonction('fonds_pages_to_array', 'inc');
     84        return $pages_to_array();
     85}
     86
     87
     88/**
     89 * Renvoie une liste des objets éditoriaux et de leurs surnoms
     90 *
     91 * @return array
     92 */
     93if (!function_exists('lister_objets_types')) {
     94function lister_objets_types(){
     95
     96        include_spip('base/objets');
     97        $objets = array();
     98        $tables_objets = lister_tables_objets_sql();
     99        foreach($tables_objets as $table => $desc) {
     100                // type de base
     101                if (isset($desc['type'])
     102                        and ($type = $desc['type'])
     103                ) {
     104                        $objets[] = $type;
     105                } else {
     106                        $objets[] = objet_type($table);
     107                }
     108                // surnoms
     109                if (isset($desc['type_surnoms'])
     110                        and count($type_surnoms = $desc['type_surnoms'])
     111                ) {
     112                        $objets = array_merge($objets, $type_surnoms);
     113                }
     114        }
     115
     116        return $objets;
     117}
     118}
  • _plugins_/urls_pages/trunk/urls_pages_pipelines.php

    r70628 r99665  
    11<?php
    22/**
    3  * Plugin Urls Pages Etendues
    4  * (c) 2013 Charles Razack
    5  * Licence GNU/GPL
     3 * Pipelines utilisees par le plugin URLs Pages Personnalisées
     4 *
     5 * @plugin     URLs Pages Personnalisées
     6 * @copyright  2016
     7 * @author     tcharlss
     8 * @licence    GNU/GPL
     9 * @package    SPIP\Urls_pages_personnalisees\pipelines
    610 */
    711
    812
    913/**
    10  * formulaire configurer_url
     14 * Ajouter du contenu dans le conteneur central
     15 *
     16 * - Page « controler_urls » : ajout du menu pour basculer entre les URLs normales et celles des pages
     17 *
     18 * @pipeline affiche_gauche
    1119 */
    1220function urls_pages_affiche_milieu($flux){
    13         $texte = "";
    14         $exec = $flux['args']['exec'];
    1521
    16         if ( $exec == 'configurer_urls' )
    17                 $texte = recuperer_fond('prive/squelettes/contenu/configurer_urls_pages');
    18 
    19         if ($texte)
    20                 if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
    21                         $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
    22                 else
    23                         $flux['data'] .= $texte;
     22        if (isset($flux['args']['exec'])
     23                and $flux['args']['exec'] == 'controler_urls'
     24        ){
     25                $cherche  = '/(<h1[^>]{0,}>)([^>]+)(<\/h1>)/';
     26                $titre = _T('urls_pages:menu_urls_objets');
     27                $menu = recuperer_fond('prive/squelettes/inclure/menu_urls_pages');
     28                $flux['data'] = preg_replace($cherche, "$menu$1$titre$3", $flux['data']);
     29        }
    2430
    2531        return $flux;
     
    2733
    2834
    29 ?>
     35/**
     36 * Modifier les requêtes SQL servant à générer les boucles
     37 *
     38 * Boucles URLS : exclure des résultats les URLs des pages en absence du critère {tout}
     39 *
     40 * @pipeline pre_boucle
     41 *
     42 * @param  object $boucle
     43 * @return objetc $boucle
     44**/
     45function urls_pages_pre_boucle($boucle){
     46
     47        if ($boucle->type_requete == 'spip_urls') {
     48                $id_table = $boucle->id_table;
     49                $page     = $id_table .'.page';
     50                $id_objet = $id_table .'.id_objet';
     51                $type     = $id_table .'.type';
     52                // Restreindre aux URLs sans page
     53                if (!isset($boucle->modificateur['tout'])) {
     54                                $boucle->where[]= array("'='", "'$page'", "'\"\"'");
     55                }
     56        }
     57
     58        return $boucle;
     59}
Note: See TracChangeset for help on using the changeset viewer.