Dernières publications dans la catégorie «Tutoriels» | Jean-Philippe Fleury http://www.jpfleury.net/tutoriels/index.php Dernières publications dans la catégorie «Tutoriels» | Jean-Philippe Fleury Gestion de projet avec Git http://www.jpfleury.net/tutoriels/gestion-projet-git.php http://www.jpfleury.net/tutoriels/gestion-projet-git.php <!-- APERÇU: automatique --> <p>Ce qui suit illustre une méthode de travail avec <a href="http://git-scm.com/">Git</a>.</p> <h2>Création du projet</h2> <p>Note: l'emplacement distant utilisé en exemple pour héberger le projet est sur <a href="http://baregit.com/">Baregit</a>.</p> <pre><code>cd /tmp mkdir projet-demo cd projet-demo git init touch version.txt git add . git commit -m "Début de versionnage de projet-demo" git remote add origin git@baregit.com:utilisateur/projet-demo.git git push origin master </code></pre> <h2>Création d'une branche de développement</h2> <p>La branche de développement est utilisée pour préparer la prochaine version. C'est donc sur cette branche que le travail s'effectue. La branche <code>master</code> contient toujours le code de la dernière version stable publiée.</p> <pre><code>git checkout -b dev touch fichier1 git add . git commit -m "Message fichier1" git push origin dev </code></pre> <h2>Création d'une branche topique</h2> <p>Une branche topique, créée à partir de la branche <code>dev</code>, est utile pour travailler sur une nouvelle fonctionnalité, qui pourra être ajoutée plus tard dans la branche de développement.</p> <pre><code>git checkout -b fonctionnalite1 touch fonctionnalite1-fichier1 git add . git commit -m "Message fonctionnalite1-fichier1" touch fonctionnalite1-fichier2 git add . git commit -m "Message fonctionnalite1-fichier2" </code></pre> <h2>Continuation du travail sur la branche de développement</h2> <pre><code>git checkout dev touch fichier2 git add . # On met de côté les modifications en cours pour travailler sur autre chose. git stash touch fichier3 git add . git commit -m "Message fichier3" # On retourne travailler sur les changements précédemment mis de côté. git stash pop git status git add . git commit -m "Message fichier2" git push origin dev </code></pre> <h2>Travail sur le même projet à partir d'un autre emplacement</h2> <pre><code>git clone git@baregit.com:utilisateur/projet-demo.git ../autre-emplacement-projet-demo cd ../autre-emplacement-projet-demo git checkout dev touch fichier4 git add . git commit -m "Message fichier4" git push origin dev </code></pre> <h2>Retour au premier emplacement</h2> <p>Pour mettre à jour une branche locale, il est souvent conseillé d'utiliser <code>git pull</code>. Cette commande effectue en réalité deux actions:</p> <ul> <li><code>git fetch</code>, pour récupérer les modifications présentes à l'emplacement distant;</li> <li><code>git merge</code>, pour intégrer ces modifications dans la branche locale courante.</li> </ul> <p>Si la branche locale ne contient pas de modifications inconnues de l'emplacement distant, <code>git merge</code> va simplement déplacer la référence <code>HEAD</code> vers la dernière révision. Exemple (les graphiques ont été générés avec <a href="http://git.gnome.org/browse/gitg/">gitg</a>):</p> <ul> <li><p>Avant <code>git merge</code>:</p> <p><img src="http://www.jpfleury.net/site/fichiers/images/modele-developpement-git/avant-git-merge-ff.png" alt="Historique du projet avant la fusion des modifications présentes à l'emplacement distant" width="248" height="99" /></p></li> <li><p>Après <code>git merge</code>:</p> <p><img src="http://www.jpfleury.net/site/fichiers/images/modele-developpement-git/apres-git-merge-ff.png" alt="La référence «HEAD» a été déplacée vers la dernière révision" width="303" height="99" /></p></li> </ul> <p>Dans le cas contraire, les deux branches divergent et une nouvelle révision va être créée pour contenir les modifications de la fusion. Cette révision va bien sûr apparaître dans l'historique. Exemple:</p> <ul> <li><p>Avant <code>git merge</code>:</p> <p><img src="http://www.jpfleury.net/site/fichiers/images/modele-developpement-git/avant-git-merge-no-ff.png" alt="Historique du projet avant la fusion des modifications présentes à l'emplacement distant" width="264" height="123" /></p></li> <li><p>Après <code>git merge</code>:</p> <p><img src="http://www.jpfleury.net/site/fichiers/images/modele-developpement-git/apres-git-merge-no-ff.png" alt="La fusion des modifications a été effectuée et une nouvelle révision a été créée" width="416" height="147" /></p></li> </ul> <p>Avec le temps, l'historique va en être considérablement alourdi. Pour cette raison, j'utilise <code>git rebase</code>, qui permet de réappliquer les modifications locales à la suite de la dernière révision de la branche distante. L'historique demeure donc linéaire. Exemple:</p> <ul> <li><p>Avant <code>git rebase</code>:</p> <p><img src="http://www.jpfleury.net/site/fichiers/images/modele-developpement-git/avant-git-merge-no-ff.png" alt="Historique du projet avant la mise à jour avec l'emplacement distant" width="264" height="123" /></p></li> <li><p>Après <code>git rebase</code>:</p> <p><img src="http://www.jpfleury.net/site/fichiers/images/modele-developpement-git/apres-git-rebase.png" alt="La branche locale a été mise à jour avec l'emplacement distant à l'aide d'une recombinaison des révisions" width="248" height="123" /></p></li> </ul> <p>Voir l'article <a href="http://notes.envato.com/developers/rebasing-merge-commits-in-git/">Rebasing Merge Commits in Git</a> concernant l'importance d'utiliser le paramètre <code>-p</code> (<code>--preserve-merges</code>) avec <code>git rebase</code>.</p> <p>Note: au lieu des deux commandes <code>git fetch origin</code> et <code>git rebase -p origin/dev</code> ci-dessous, un alias peut être créé:</p> <pre><code>git config --global alias.frp '!git fetch origin &amp;&amp; git rebase -p origin/$(branche="$(git symbolic-ref HEAD 2&gt;&amp;-)" &amp;&amp; echo ${branche#refs/heads/})' </code></pre> <p>Pour que l'alias soit actif seulement pour le projet courant, enlever le paramètre <code>--global</code>.</p> <pre><code>cd ../projet-demo git checkout dev git fetch origin git rebase -p origin/dev touch fichier5 git add . git commit -m "Message fichier5" echo "1.0" &gt; version.txt git add . git commit -m "Mise à jour du numéro de version (1.0)" </code></pre> <h2>Publication de la première version</h2> <p>Lorsque la branche de développement reflète l'état désiré pour la prochaine version du logiciel, elle est fusionnée dans la branche <code>master</code>, et une étiquette est créée avec le numéro de version.</p> <p>Le paramètre <code>--no-ff</code> est utilisé lors de la fusion pour s'assurer que les révisions de la branche de développement soient regroupées dans l'historique et facilement distingables des autres révisions.</p> <p>Aussi, le paramètre <code>-s</code> utilisé avec <code>git tag</code> permet de créer une étiquette signée. Utiliser le paramètre <code>-a</code> pour créer un objet <code>tag</code> sans le signer.</p> <pre><code>git checkout master git fetch origin git rebase -p origin/master git checkout dev git rebase -p master git push origin dev git checkout master git merge --no-ff dev git tag -s 1.0 -m "Message 1.0" git push --tags origin master </code></pre> <h2>Développement de la deuxième version</h2> <pre><code>git checkout dev touch fichier6 git add . git commit -m "Message fichier6" git push origin dev </code></pre> <h2>Continuation du développement de la fonctionnalité 1</h2> <p>Noter l'utilisation de <code>git rebase</code> pour ajouter dans la branche topique les modifications de la branche de développement.</p> <pre><code>git checkout fonctionnalite1 git rebase -p dev touch fonctionnalite1-fichier3 git add . git commit -m "Message fonctionnalite1-fichier3" </code></pre> <h2>Intégration de la fonctionnalité 1</h2> <p>Lors qu'une foncitonnalité est terminée, la branche topique correspondante est fusionnée à la branche de développement, et est ensuite supprimée. Noter l'utilisation du paramètre <code>--no-ff</code> lors de la fusion.</p> <pre><code>git checkout dev git fetch origin git rebase -p origin/dev git checkout fonctionnalite1 git rebase -p dev git checkout dev git merge --no-ff fonctionnalite1 git branch -d fonctionnalite1 </code></pre> <h2>Continuation et fin du développement de la deuxième version</h2> <pre><code>touch fichier7 git add . git commit -m "Message fichier7" echo "2.0" &gt; version.txt git add . git commit -m "Mise à jour du numéro de version (2.0)" git push origin dev </code></pre> <h2>Publication de la deuxième version</h2> <pre><code>git checkout master git fetch origin git rebase -p origin/master git merge --no-ff dev git tag -s 2.0 -m "Message 2.0" git push --tags origin master </code></pre> <p>L'historique résultant de ce projet de démonstration est le suivant:</p> <p><img src="http://www.jpfleury.net/site/fichiers/images/modele-developpement-git/projet-demo-gitg.png" alt="" width="436" height="387" /></p> Tue, 01 May 2012 00:59:00 -0400 Une installation optimisée de Drupal http://www.jpfleury.net/tutoriels/installation-optimisee-de-drupal.php http://www.jpfleury.net/tutoriels/installation-optimisee-de-drupal.php <!-- APERÇU: automatique --> <p>Quelques pistes pour une installation optimisée de Drupal 6. Il s'agit d'un brouillon, une sorte de mémo, et il faudrait bien que je prenne le temps de faire du gros ménage là-dedans et d'en faire un tutoriel un peu plus abouti.</p> <h2>La base</h2> <p>Premièrement, on récupère la dernière version de Drupal. On trouvera le lien sur <a href="http://drupalfr.org/">l'accueil de Drupal francophone</a>. Ensuite on <a href="http://drupal.org/project/fr">télécharge les fichiers pour le français</a>. Une fois les deux archives extraites, on fusionne les dossiers, ce qui donne par exemple <code>cp -R fr-6.x-1.0/. drupal-6.9</code>. On installe le tout sur son serveur.</p> <h2>La configuration et les modules à ajouter</h2> <p>On a une installation de base de Drupal. Il va falloir ajouter ou configurer plusieurs modules pour modeler Drupal à notre convenance.</p> <h3>Option <em>URLs simplifiées</em></h3> <p>On active les URL simplifiées, option disponible par défaut dans Drupal.</p> <p>On passe donc maintenant de liens <code>?q=node/1</code> à des liens <code>node/83</code>.</p> <h3>Choisir entre conserver ou supprimer les www</h3> <p>Le contenu dupliqué est le fait qu'un même contenu puisse être accessible par plus d'une URL. C'est le cas par exemple si un site présente le même contenu sur exemple.com et www.exemple.com. Les moteurs de recherche essaient de réduire le contenu dupliqué dans leurs résultats. Par exemple, s'il y a du contenu dupliqué reconnu par Google, ce dernier affiche à la dernière page de résultats une phrase de ce type:</p> <blockquote> <p>Pour limiter les résultats aux pages les plus pertinentes (total : 128), Google a ignoré certaines pages à contenu similaire. Si vous le souhaitez, vous pouvez relancer la recherche en incluant les pages ignorées.</p> </blockquote> <p>C'est mieux de choisir soi-même. Commençons par choisir entre un site avec www ou un site sans www. Dans le .htaccess de Drupal, il y a une section qu'on peut décommenter. Voir ce qui suit ce paragraphe:</p> <pre><code># If your site can be accessed both with and without the 'www.' prefix, you # can use one of the following settings to redirect users to your preferred # URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option: </code></pre> <h3>Page title</h3> <p>Le <a href="http://drupal.org/project/page_title">module Page Title</a> permet de personnaliser pour chaque page le contenu de la balise <code>title</code> dans l'en-tête HTML de notre page. Par exemple, on peut saisir soi-même le contenu, faire ajouter automatiquement le terme associé, etc. Dans ce dernier cas, s'il n'y a pas de terme, plusieurs séparateurs peuvent se suivre. Par exemple, si on met <code>[page-title] | [term] | [site-name]</code> comme contenu de la balise <code>title</code> et qu'il n'y a pas de terme, on va obtenir comme titre <code>Mon titre | | Mon site</code>. J'ai fait un rapport de bogue à ce sujet: <a href="http://drupal.org/node/386014">http://drupal.org/node/386014</a>.</p> <p>Pour ajouter la pagination dans le titre, voir la demande <a href="http://drupal.org/node/224262">http://drupal.org/node/224262</a> et le code proposé. En espérant que le correctif soit intégré au module Token bientôt.</p> <p>À noter que ce module dépend du <a href="http://drupal.org/project/token">module Token</a>.</p> <h3>Meta tags</h3> <p>Le <a href="http://drupal.org/project/nodewords">module Meta tags</a> permet de personnaliser plusieurs métabalises, dont <code>keywords</code> et <code>description</code>. Bien sûr le référencement ne repose plus sur les métabalises, mais il peut y avoir un intérêt quand même. Par exemple, le contenu de la balise <code>description</code> est souvent affiché dans les résultats des moteurs de recherche. Il y a donc un intérêt à la soigner. Pour sa part, la balise <code>keywords</code> pourrait permettre, si son contenu est personnalisé, d'éviter que certaines pages ayant un contenu ressemblant soient considérées comme du contenu dupliqué.</p> <p>Pour la pagination (page 1, page 2, etc.), ce module met pour l'instant <code>noindex</code>. Dans mon cas, ce n'est pas adapté parce que je mets une description de la catégorie sur ces pages. Voir <a href="http://drupal.org/node/294996">http://drupal.org/node/294996</a>, en espérant qu'un correctif soit apporté bientôt.</p> <h3>Pathauto</h3> <p>Le <a href="http://drupal.org/project/pathauto">module Pathauto</a> permet d'obtenir des URL plus parlantes, par exemple <code>ouverture-de-mon-site</code> au lieu de <code>node/1</code>. À noter que ce module dépend du module Path (livré par défaut avec un Drupal de base).</p> <p>Il est recommandé d'installer en complément le module Path redirect.</p> <p>Note: pour que la redirection de flux RSS fonctionne, il faut mettre <code>0/feed</code> dans le champ «Internal feed alias text (leave blank to disable) :». Voir <a href="http://drupal.org/node/263199">Taxonomy term path feed problem</a>.</p> <h3>Path redirect</h3> <p>Le <a href="http://drupal.org/project/path_redirect">module Path redirect</a> permet de rediriger d'anciennes adresses vers les nouvelles dans le cas où on modifie l'URL d'une page. Quand le module Pathauto est également installé, ce dernier peut être configuré pour faire automatiquement les redirections.</p> <h3>Global Redirect</h3> <p>Le <a href="http://drupal.org/project/globalredirect">module Global Redirect</a> s'assure qu'il n'y a pas de page ayant deux adresses différentes. Si une page est accessible par exemple par <code>node/1</code> et <code>ouverture-de-mon-site</code>, le module va effectuer une redirection 301 de la première adresse vers la seconde.</p> <h3>Formulaire de contact</h3> <p>Maintenant on ajoute un forumlaire de contact en activant le module Contact, livré par défaut avec Drupal.</p> <h3>GeSHi Filter (coloration syntaxique)</h3> <p>Si vous voulez ajouter proprement du code source sur vos pages, le <a href="http://drupal.org/project/geshifilter">module GeShi Filter</a> permet d'activer la coloration syntaxique pour du code.</p> <h3>Markdown filter</h3> <p>Si vous voulez utiliser la syntaxe Markdown dans vos pages, installez le <a href="http://drupal.org/project/markdown">module Markdown filter</a>.</p> <p><strong>Note: si on active GeSHi Filter et Markdown filter, il faut bien faire attention à ce que le filtre Markdown soit analysé avant le filtre GeSHi.</strong></p> <h3>Mailhandler</h3> <p>Si vous voulez créer du contenu par courriel, installez le <a href="http://drupal.org/project/mailhandler">module Mailhandler</a>.</p> <h3>Mailsave</h3> <p>Le <a href="http://drupal.org/project/mailsave">module Mailsave</a> est un complément à Mailhandler. Il permet entre autres de créer automatiquement des fichiers attachés aux pages créées par Mailhandler selon les pièces jointes au courriel.</p> <p>À noter qu'on doit aussi activer le module Upload (qui est livré par défaut avec Drupal), étant donné que Mailsave se base sur les droits définis pour ce module.</p> <h3>CustomError</h3> <p>Le <a href="http://drupal.org/project/customerror">module CustomError</a> permet de configurer les pages d'erreur 403 et 404 sans avoir à créer de noeud spécial.</p> <p>Ne pas oublier d'aller sur la page <code>admin/settings/error-reporting</code> et configurer les adresses comme ceci:</p> <pre><code>customerror/403 customerror/404 </code></pre> <h3>XML Sitemap</h3> <p>Le module XML Sitemap permet de générer automatiquement un plan du site.</p> <p><strong>Note: en date du 17 février 2009, ce module est encore en version de développement pour Drupal 6.</strong></p> <h3>CCK</h3> <p>Le <a href="http://drupal.org/project/cck">module CCK</a> est quasiment un incontournable. Il permet d'ajouter des champs selon nos besoins, donc de créer ou de configurer des types de contenu.</p> <h3>Views</h3> <p>Le <a href="http://drupal.org/project/views">module Views</a> est le compagnon de CCK. Il permet de créer selon des critères précis des listes de contenu. Ensuite, on peut utiliser ces listes pour former notre page d'accueil, des pages de section, des blocs, etc.</p> <h3>Advanced Help</h3> <p>Pour profiter d'une aide avancée de Views, il faut installer le <a href="http://drupal.org/project/advanced_help">module Advanced Help</a>.</p> <h3>Insert View</h3> <p>Le <a href="http://drupal.org/project/insert_view">module Insert View</a> permet d'insérer des vues (générées par le module Views) dans du contenu sans devoir passer par du code PHP. Exemple: <code>[view:nom]</code>.</p> <h3>robots.txt</h3> <p>Si nécessaire, personnaliser ce fichier (oui, il faudrait que je développe un peu plus :)).</p> <h3>filter_default</h3> <p>À faire.</p> <h3>Comment mail</h3> <p>Le <a href="http://drupal.org/project/commentmail">module Comment mail</a> permet de recevoir un courriel à chaque nouveau commentaire posté sur le site.</p> <h3>Comment Notify</h3> <p>Le <a href="http://drupal.org/project/comment_notify">module Comment Notify</a> ajoute une option dans le formulaire de commentaire pour permettre aux internautes de s'abonner aux réponses à leur commentaire ou de s'abonner à tous les nouveaux commentaires de l'article.</p> <h3>Captcha</h3> <p>Le <a href="http://drupal.org/project/captcha">module Captcha</a> permet d'éviter le pourriel dans les commentaires.</p> <h3>Pagination</h3> <p>Le <a href="http://drupal.org/project/pagination">module Pagination</a> permet de paginer de longues pages. Cependant, ce module incrémente déjà la variable GET page, ce qui entre en conflit avec le correctif que j'ai appliqué à Drupal pour faire la même chose. Voir le rapport <a href="http://drupal.org/node/386154">http://drupal.org/node/386154</a>.</p> <h3>Optimiser la structure des pages</h3> <p>Par défaut, la plupart des thèmes mettent le titre du site dans une balise <code>h1</code> et le titre de la page (ou du noeud) dans une balise <code>h2</code>. À changer. Le titre du site devrait être dans une <code>div</code> et le titre de page dans un <code>h1</code>. Sur la page d'accueil, c'est pas une mauvaise idée de mettre le titre de site exceptionnellement dans un <code>h1</code>.</p> <h3>Faire débuter le numéro de la pagination à 1 et non 0</h3> <p>Par exemple, le lien vers la deuxième page est ?page=1, mais ça devrait plutôt être ?page=2. J'ai soumis un <a href="http://drupal.org/node/385270">correctif pour le fichier includes/pager.inc</a>.</p> <h3>Term Fields et afficher la description des termes de taxonomie seulement sur la première page</h3> <p>Par défaut, ce n'est pas vraiment possible d'avoir une page personnalisée pour la page d'index des termes de taxonomie. Par exemple, la page <code>/taxonomy/term/id</code> va lister les noeuds faisant partie de ce terme, avec possiblement la description dans le haut si cette information a été remplie. Si la description s'affiche, elle va s'affiche pour toutes les pages (donc sur la page 1, page 2, page 3, etc.). Si on veut écrire une grande description, ce n'est pas adapté. Ce que je propose, c'est donc de faire afficher la description complète sur la première page, et seulement un petit résumé sur les pages suivantes.</p> <p>On va donc installer le <a href="http://drupal.org/project/term_fields">module Term Fields</a>, qui va nous permettre d'ajouter des champs personnalisés aux termes. On va donc installer ce module et ajouter un champ résumé, qu'on va faire afficher seulement sur les pages supérieures à 1. Pour ce faire, on peut ajouter par exemple la fonciton suivante dans notre fichier <code>template.php</code>:</p> <pre><code>/* Afficher la description des termes de taxonomie seulement sur la première page, et afficher le résumé sur les pages subséquentes */ /** * Render a taxonomy term page HTML output. * * @param $tids * An array of term ids. * @param $result * A pager_query() result, such as that performed by taxonomy_select_nodes(). * * @ingroup themeable */ function phptemplate_taxonomy_term_page($tids, $result) { drupal_add_css(drupal_get_path('module', 'taxonomy') .'/taxonomy.css'); $output = ''; // Only display the description if we have a single term, to avoid clutter and confusion. if (count($tids) == 1) { $term = taxonomy_get_term($tids[0]); $description = $term-&gt;description; // Check that a description is set. if (!empty($description)) { $output .= '&lt;div class="taxonomy-term-description"&gt;'; // Si on se trouve sur la première page, on affiche la description complète if (empty($_GET['page'])) { $output .= '&lt;p class="legende"&gt;&lt;span&gt;Description de la catégorie &lt;em&gt;' . $term-&gt;name . '&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="taxonomy-term-description-contenu"&gt;'; $output .= filter_xss_admin($description); $output .= '&lt;/div&gt;'; } // Sinon on affiche seulement le résumé. else { $output .= '&lt;p class="legende"&gt;&lt;span&gt;Résumé de la catégorie &lt;em&gt;' . $term-&gt;name . '&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="taxonomy-term-description-contenu"&gt;'; $output .= term_fields_get_field($term-&gt;tid, 'resume'); $output .= l ('&lt;p class="taxonomy-term-description-contenu-plus"&gt;En savoir plus sur la catégorie &lt;em&gt;' . $term-&gt;name . '&lt;/em&gt;...&lt;/p&gt;', taxonomy_term_path($term), array('html' =&gt; TRUE)); $output .= '&lt;/div&gt;'; } $output .= '&lt;/div&gt;'; } } $output .= taxonomy_render_nodes($result); return $output; } </code></pre> <p>Et un style qui l'accompagne:</p> <pre><code>/* Description des termes de taxonomie */ div.taxonomy-term-description { margin-top: 1.5em; border: 1px solid #eee; } p.legende { margin-top: -0.8em; margin-left: 10px; float: left; } p.legende span { padding: 0px 10px; background-color: #fff; font-weight: bold; } div.taxonomy-term-description-contenu { clear: left; padding: 10px 0 10px 10px; } p.taxonomy-term-description-contenu-plus { margin-top: 10px; } </code></pre> <h3>Syndication</h3> <p>Le <a href="http://drupal.org/project/syndication">module Syndication</a> permet de créer une page recenssant tous les flux RSS du site. On peut également générer des flux RSS en mariant plusieurs termes.</p> <h3>Taxonomy Menu</h3> <p>Le <a href="http://drupal.org/project/taxonomy_menu">module Taxonomy Menu</a> permet d'ajouter dans un menu une liste de terme pour chaque vocabulaire.</p> <p><em>Note: j'utilisais avant le <a href="http://drupal.org/project/taxonomy_blocks">module Taxonomy Blocks</a>, qui permet de créer un menu listant chaque terme d'un vocabulaire (optionnellement, on peut faire afficher entre parenthèses le nombre d'éléments de chaque terme). Cependant, dû à un certains nombre de bogues, dont le problème de non-génération des classes habituelles pour les listes (par exemple <code>leaf first</code>), j'ai changé pour le module Taxonomy Menu.</em></p> <h3>Piwik - Web analytics</h3> <p>Le <a href="http://drupal.org/project/piwik">module Piwik - Web analytics</a> permet d'ajouter le code nécessaire au suivi statistique des visites à l'aide du logiciel <a href="http://piwik.org/">Piwik</a> (que l'on doit installer à part).</p> <h3>Node Hierarchy</h3> <p>Le <a href="http://drupal.org/project/nodehierarchy">module Node Hierarchy</a> permet de créer facilement une hiérarchie entre les pages, par exemple en assignant telle page enfant de telle autre page parente. On peut configurer pathauto pour que l'URL reflète la hiérarchie, et on peut également faire créer automatiquement le menu hiérarchisé.</p> <h3>Menu block</h3> <p>Le <a href="http://drupal.org/project/menu_block">module Menu block</a> permet d'ajouter un bloc qui reflète le menu dans lequel la page courante fait partie.</p> <p><em>Note: le <a href="http://drupal.org/project/local_menu">module Local Menu</a> permet de réaliser la même chose, mais pour seulement un bloc, alors que Menu block permet de créer autant de bloc qu'on veut.</em></p> <h3>Table of Contents</h3> <p>Le <a href="http://drupal.org/project/tableofcontents">module Table of Contents</a> permet de générer une table des matières d'une page en se basant sur les titres HTML de niveau 1 à 6.</p> <h3>Search config</h3> <p>Le <a href="http://drupal.org/project/search_config">module Search config</a> permet de configurer les options dans la recherche avancée (et plus).</p> <h2>Autres modules potentiellement utiles</h2> <h3>Taxonomy Title</h3> <p>Le <a href="http://drupal.org/project/taxonomy_title">module Taxonomy Title</a> permet de configurer le titre (contenu de la balise h1 ou h2 selon les thèmes) pour les pages d'index de chaque terme.</p> <h3>SiteMenu</h3> <p>Le <a href="http://drupal.org/project/sitemenu">module SiteMenu</a> permet de générer une page listant tous les noeuds classés par catégorie.</p> <p><strong>Note: en date du 7 mars 2009, ce module est encore en version de développement pour Drupal 6.</strong></p> <h2>À tester plus tard</h2> <h3>Taxonomy redirect</h3> <p>Le <a href="http://drupal.org/project/taxonomy_redirect">module Taxonomy redirect</a> permet de changer l'adresse de taxonomie, mais ne permet pas encore une redirection automatique de l'ancienne adresse par défaut de Drupal vers la nouvelle.</p> <h2>À faire</h2> <ul> <li>Avoir des URL simplifiées aussi pour la pagination, donc se débarrasser des <code>?page=</code>.</li> </ul> Tue, 01 May 2012 01:00:00 -0400