Planète

Par badgones

Putty, SSH, OpenSSH, Windows et Linux

Voici un super tuto pour créer ses clés SSH, et pouvoir les utiliser à la fois sur Linux et Windows.

Using Putty on Windows to login Linux securely via OpenSSH

  • Submitted by: Man-wai CHANG
  • Update by: Man-wai CHANG
  • Date Submitted: 31 May 2006
  • Document Version: 1.0
  • Last Updated: 02/02/2008 18:46:43

This is a guide about using Putty on Windows with OpenSSH on Linux. You would learn about how to:

en lire plus

Par juliendubreuil
julien dubreuil
Depuis 2009 maintenant, je développe avec le CMS/CMF Drupal. J’étais à la recherche d’un framework capable de remplacer un projet et je n’ai jamais arrêté de m’en servir depuis ce moment.

Ajouter des classes CSS à la balise body facilement

Ajouter des classes CSS à la balise body facilement

Je ne sais pas si vous avez déjà voulu ajouter une classe sur la balise body en Drupal 6 mais ce n’était pas le truc le plus évident à faire. La meilleure solution se résumait à modifier le fichier template.php, à implémenter le hook template_preprocess() et à ajouter ses valeurs au tableau $vars[‘body_classes’], bref, par rapport au besoin c’était un poil compliqué.

Drupal 7 permet maintenant de faire ça plus facilement et directement dans un .module. Pour cela il faut utiliser le hook : hook_preprocess_HOOK() qui permet aux modules d’intervenir sur sur n’importe quel preprocess de thème.


1
2
3
4
5
6
7
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd">* Implements hook_preprocess_HOOK().</span>
</span><span class='line'><span class="sd">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_preprocess_html</span><span class="p">(</span><span class="o">&amp;</span><span class="nv">$vars</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'> <span class="c1">// Ajout d&#39;une nouvelle classe au body</span>
</span><span class='line'> <span class="nv">$vars</span><span class="p">[</span><span class="s1">&#39;classes_array&#39;</span><span class="p">][]</span> <span class="o">=</span> <span class="s1">&#39;ma-nouvelle-classe&#39;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

Puisque la construction html de la page et donc la génération des classes pour le body est faite lors du template_preprocess_html il nous faut implémenter le hook_preprocess_html. Dans l’exemple ci-dessus j’ai juste ajouté une nouvelle classe à mon body mais vous pouvez faire tout ce que vous voulez lors de cette étape vous avez entre les mains toutes les infos permettant la construction de la structure html de la page.

Alors, la vie n’est pas plus simple avec Drupal 7 ? :)

Crédits Photo – exey

Par badgones

Poids module Drupal : Ordonner les modules Drupal pour choisir l'ordre de chargement

Afin d'ordonner les modules Drupal pour choisir l'ordre de chargement de ceux-ci, il suffit d'implémenter le hook install du module et de changer le poids associé.

Pour être plus clair, il faut créer un fichier nom_module.install ayant pour contenu ceci :

function NOM_MODULE_install() {
  db_query("UPDATE {system} SET weight = '-1' WHERE name = 'NOM_MODULE' AND type = 'module'");
}

Par bisonbleu

Module | Unique Field

Récemment, j'ai fait face au casse-tête suivant : comment prévenir la création de doublons pour un type de contenu (tdc) spécifique. Par exemple, comnent empêcher un utilisateur de remplir le même formulaire deux fois, de créer une 2e inscription pour un même événement. La question vaut son pesant d'or surtout s'il s'agit d'un événement payant. Sans compter que la chasse aux doublons pollueurs n'a rien de bien divertissant.

On le sait, Drupal permet que deux noeuds aient exactement le même nom ou titre. On fait comment alors?

Share page with AddThis
Par bisonbleu

Module | Unique Field

Récemment, j'ai fait face au casse-tête suivant : comment prévenir la création de doublons pour un type de contenu (tdc) spécifique. Par exemple, comnent empêcher un utilisateur de remplir le même formulaire deux fois, de créer une 2e inscription pour un même événement. La question vaut son pesant d'or surtout s'il s'agit d'un événement payant. Sans compter que la chasse aux doublons pollueurs n'a rien de bien divertissant.

On le sait, Drupal permet que deux noeuds aient exactement le même nom ou titre. On fait comment alors?

Share page with AddThis
Par bisonbleu

Module | Unique Field

Récemment, j'ai fait face au casse-tête suivant : comment prévenir la création de doublons pour un type de contenu (tdc) spécifique. Par exemple, comnent empêcher un utilisateur de remplir le même formulaire deux fois, de créer une 2e inscription pour un même événement. La question vaut son pesant d'or surtout s'il s'agit d'un événement payant. Sans compter que la chasse aux doublons pollueurs n'a rien de bien divertissant.

On le sait, Drupal permet que deux noeuds aient exactement le même nom ou titre. On fait comment alors?

Par badgones

Drupal module Book et profondeur du sommaire

Quand on écrit un "Livre" via le module book de Drupal, on a une génération automatique du menu (sommaire), ou plûtot des enfants d'une page.
Or, on ne peut pas modifier la profondeur de cet affichage, qui affiche donc seulement les enfants directs de la page en cours, mais pas ses "petits-fils" (ou alors je suis preneur de la solution).

Voilà donc la solution pour modifier la profondeur du sommaire :
1- télécharger le module booktree (dispo en attachement aussi)
2- l'installer et l'activer
3- dans le fichier template.php de votre thème, ajouter le hook template_preprocess_book_navigation(&$variables), avec comme contenu :

function THEME_preprocess_book_navigation(&$variables) {
  $book_link = $variables['book_link'];

en lire plus

Par badgones

Drupal et groupe de champs multiples CCK, explication et correction d'erreur Wysiwyg - TinyMCE

Pour créer un groupe de champs multiple sous Drupal 6, la fonction n'est pas disponible de base avec le module CCK 2.
En fait, celle-ci a seulement été ajoutée dans CCK 3, qui est en béta, et non stable à l'heure actuelle. Mais on peut simplement l'ajouter dans CCK 2, en téléchargeant le module CCK3, en le décompressant, et en ajoutant le contenu du répertoire cck/modules/content_multigroup à CCK2, au même endroit.
Il faut en plus copier le répertoire cck/js du module CCK3 dans le répertoire du module CCK2, et ça fonctionne parfaitement.

Maintenant, vous avez un nouveau type de champs CCK "Multigroup", à utiliser comme un "Group", avec le même principe d'arborescence.

Une erreur est cependant visible : si vous utilisez un champ de type Wysiwyg dans le multigroup, le contenu de ce champ est supprimé lors du click sur "Add more values", ce qui est vraiment pénible. 
Pour ça, 1 solution qui m'a prit du temps :

en lire plus

Par pounard

How to fetch back Drupal 7 master password (uid 1)

Sometimes you lose your master password. Won't describe here how you managed to do it, since distraction that lead to that kind of errors is a burden to carry for all of us.

Drupal 6 was quite easy to recover, because its passwords were encrypted using the well known MD5 digest algorithm, while Drupal 7 uses SHA512 and a custom seed depending on the site. This statement makes us unable to use well known functions for that.

In order to recover your password, there are two easy steps.

Par badgones

Comment modifier le formulaire de recherche Drupal (Theme Drupal Search form)

Voila comment modifier le formulaire de recherche Drupal pour ajouter les CSS et le texte que l'on souhaite :

/**
* Override or insert PHPTemplate variables into the search_theme_form template.
*
* @param $vars
*   A sequential array of variables to pass to the theme template.
* @param $hook
*   The name of the theme function being called (not used in this case.)
*/
 
function montheme_preprocess_search_theme_form(&$vars, $hook) {
 
  // Modify elements of the search form
  $vars['form']['search_theme_form']['#title'] = t('Recherche sur mon site');
 
  // Set a default value for the search box
  $vars['form']['search_theme_form']['#value'] = t('Entrez ici votre recherche');
 
  // Add a custom class to the search box
  $vars['form']['search_theme_form']['#attributes'] = array('class' => t('customsearch'));

en lire plus

Par badgones

Solution pour l'erreur Captcha - Drupal : The answer you entered for the CAPTCHA was not correct.

Vous avez un problème avec le module Captcha, qui vous refuse à chaque fois les soumissions de vos modules custom?
Vous avez un message du genre "La réponse saisie pour le CAPTCHA est incorrecte.", ou "The answer you entered for the CAPTCHA was not correct." ?
Voici peut-être une solution qui règle le problème (en tout cas, qui a marché pour moi après de nombreuses heures de recherche) :

Il a "suffit" que je rajoute dans mon formulaire la valeur "#tree"=>0, en code cela donne :

$form['captcha'] = array(
  '#type' => 'captcha',
     '#weight' => 40,
     '#tree' =>0,  

en lire plus

Par haza
Nicolas Meyer

La premiere "initiative" de Drupal 8

Apres la sortie de Drupal 7, tout se met en place pour preparer la version 8.

Un des gros changements dans le cycle de développement qui va être mis en place pour Drupal 8 concerne l'apparition des "initiatives". On ne connait pas encore toutes les initiatives qui vont être mises en place, mais celles-ci concerneront sans doute les gros axes de Drupal 8 que Dries a évoqué lors de sa keynote.

La première initiative a été officiellement dévoilée le 28 mars dernier (oui, je sais, j'ai du retard) et concerne la gestion de la configuration de Drupal ("Configuration management" en anglais).
Le terme de "configuration management" peut sembler un peu abstrait pour beaucoup. Dans les faits, il s'agirait, dans l'idéal, d'une sorte de "Settings API" qui permetterait de pouvoir stocker toute la configuration de Drupal de manière plus "propre" qu'actuellement. En deux mots, avoir une sorte de fichier de configuration global.

Depuis features, on se raproche peu-à-peu de ce St Graal Drupalien, néanmoins, features ne couvre pas l'ensemble de nos besoins. Bien sûr, il est désormais facile d'exporter des views, des panels ... et même des variables si on passe via Strongarm. Mais il ne faut pas oublier que ceci n'est possible uniquement si l'auteur du module a pensé à integrer son code avec features.

Le vrai but du "Configuration management" est de proposer un mécanisme permettant de maintenir l'intégrité et la tracabilitée des changements de configuration dans la vie du site. Il serait par exemple possible de :

  • "Locker" la configuration d'un site en prod, afin qu'aucun changement ne puisse être effectuté.
  • Pouvoir "logguer" les changements de configuration entre le temps t et t+1, rendant alors possible le retour arrière si un soucis est detecté, ou bien encore rendant possible le fait de pouvoir "rejouer" ces changemements sur une autre instance du site

Ces changements ouvriront également la voie un meilleur contrôle du "content staging". Pouvoir fusionner facilement des changements effectués par les utilisateurs du site (les commentaires, les votes, ...) et la configuration d'une instance de dev par exemple, pour y apporter les mises à jour souhaitées, puis ensuite pouvoir reverser tout ceci vers la prod sans soucis majeur.

Comme Dries l'a evoqué lors de sa Keynote, des "Initiative Owner" sont nommé afin de suivre les avancements des ces projets.

Greg Dunlap
Greg Dunlap

C'est Greg Dunlap (heyrocker sur drupal.org) qui sera responsable de cette initiative.
Greg est déjà connu pour avoir énormément contribuer au module Deployment et a déjà beaucoup réfléchi à toutes les problématiques de staging et de déploiement de code.

Espérons qu'il saura réaliser ce que nous attendons tous.

David Strauss
David Strauss

Il sera épaulé par David Strauss, qui sera en charge du suivi de l'architecture et des API à mettre en place.

En attendant, n'oubliez pas de suivre les avancements et reflexions autour de ce projet sur le groups, http://groups.drupal.org/build-systems-change-management

Par juliendubreuil
julien dubreuil
Depuis 2009 maintenant, je développe avec le CMS/CMF Drupal. J’étais à la recherche d’un framework capable de remplacer un projet et je n’ai jamais arrêté de m’en servir depuis ce moment.

Créer un champ texte avec auto-complétion en utilisant la form Api

Créer un champ texte avec auto-complétion en utilisant la form Api

Voici un petit bout de code et quelques explications afin de créer un champ texte avec auto-complétion pour vos formulaire en utilisant la form api de Drupal.

Dans l’exemple suivant nous allons créer un formulaire avec un champ texte qui permettra de sélectionner un noeud parmi tous les contenus publiés sur le site. Pour pimenter l’exercice on permettra à notre utilisateur de saisir plusieurs valeurs, comme il est possible de faire dans un champ tag de taxonomie.

Étape 1 : Création de la fonction de récupération de informations

La première chose à faire consiste à créer une fonction de callback afin de récupérer les titres des nodes en base de données que l’on renverra par la suite au format json.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">* Callback de récupération des titres des noeuds.</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">mymodule_autocomplete_node_title</span><span class="p">(</span><span class="nv">$key</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$ret</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// L&#39;utilisateur insère une liste de tag séparés par des virgules et</span>
</span><span class='line'>  <span class="c1">// on ne traite que le dernier tag.</span>
</span><span class='line'>  <span class="nv">$keys</span> <span class="o">=</span> <span class="nx">drupal_explode_tags</span><span class="p">(</span><span class="nv">$key</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Récuperation du dernier tag en cour de saisie par l&#39;utilisateur.</span>
</span><span class='line'>  <span class="nv">$last_string</span> <span class="o">=</span> <span class="nx">trim</span><span class="p">(</span><span class="nb">array_pop</span><span class="p">(</span><span class="nv">$keys</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$last_string</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">&quot;SELECT DISTINCT (n.nid), n.title</span>
</span><span class='line'><span class="s2">           FROM {node} n</span>
</span><span class='line'><span class="s2">           WHERE status = 1</span>
</span><span class='line'><span class="s2">           AND UPPER(n.title) LIKE UPPER(&#39;%%%s%%&#39;)</span>
</span><span class='line'><span class="s2">           ORDER BY n.title ASC&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$query</span> <span class="o">=</span> <span class="nx">db_query_range</span><span class="p">(</span><span class="nv">$sql</span><span class="p">,</span> <span class="nv">$last_string</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Récupération des valeurs saisies précédemment.</span>
</span><span class='line'>    <span class="nv">$prefix</span> <span class="o">=</span> <span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$keys</span><span class="p">)</span> <span class="o">?</span> <span class="nb">implode</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">,</span> <span class="nv">$keys</span><span class="p">)</span> <span class="o">.</span> <span class="s1">&#39;, &#39;</span> <span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Génération de la liste de résultats à renvoyer.</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nx">db_fetch_array</span><span class="p">(</span><span class="nv">$query</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>     <span class="nv">$ret</span><span class="p">[</span><span class="nv">$prefix</span> <span class="o">.</span> <span class="nv">$row</span><span class="p">[</span><span class="s1">&#39;nid&#39;</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">check_plain</span><span class="p">(</span><span class="nv">$row</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Transformation des résultats au format Json, suivi d&#39;un exit pour</span>
</span><span class='line'>    <span class="c1">// être sûr que l&#39;on ne renverra rien du thème.</span>
</span><span class='line'>    <span class="nx">drupal_json</span><span class="p">(</span><span class="nv">$ret</span><span class="p">);</span>
</span><span class='line'>    <span class="k">exit</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span>

Lorsque vous faites des comparaisons entres des chaînes de caractères pensez à tout mettre en minuscule ou majuscule si vous ne voulez pas prendre en compte la casse, ça vous permettra d’être plus tolérant sur l’orthographe.
Il est préférable de limiter le jeu de résultats obtenus, d’une part parce que ça ne nous servirait à rien d’afficher une liste de 400 titres et d’autre part, cela consommerait plus de ressources de base de données. Ainsi pour limiter ma requête j’ai utilisé la fonction db_query_range() au lieu de mettre directement une limite dans ma requête.

Étape 2 : Ajout d’une nouvelle entrée dans le menu

Maintenant que nous avons crée la récupération des titres des noeuds, il nous faut ajouter une entrée de menu pour que les données renvoyées par la fonction soit accessible depuis une url.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd">* Implementation of hook_menu().</span>
</span><span class='line'><span class="sd">*</span>
</span><span class='line'><span class="sd">* @return An array of menu items.</span>
</span><span class='line'><span class="sd">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">mymodule_menu</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$items</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'>  <span class="c1">// Url de récupération des titres des nodes pour l&#39;auto-complétion.</span>
</span><span class='line'>  <span class="nv">$items</span><span class="p">[</span><span class="s1">&#39;mymodule/autocomplete/node_title&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;page callback&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;mymodule_autocomplete_node_title&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;access arguments&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;access content&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="nx">MENU_CALLBACK</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$items</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

N’oubliez pas qu’après chaque modification du menu il est nécessaire de flusher le cache :)
Pour tester si vous obtenez bien des résultats, rendez-vous sur l’url que vous avez créée dans le hook_menu suivi d’un / et d’un caractère pour simuler la frappe d’un utilisateur. Ce qui donne par exemple : mymodule/autocomplete/node_title/a

Étape 3 : Paramétrage du formulaire

La dernière étape, vous l’aurez deviné si vous avez tout suivi, c’est la création du formulaire.


1
2
3
4
5
6
7
8
9
10
11
12
13
<span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">* Formulaire custom de selection de nodes.</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">mymodule_listing_nodes_form</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$form</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'>  <span class="nv">$form</span><span class="p">[</span><span class="s1">&#39;nids&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;#type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;textfield&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;#title&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Sélectionnez vos contenus&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="c1">// Il est important de donner l&#39;url de récupération des titres sinon ça ne marche pas...</span>
</span><span class='line'>    <span class="s1">&#39;#autocomplete_path&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;mymodule/autocomplete/node_title&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$form</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

Le secret réside dans le fait de configurer l’option #autocomplete_path du widget textfield en lui paramétrant une url et c’est tout!

Voilà, vous savez maintenant créer des champs textes avec auto-complétion et au final c’était pas bien compliqué! :)
Je suis sûr que vous avez déjà tout compris mais bon au cas où et histoire de rentabiliser l’espace disque de mon hébergement voici les sources de cet exemple (une grand première dans l’histoire de ce blog).

Bonus

Petite astuce pendant que l’on parle d’auto-complétion. Certains naviguateurs proposent d’utiliser les réponses que vous avez déjà saisies auparavant comme votre nom, prénom et autres, mais parfois vous ne voulez pas autoriser ça dans vos forms. Et bien pour désactiver ça il vous suffit de définir la complétion du champ à off et le tour est joué.


1
2
3
4
<span class='line'><span class="nv">$form</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>  <span class="s1">&#39;#type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;textfield&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;#attributes&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;autocomplete&#39;</span> <span class="o">=&gt;</span><span class="s1">&#39;off&#39;</span><span class="p">),</span>
</span><span class='line'><span class="p">);</span>
</span>

Par badgones

Site Drupal lent, comment l'optimiser ? Un début de réponse

Vous avez un site Drupal qui est lent? Vous voulez l'optimiser? Voici un début de réponses :

Modules à installer :

  • css_gzip (dernière version en document attaché)
  • javascript_aggregator (dernière version en document attaché)

Cache Drupal et config des 2 modules :

  • allez sur la page /admin/settings/performance, et activez le cache Drupal en mode "normal"
  • minimum cache lifetime => ce que vous voulez, si vous faites pas souvent de mise à jour de page, mettez 1 jour
  • page compression => "activé"
  • block cache => activé
  • optimize css => activé, et cochez gzip css
  • optimize et minified javascript => activé, cochez gzip javascript
  • sauvegardez

en lire plus

Pages