Message d'avertissement

The subscription service is currently unavailable. Please try again later.

Hook dans module

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour

Mon intérêt pour Drupal est assez nouveau, mais je me pose déjà des questions un peu pointue...

Ce que je souhaiterais faire c'est d'avoir un module/plugin qui soit capable de
- parser le contenu d'une page
- remplacer certaines occurrences par autre chose

Ca parait somme toute assez simple mais je coince.

Après avoir lu la doc, je pensais utiliser "hook_init", mais sans conviction.

Quelqu'un aurait-il une idée?

Merci

Alexandre

Forum : 

Hello
Peux tu préciser ce que tu veux faire ? c'est un peu vague.
Veux tu changer seulement les occurences dans l'article ou sur toute la page ?

Sinon avec un preprocess : tu peux déjà tester ça directement dans template.php :

<?php
// remplace ton theme par le nom de ton theme
tontheme_preprocess_node(&$vars) {
  
str_replace('le', 'pouet', $vars['content']);
}
?>

Ca devrait suffire à transformer tous les "le" de ton article en "pouet" ;-)

Sinon a priori c'est un bon boulot pour un filtre custom (les format d'entrée de drupal) mais je n'ai jamais fait ça et c'est sans doute beaucoup plus compliqué.

Bonjour

Merci pour ta réponse.

En fait, j'ai développer un plugin Joomla! qui permet d'afficher une Google Maps perso.

J'aimerais donc pouvoir l'intégrer à Drupal, au sein d'un article. On y copierait un code particulier {map param=map} que le plugin détecterait et remplacerait par du code approprié pour faire afficher la gmap.

Je sais qu'il existe le module GMap, mais je préfère le faire à ma sauce.

Voilà, si vous avez des idées?

Merci

Alexandre

Le module Gmap fait cela il me semble, je te conseillerai donc de ne pas ré-inveter la roue et de te servir de ce module.

Si toutefois tu souhaites quand même faire ton propre module je t'invite à te pencher sur la création de filtre, j'ai donné un exemple de module un peu plus haut.

Dans ton module il faudra implémenter le hook_filter
http://api.drupal.org/api/function/hook_filter/6

Voici un sujet qui en parle sur drupalfr.org : http://drupalfr.org/forum/support/developpement/22147-comment-creer-un-f...

Tu peux aussi jeter un oeil au code du module Gmap qui implémente ce hook dans le gmap.module

Guillaume, merci pour tes réponses.

Je connais le module GMap, mais je souhaite créer le mien, car j'ai mis en place une page web qui permet de créer sa carte de toute pièce.
Cet outil génère un code à coller dans le corps d'un article, code qui devrait être interprété pour afficher la carte.

Pour l'instant tout est ok avec Joomla!, maintenant je m'attaque à Drupal et aux autres ensuite.

La parie JS qui gère la carte est commune à tous les CMS, il n'y a que les parties "hook" qui sont spécifiques.

Voilà pourquoi je tiens à coder mon propre filtre ou module.

Je te remercie pour tes liens et je vais les consulter.

Je vous tiens au courant.

Alexandre

Hello
Je comprends pourquoi Guillaume Bec évoque un filtre custom, toutefois je pense qu'un simple hook_nodeapi qui parse à la volée la balise au moment de la vue du node ($op == 'view" dans le nodeapi) ou même un simple preprocess que tu peux aussi implémenter dans un module peut largement faire le job.

De plus un filtre devra être manuellement mis par l'utilisateur pour pouvoir parser la balise, alors qu'un hook_nodeapi ou un preprocess effectuera le remplacement directement.

Ca me parait plus simple à développer et plus simple pour celui qui installera le module.

précisions : un preprocess est juste une étape intermédiaire qui te permet de manipuler toutes les variables d'un template juste avant qu'elle n'arrive au template. par exemple, pour manipuler les variables d'un node, du peux implémenter un "monmodule_preprocess_node(&vars)"

Bonjour

J'ai tester plusieurs choses mais mes tests ne sont pas super...

Après avoir créer un module dans site/all/module et activé, rien ne se passe.

J'ai récupérer un module cité plus haut que j'ai un peu modifier pour tester, ainsi que le preprocess.

A part activer le module, il faut faire autre chose?

Voici le code php de mon module :

<?php

function filter_exemple_preprocess_node($vars)
{
      
print_r($vars);
}

function filter_exemple_filter($op, $delta = 0, $format = -1, $text = '') {
 

  switch ($delta) {

    // First we define the simple string substitution filter.
   
case 0:

      switch ($op) {
       
// This description is shown in the administrative interface, unlike the
        // filter tips which are shown in the content editing interface.
       
case 'description':
          return
t('Substitutes a custom string for the string "foo" in the text.');

        // We don't need the "prepare" operation for this filter, but it's required
        // to at least return the input text as-is.
       
case 'prepare':
         
//return $text;
return "prepare";

        // The actual filtering is performed here. The supplied text should be
        // returned, once any necessary substitutions have taken place.
       
case 'process':
          return
str_replace('a', 'e', $text);

        // Since we allow the administrator to define the string that gets
        // substituted when "foo" is encountered, we need to provide an
        // interface for this customization. Note that the value of $format
        // needs to be provided as part of the form name, so that different
        // customization can be done for this filter in each of the different
        // input formats that may use it.
       
case 'settings':
         
$form['filter_example'] = array(
           
'#type' => 'fieldset',
           
'#title' => t('Foo filter'),
           
'#collapsible' => TRUE,
           
'#collapsed' => TRUE,
          );
         
$form['filter_example']["filter_example_foo_$format"] = array(
           
'#type' => 'textfield',
           
'#title' => t('Substitution string'),
           
'#default_value' => variable_get("filter_example_foo_$format", 'bar'),
           
'#description' => t('The string to substitute for "foo" everywhere in the text.')
          );
          return
$form;
      }
      break;

    // Next is our "time tag" filter.
   
case 1:

      switch ($op) {
       
// This description is shown in the administrative interface, unlike the
        // filter tips which are shown in the content editing interface.
       
case 'description':
          return
t('Inserts the current time in the place of a &lt;time /&gt; tags.');

        // Since this filter will return a different result on each page load, we
        // need to return TRUE for "no cache" to ensure that the filter is run
        // every time the text is requested. Setting this to TRUE will force
        // every filter in associated input formats to be run on every access,
        // so only disable caching if absolutely required.
       
case 'no cache':
          return
TRUE;

        // This filter is a little trickier to implement than the previous one.
        // Since the input involves special HTML characters (< and >) we have to
        // run the filter before HTML is escaped/stripped by other filters. But
        // we want to use HTML in our result as well, and so if we run this filter
        // first our replacement string could be escaped or stripped. The solution
        // is to use the "prepare" operation to escape the special characters, and
        // to later replace our escaped version in the "process" step.
        //
        // We'll use [filter-example-time] as a replacement for the time tag.
        // Note that in a more complicated filter a closing tag may also be
        // required. For more information, see "Temporary placeholders and
        // delimiters" at http://drupal.org/node/209715.
       
case 'prepare':
         
///return preg_replace('!<time ?/>!', '[filter-example-time]', $text);
return "prepare";

        // Now, in the "process" step, we'll search for our escaped time tags and
        // to the real filtering.
       
case 'process':
         
//return str_replace('[filter-example-time]', '<em>' . format_date(time()) . '</em>', $text);
     
return "process";
      }
      break;
  }
}
?>