Blog

Un ami à moi m'a signalé que mon pseudo était écrit en énorme dans la dernière keynote de Dries Buytaert montrant les contributeurs Drupal :) Dans le slide #10, et aussi dans la vidéo, autour de 1:00. Je suis célèbre !

La magie de l'aléatoire :) Sur cette image là, qui reflète mieux les proportions, je suis en tout petit :) :

/**
* Implements hook_cron_queue_info().
*/
function MYMODULE_cron_queue_info() {
$queues = array();
$queues['MYMODULE_queue_notify'] = array(
'worker callback' => 'MYMODULE_queue_notify_worker',
'time' => 15,
);
return $queues;
}
 
/**
* Queue worker for sending notification mails.
*/
function MYMODULE_queue_notify_worker($params) {
drupal_mail('MYMODULE', 'notify', $params['to'], language_default(), $params, $params['from']);
}
 
/**
* Implements hook_mail().
*/
function MYMODULE_mail($key, &$message, $params) {
$language = $message['language'];
$message['subject'] = $params['subject'];
$message['body'][] = $params['message'];
}
 
/**
* Implements hook_rules_action_info().
*/
function MYMODULE_rules_action_info() {
return array(
'MYMODULE_rules_action_mail' => array(
'label' => t('Send mail'),
'group' => 'MYMODULE',
'parameter' => array(
'to' => array(
'type' => 'text',
'label' => t('To'),
'description' => t('The e-mail address or addresses where the message will be sent to. The formatting of this string must comply with RFC 2822.'),
),
'subject' => array(
'type' => 'text',
'label' => t('Subject'),
'description' => t("The mail's subject."),
),
'message' => array(
'type' => 'text',
'label' => t('Message'),
'description' => t("The mail's message body."),
),
'from' => array(
'type' => 'text',
'label' => t('From'),
'description' => t("The mail's from address. Leave it empty to use the site-wide configured address."),
'optional' => TRUE,
),
),
),
);
}
 
/**
* Action: Add notification mails to the queue.
*/
function MYMODULE_rules_action_mail($to, $subject, $message, $from = NULL, $settings, RulesState $state, RulesPlugin $element) {
// Gather params.
$params = array(
'to' => str_replace(array("\r", "\n"), '', $to),
'from' => !empty($from) ? str_replace(array("\r", "\n"), '', $from) : NULL,
'subject' => $subject,
'message' => $message,
);
// Add to the queue.
$queue = DrupalQueue::get('MYMODULE_queue_notify');
$queue->createItem($params);
}

Lorsqu'une vue utilise des filtres exposés, par défaut Views rend la vue avec tous les résultats. Pour que la vue soit rendue vide :

  • Ajouter un argument "Global: Null"
  • Action to take if argument is not present: Provide default argument
  • Default argument type: Fixed entry
  • Default argument: let it blank
  • Validator: PHP code
  • PHP validate code:
    if (!empty($view->exposed_input) && count($view->exposed_input) == 1 && isset($view->exposed_input['destination'])) {
    return FALSE;
    }
    return (!empty($view->exposed_input));
  • Action to take if argument does not validate: Display empty text (if you want the view to be rendered)

Et voilà !

Pour créer des patchs GIT en utilisant les branches (nécessaire pour des patchs compatibles avec drush make) :
git clone --branch 7.x-1.x http://git.drupal.org/project/session_api
cd session_api
git checkout -b cron
[edit code...]
git commit -a -m "Use an expiration logic when clearing sessions on cron"
git checkout 7.x-1.x
git diff --no-prefix 7.x-1.x cron > session_api_cron.patch

Il est possible d'utiliser la branche "master" plutôt que "7.x-1.x".

Un script PHP pour facilement créer, supprimer, lister et lier comme amis des comptes de test sur Facebook pour le développement d'applications.

Une version zippée est attachée.

Voici un exemple simple de l'utilisation de la database API :

$results = db_select('authmap', 'am') // 'authmap' is the table name, 'am' the alias
->fields('am', array('uid')) // The alias and the field we want to fetch
->distinct() // Add distinct
->condition('module', 'MYMODULE') // A condition on the 'module' field, 'MYMODULE' value
->condition('authname', $ids, 'IN') // A condition on the 'authname' field, value is in $ids array
->execute() // Execute the query
->fetchCol(); // Fetch column

Il y a de nombreux exemples d'utilisation d'AJAX dans la form API, mais peu sur comment l'utiliser dans du simple HTML. Voici une méthode simple.

Pour créer un lien AJAX dans Drupal, nous devons d'abord créer un élément de menu :

function MYMODULE_menu() {
$items = array();
$items['MYMODULE/ajax'] = array(
'page callback' => 'MYMODULE_ajax_callback',
'access arguments' => TRUE,
'type' => MENU_CALLBACK,
);
$items['MYMODULE/ajax/%/%'] = array(
'page callback' => 'MYMODULE_ajax_callback',
'page arguments' => array(2, 3),
'access arguments' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}

Puis, là ou vous souhaitez créer le lien, ajoutez les librairies :

// Add libraries
drupal_add_library('system', 'drupal.ajax');
drupal_add_library('system', 'jquery.form');

Créez ensuite un lien avec la classe "use-ajax" et un wrapper pour la réponse AJAX :

// Output a link
l(t('AJAX'), 'MYMODULE/ajax/nojs/' . $some_argument, array('attributes' => array('class' => array('use-ajax'))));
// Output a wrapper
'<div id="MYMODULE-wrapper"></div>'

Enfin, créez la fonction de callback :

function MYMODULE_ajax_callback($type = 'ajax', $some_argument) {
if ($type == 'ajax') {
$commands[] = ajax_command_replace('#MYMODULE-wrapper', 'Hey ! Some AJAX content !');
$page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);
}
else {
$output = t("This is some content delivered via a page load.");
return $output;
}
}

Et voilà !

On a parfois besoin d'ajouter des suggestions de templates à un module. Pour cela, il faut altérer le registre du thème et ajouter une suggestion dans la fonction preprocess.

Pour ajouter une suggestion de template de blocks nommé "mytemplate.tpl.php" dans le sous-dossier "theme" de votre module :

/**
* Implementation of hook_theme_registry_alter().
*/
function MYMODULE_theme_registry_alter(&$theme_registry) {
  $theme_registry['block']['theme paths'][] = drupal_get_path('module', 'MYMODULE') . '/theme';
}
 
/**
* Implementation of hook_preprocess_block().
*/
function MYMODULE_preprocess_block(&$variables) {
  $variables['template_files'][] = 'mytemplate';
}

Pour étendre un widget jQUery UI, 3 choses importantes :

  • jQuery UI utilise la fonction data() pour stocker les informations liées au widget. L'identifiant utilisé est le nom de votre widget, il faut donc le copier dans le data original.
  • Pour chaque fonction, il faut appeler la fonction du widget original avec apply().
  • Définir les options par défaut.

$.widget("ui.customsortable", $.extend({}, $.ui.sortable.prototype, {
 
  _init: function(){
    this.element.data('sortable', this.element.data('customsortable'));
    return $.ui.sortable.prototype._init.apply(this, arguments);
  }
 
  // Override other methods here.
 
}));
 
$.ui.customsortable.defaults = $.extend({}, $.ui.sortable.defaults);

Le thème Freshy 2 et le plugin Customize ont été mis à jour pour Wordpress 2.9. J'ai suivi les instructions de http://ocean90.wphelper.de/en/3127/fix-freshy-theme-wordpress. Je n'ai pu pas tester, veuillez me dire si tout fonctionne bien.

N'ayant plus de temps à consacrer au développement de Freshy 2 et Customize, je compte mettre le code source sur GitHub pour permettre à ceux qui le veulent de contribuer directement au développement.

Syndiquer le contenu