Planète

Par j0nathan

Une journée de programmation D8 aux bureaux de Koumbit à Montréal : 18 janvier 2013

La date de tombée pour les nouvelles fonctionnalités du noyeau de Drupal tombe le 18 février 2013. Ça arrive vite, et il reste encore beaucoup de bogues à régler. Soixante-quinze demandes critiques sont encore ouvertes, et à peu près autant ont besoin d'une révision. Avec tout le travail qui reste, la communauté Drupal montréalaise doit faire tout ce qu'elle peut pour rapprocher D8 du fil d'arrivée.

C'est pourquoi l'équipe de Koumbit a décidé de consacrer toute une journée à un code sprint pour Drupal 8. Et nous invitons tous les utilisateurs Drupal de la région à venir à nos bureau pour mettre la main à la tâche.

Si vous êtes comme nous, vous avez à peine eu le temps jouer avec D8. C'est donc une belle occasion de regarder ce qui se passe en dessous du capot, de prendre une longeur d'avance sur les autres et, surtout, de faire une contribution significative pour l'avenir de notre plateforme préférée.

Vous pouvez contribuer de toute sorte de façons: documentation, programmation, tests, et plein d'autres tâches utiles. Une description détaillée du travail qui reste à accomplir se trouve ici:
http://drupal.org/community-initiatives/drupal-core/

Apportez votre ordinateur portable: nous fournirons le wifi et la pizza.

Endroit : 6833 ave de l'Épée, Montreal, QC, suite 308
Date : 2013-01-18 09:00 - 17:00
S'inscrire : http://groups.drupal.org/node/272733

Par j0nathan

Une journée de programmation D8 aux bureaux de Koumbit à Montréal : 18 janvier 2013

La date de tombée pour les nouvelles fonctionnalités du noyeau de Drupal tombe le 18 février 2013. Ça arrive vite, et il reste encore beaucoup de bogues à régler. Soixante-quinze demandes critiques sont encore ouvertes, et à peu près autant ont besoin d'une révision. Avec tout le travail qui reste, la communauté Drupal montréalaise doit faire tout ce qu'elle peut pour rapprocher D8 du fil d'arrivée.

C'est pourquoi l'équipe de Koumbit a décidé de consacrer toute une journée à un code sprint pour Drupal 8. Et nous invitons tous les utilisateurs Drupal de la région à venir à nos bureau pour mettre la main à la tâche.

Si vous êtes comme nous, vous avez à peine eu le temps jouer avec D8. C'est donc une belle occasion de regarder ce qui se passe en dessous du capot, de prendre une longeur d'avance sur les autres et, surtout, de faire une contribution significative pour l'avenir de notre plateforme préférée.

Vous pouvez contribuer de toute sorte de façons: documentation, programmation, tests, et plein d'autres tâches utiles. Une description détaillée du travail qui reste à accomplir se trouve ici:
http://drupal.org/community-initiatives/drupal-core/

Apportez votre ordinateur portable: nous fournirons le wifi et la pizza.

Endroit : 6833 ave de l'Épée, Montreal, QC, suite 308
Date : 2013-01-18 09:00 - 17:00
S'inscrire : http://groups.drupal.org/node/272733

Par admin

Drupal Lyon; "Optimisation SEO" + "de l’Open source aux CMS" le 13 décembre

La réunion-conférence Drupal Lyon du jeudi 13 décembre comprendra 2 parties :
- Conférence "SEO - Optimiser son site Drupal pour les moteurs de recherche" par Stéphane Arrami de Kabyle.com,
- Exposé sur le thème « de l’Open source aux CMS : similitudes et différences » par Paul Blondiaux, bien connu dans la communauté Typo3,
- Questions/Réponses et échanges.

Vous pourrez aussi intervenir pendant les échanges de questions et expériences ou proposer une discussion éclair s'il reste du temps.

Heure ; 19 h. Arrivez à l'heure pour que les élèves puissent vous guider. Merci.

Inscrivez-vous sur http://www.meetup.com/drupal-france-francophonie/events/93834852/ pour la bonne organisation de la réunion !

Réunions suivantes :

  • 24 janvier (date à confirmer) ; Drupal 8 / Léon + Propositions et vote pour les sujets suivants.
Par cutesquirrel
Etienne

Contexte : ne pas afficher les blocs d’une page non autorisée (403) ou non trouvée (404)

En étudiant un peu les fonctionnalités d’aperçu de contenu, j’ai découvert un module très intéressant si vous utilisez le module « context » pour entourer vos contenus de divers blocs. Le problème était que si le contenu n’était pas publié, il n’était donc visible que par son auteur dans mon cas. En revanche, les internautes non authentifiés […]

Par cutesquirrel
Etienne

Comment Drupal dessert-il un hook de menu par rapport à l’URL demandée ?

Après avoir passé sa phase d’initialisation (bootstrap), Drupal appelle depuis l’index.php, la fonction chargée de trouver le bon « hook » de menu qui correspond à l’URL courante. Dans l’ordre, ça donne : menu_execute_active_handler() menu_get_item() _menu_translate() Quelques explications : menu_execute_active_handler() : charge la page de maintenance si le site est en maintenance, ou celle demandée sinon. 3 cas […]

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal, Afficher les erreurs PHP.

Ce billet aurait tout aussi bien pu être nommé, comment faire face à la bien connue page blanche de Drupal. Je suis sûr que ce problème vous est déjà arrivé, vous retrouver nez à nez avec cette page, sans un mot d’explication. Pour comprendre ce qui se passe, quand on en est là et que l’on n’a pas accès aux logs du serveur, c’est mission impossible.

La façon la plus simple pour déboguer est d’afficher les erreurs PHP. D’ailleurs je suis convaincu de l’obligation pour tout développeur de travailler ainsi, vous verrez plus facilement les erreurs (même minimes) de votre code. On peut penser qu’une notice ou deux, par ci, par là ce n’est pas grave, mais lorsqu’elles commencent à s’additionner les unes aux autres, on dégrade les performances du site!

Method 1. La première chose à faire si vous avez accès au fichier php.ini de votre serveur, est de modifier les variables error_reporting, display_errors et display_startup_errors. Cela vous permettra lorsque vous développerez des scripts PHP hors Drupal de voir vos erreurs.

error_reporting = E_ALL
display_errors = On
display_startup_errors = On

Method 2. La deuxième solution consiste à modifier le fichier settings.php de Drupal

error_reporting(-1);
$conf['error_level'] = 2;
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

A partir de maintenant vous devriez voir les erreurs s’afficher. Attention ne faites surtout pas cette manipulation sur un site en production, mais uniquement sur vos postes de développement.

Cet article Drupal, Afficher les erreurs PHP. est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal, Afficher les erreurs PHP.

Drupal, Afficher les erreurs PHP.

Ce billet aurait tout aussi bien pu être nommé, comment faire face à la bien connue page blanche de Drupal. Je suis sûr que ce problème vous est déjà arrivé, vous retrouver nez à nez avec cette page, sans un mot d’explication. Pour comprendre ce qui se passe, quand on en est là et que l’on n’a pas accès aux logs du serveur, c’est mission impossible.

La façon la plus simple pour déboguer est d’afficher les erreurs PHP. D’ailleurs je suis convaincu de l’obligation pour tout développeur de travailler ainsi, vous verrez plus facilement les erreurs (même minimes) de votre code. On peut penser qu’une notice ou deux, par ci, par là ce n’est pas grave, mais lorsqu’elles commencent à s’additionner les unes aux autres, on dégrade les performances du site!

Method 1. La première chose à faire si vous avez accès au fichier php.ini de votre serveur, est de modifier les variables error_reporting, display_errors et display_startup_errors. Cela vous permettra lorsque vous développerez des scripts PHP hors Drupal de voir vos erreurs.


1
2
3
<span class='line'><span class="nb">error_reporting</span> <span class="o">=</span> <span class="k">E_ALL</span>
</span><span class='line'><span class="nx">display_errors</span> <span class="o">=</span> <span class="nx">On</span>
</span><span class='line'><span class="nx">display_startup_errors</span> <span class="o">=</span> <span class="nx">On</span>
</span>

Method 2. La deuxième solution consiste à modifier le fichier settings.php de Drupal


1
2
3
4
<span class='line'><span class="nb">error_reporting</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="nv">$conf</span><span class="p">[</span><span class="s1">&#39;error_level&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span><span class='line'><span class="nb">ini_set</span><span class="p">(</span><span class="s1">&#39;display_errors&#39;</span><span class="p">,</span> <span class="k">TRUE</span><span class="p">);</span>
</span><span class='line'><span class="nb">ini_set</span><span class="p">(</span><span class="s1">&#39;display_startup_errors&#39;</span><span class="p">,</span> <span class="k">TRUE</span><span class="p">);</span>
</span>

A partir de maintenant vous devriez voir les erreurs s’afficher. Attention ne faites surtout pas cette manipulation sur un site en production, mais uniquement sur vos postes de développement.

Par admin

Drupal Paris Meetup - mercredi 28 novembre - aux éditions Eyrolles

Bonjour à tous,

Pour ce dernier meetup de l'année 2012 et à quelques semaines du passage du père noël, je vous propose que l'on se retrouve le mercredi 28 novembre.

Le sujet du jour devrait en intéresser plus d'un, car pour une fois nous allons parler Frontend, template, preprocess et autres fonctions de thèmes ! Romain Jarraud va nous présenter le theming avec Drupal.

Comme d'habitude Wilfrid Roze nous présentera pendant un lightning talk le module de son choix.

Merci aux éditions Eyrolles qui nous accueillent ce mois-ci !

Pour le moment aucun sponsor ne s'est présenté. Si vous souhaitez participer et sponsoriser l’évènement, contactez-nous.

Comme toujours, si vous souhaitez proposer une idée de présentation où un sujet, que ce soit une discussion éclair de 5 minutes où une présentation plus longue (20min), contactez-nous.

Également, si vous connaissez un lieu capable d'accueillir gratuitement une cinquantaine de personnes, ou une entreprise qui serait intéressée pour sponsoriser l'apéro, n'hésitez pas à nous le signaler.

Vous êtes habitués maintenant, mais pour vous enregistrer il faut vous rendre sur la page meetup de l'évènement.

Un dernier mot, lors de votre inscription à cet évènement trois petites questions vous seront posées. Prenez le temps d'y répondre, cela nous permettra de mieux répondre à vos attentes, où en tout cas, améliorer nos rencontres. C'est important pour nous. Merci!

Julien_D (Julien Dubreuil) et Smoking Goat (Greg Beuthin)

Tags : 
Par badgones

Supprimer les paramètres form_token, form_build_id, form_id et op d'un formulaire en méthode GET

Vous faites un formulaire avec la méthode GET, et vous en avez marre des paramètres form_token, form_build_id, form_id et op, voici comment les supprimer :

Pour le paramètre "op", il faut donner un nom à votre input submit :

  $form['submit'] = array(
    '#type' => 'submit',
    '#name' => '',
    '#value' => t('Rechercher')
  );

Pour les autres paramètres, à savoir form_token, form_build_id et form_id, il vous suffit de rajouter dans votre formulaire une fonction de pre_render, comme ceci :

$form['#method'] = 'get';
$form['#pre_render'][] = '_mymodule_remove_form_tokens';

Puis ajoutez dans un module la fonction suivante :

en lire plus

Par badgones

Ajouter un display mode dans Drupal 7

Pour ajouter un nouveau mode d'affichage sous Drupal 7, il suffit d'implémenter le hook_entity_info_alter comme ceci.

/**
 * Implements hook_entity_info_alter().
 */
function MODULE_site_entity_info_alter(&$entity_info) {
  $entity_info['node']['view modes']['nouveau_display'] = array(
    'label' => t('Nom nouveau display'),
    'custom settings' => TRUE,
  );
}

Par Marc Delnatte
Akabia

Utilisation du thème Zen pour un design web responsive

zen-logo

Si vous souhaitez créer votre propre thème Drupal, il sera plus aisé de partir du thème Zen plutôt qu’un autre thème, pourquoi? Il permet d’avoir une base saine et documentée sur laquelle on peut appliquer nos développements spécifiques. La version 5.x apporte de nombreuses nouveautés par rapport à la version 3.x car le thème supporte maintenant l’HTML 5, le responsive avec support mobile ainsi que SASS/Compas comme moteur CSS. Rien que çà!

Par admin

Soirée communautaire DrupalFr en ouverture de Drupagora

L'association Drupal France & Francophonie est heureuse de vous convier à cette soirée un peu spéciale en partenariat avec Drupagora l'événement Drupal à destination des chefs de projets et DSI. Accueil à partir de 19h à la Cantine

  • Lancement de l'édition 2012 de Drupagora avec surprise !
  • Sylvain Moreau d'OWS nous proposera une mini conf "Architecture des types de contenus en Drupal 7 : ce qui a changé"
  • Fort du succès au DrupalCamp de Lyon nous vous proposons a nouveau "Question pour un... Module", venez avec vos besoins et l'assistance vous proposera le module correspondant ! Vous êtes incollable sur les modules Drupal, venez apporter votre expérience pour répondre !

La soirée se clôturera avec un apéritif dinatoire offert par Drupagora. Venez tous nous rejoindre pour un moment  de convivialité ouvert à tous !

Cet événement est gratuit et n'est pas limité aux participants de l'événement Drupagora. Une inscription sur meetup.com suffit.

Par cutesquirrel
Etienne

Cache de bloc : attention au hook_block_view !

C’est expliqué sur drupal.org, au niveau de l’API du hook_block_view, dans un commentaire : si le bloc est en cache, dès le 2nd affichage du bloc, le hook_block_view correspondant n’est plus appelé. Logique, c’est ce qu’on veut en mettant du cache : éviter à Drupal de recalculer à chaque coup le bloc et son rendu. […]

Par cutesquirrel
Etienne

Quel contenu principal pour ma homepage ?

Il y a plusieurs façons de gérer le contenu principal de sa homepage. La homepage est la page « / » ou bien « /node ». Comportement par défaut de Drupal Le comportement par défaut de Drupal est d’afficher les N derniers articles (N étant paramétrable) promus en page d’accueil (dans les options de publication d’un contenu). C’est son […]

Par fgm@drupal.org
Adhérent
Frédéric G. Marand

Nouveau cours Drupal: Multimédia Drupal 7 avec Scald

OSInet lance un nouveau cours Drupal: comment réaliser des sites multimédia avec Scald.Scald est une autre approche sur la gestion des média dans Drupal 7: audio, vidéo, image ou autre, une plateforme conçue pour faciliter la mise en oeuvre des fonctionnalités "sociales" qui sont si essentielles et uniques aux communautés Web. En tandem avec le module DnD, Scald propose un nouveau mode d'édition, plus simple, aux utilisateurs devant rédiger et mettre en page des articles complexes et riches en contenu. Scald propose un mécanisme unifié pour l'intégration et la manipulation de divers types de media.

en lire plus

Par juliendubreuil
julien dubreuil
Drupal since 2009

Traiter de grandes quantités de données avec la batch api de Drupal et Drush

Lorsque l’on est confronté aux joies de la production et de la maintenance de sites Internet il arrive souvent que l’on doive effectuer certaines manipulations sur des données existantes, comme l’ajout, la modification ou la suppression d’informations. Ces opérations sont en générale longues et coûteuses en mémoire car les quantités de données à traiter sont importantes et c’est pour cela que l’on utilise des batchs qui permettent de relâcher les processus une fois terminés évitant ainsi la saturation des ressources disponibles.

Quand la quantité de données à manipuler semble faible, le traitement avec un batch n’est pas nécessaire car il prendrait bien plus de temps qu’avec un simple script php. Même s’il est difficile de quantifier quand utiliser un batch ou un simple script, car tout dépend du travail à effectuer, des machines et du contexte, sachez que si vous devez réaliser un traitement lourd, l’utilisation d’un batch vous permettra de ne pas avoir peur que PHP s’arrête, simulant un malaise par manque de mémoire ou de temps.

La réalisation d’un batch avec Drupal c’est chose facile, puisqu’il existe une API pour cela, la Batch Api – http://drupal.org/node/180528 qui permet de créer de simplement des scripts de traitement.Il y a plein d’exemples sur le sujet, regardez le module example – http://drupal.org/project/examples – qui vous explique de A à Z comment coder et exécuter depuis l’interface web un batch.

Dans mon cas, je cherchais à réaliser un batch sans avoir besoin d’être connecté à l’interface d’administration de mon site et c’est naturellement que je me suis tourné vers Drush pour réaliser cette tâche.

Voici donc un petit snipet que vous pourrez réutiliser pour vos batch.

Déclaration de la commande Drush

Pour commencer nous allons créer notre commande drush. Dans un module, créez un fichier portant le nom de votre module avec l’extension drush.inc (dans mon cas sandbox.drush.inc)

function sandbox_drush_command() {
 $items  = array();
 $items['my-import'] = array(
    'callback'      => 'sandbox_setup_batch',
    'description' => dt('Import'),
 );
 return $items;
}

function sandbox_drush_help($section) {
 switch ($section) {
    case 'drush:myimport':
     return dt("Traitement des utilisateurs.");
 }
}

Déclaration du Batch

Une fois notre commande prête il nous faut déclarer notre batch, sandbox_setup_batch().

function sandbox_setup_batch() {

 // Ici nous créons un tableau nommé opérations, qui contiendra toutes les fonctions qui devront être invoquées lors de l'exécution du batch. Il est ainsi possible de réaliser plusieurs traitements différents avec un seul batch.
 $operations = array();
 $operations[] = array('sandbox_batch_process', array());

 // Déclaration des propriétés de notre batch.
 $batch = array(
   // Le tableau d’opérations à effectuer lors du traitement de notre batch.
   'operations' => $operations,
   'title' => t('Import batch'),
   'init_message' => t('Initializing'),
   'error_message' => t('An error occurred'),
   // Fonction qui sera appelée à la fin du batch.
   'finished' => 'sandbox_finished_method'
 );

 // Initialisation du batch.
 batch_set($batch);
 $batch =& batch_get();

 $batch['progressive'] = FALSE;

 // Execution du batch.
 drush_backend_batch_process();
}

Opération de batch à réaliser

A ce stade notre commande Drush est créée et notre batch déclaré, mais pour le moment il ne fait rien car nous n’avons pas encore implémenté la fonction principale, celle que notre batch devra exécuter. Ici, je récupère un par un tous les utilisateurs ayant le statut actif du site.

function sandbox_batch_process(&$context) {

 if (!isset($context['sandbox']['progress'])) {
   $context['sandbox']['progress'] = 0;
   $context['sandbox']['current_user'] = 0;
   // Récupération du nombre d’élément à traiter.
   $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT uid) FROM {users} WHERE status = 1'));
 }

 // Histoire de ne pas avoir de problèmes nous récupérerons les utilisateurs 50 par 50
 $limit = 50;

 $sql = "SELECT uid FROM {users} WHERE status = 1 AND uid > %d ORDER BY uid ASC";
 $result = db_query_range($sql, $context['sandbox']['current_user'], 0, $limit);
 while ($row = db_fetch_array($result)) {

   // C’est ici que doit se faire le traitement de votre batch.
   //...

   // Une fois que nous en avons terminé avec les données en cours il nous suffit de mettre à jour les informations du batch et de passer à la suivante.
   $context['sandbox']['progress']++;
   $context['sandbox']['current_user'] = $account->uid;
 }

 // Tant que l’on n’a pas traité tout le jeu de données on continue à exécuter notre batch.
 if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
   $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
 }
}

function sandbox_finished_method($success, $results, $operations) {
 drush_print('Finished importing!');
}


Et voilà, en quelques lignes nous avons un batch prêt à l’emploi pour traiter nos données. Notez que cette commande drush peut être ajoutée dans un CRON afin d’être exécutée régulièrement.

Cet article Traiter de grandes quantités de données avec la batch api de Drupal et Drush est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Traiter de grandes quantités de données avec la batch api de Drupal et Drush

Traiter de grandes quantités de données avec la batch api de Drupal et Drush

Lorsque l’on est confronté aux joies de la production et de la maintenance de sites Internet il arrive souvent que l’on doive effectuer certaines manipulations sur des données existantes, comme l’ajout, la modification ou la suppression d’informations. Ces opérations sont en générale longues et coûteuses en mémoire car les quantités de données à traiter sont importantes et c’est pour cela que l’on utilise des batchs qui permettent de relâcher les processus une fois terminés évitant ainsi la saturation des ressources disponibles.

Quand la quantité de données à manipuler semble faible, le traitement avec un batch n’est pas nécessaire car il prendrait bien plus de temps qu’avec un simple script php. Même s’il est difficile de quantifier quand utiliser un batch ou un simple script, car tout dépend du travail à effectuer, des machines et du contexte, sachez que si vous devez réaliser un traitement lourd, l’utilisation d’un batch vous permettra de ne pas avoir peur que PHP s’arrête, simulant un malaise par manque de mémoire ou de temps.

La réalisation d’un batch avec Drupal c’est chose facile, puisqu’il existe une API pour cela, la Batch Api – http://drupal.org/node/180528 qui permet de créer de simplement des scripts de traitement.Il y a plein d’exemples sur le sujet, regardez le module example – http://drupal.org/project/examples – qui vous explique de A à Z comment coder et exécuter depuis l’interface web un batch.

Dans mon cas, je cherchais à réaliser un batch sans avoir besoin d’être connecté à l’interface d’administration de mon site et c’est naturellement que je me suis tourné vers Drush pour réaliser cette tâche.

Voici donc un petit snipet que vous pourrez réutiliser pour vos batch.

Déclaration de la commande Drush

Pour commencer nous allons créer notre commande drush. Dans un module, créez un fichier portant le nom de votre module avec l’extension drush.inc (dans mon cas sandbox.drush.inc)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<span class='line'><span class="k">function</span> <span class="nf">sandbox_drush_command</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="nv">$items</span><span class="p">[</span><span class="s1">&#39;my-import&#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;callback&#39;</span>      <span class="o">=&gt;</span> <span class="s1">&#39;sandbox_setup_batch&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;description&#39;</span> <span class="o">=&gt;</span> <span class="nx">dt</span><span class="p">(</span><span class="s1">&#39;Import&#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">$items</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_drush_help</span><span class="p">(</span><span class="nv">$section</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'> <span class="k">switch</span> <span class="p">(</span><span class="nv">$section</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">case</span> <span class="s1">&#39;drush:myimport&#39;</span><span class="o">:</span>
</span><span class='line'>     <span class="k">return</span> <span class="nx">dt</span><span class="p">(</span><span class="s2">&quot;Traitement des utilisateurs.&quot;</span><span class="p">);</span>
</span><span class='line'> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span>

Déclaration du Batch

Une fois notre commande prête il nous faut déclarer notre batch, sandbox_setup_batch().


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
<span class='line'><span class="k">function</span> <span class="nf">sandbox_setup_batch</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Ici nous créons un tableau nommé opérations, qui contiendra toutes les fonctions qui devront être invoquées lors de l&#39;exécution du batch. Il est ainsi possible de réaliser plusieurs traitements différents avec un seul batch.</span>
</span><span class='line'> <span class="nv">$operations</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'> <span class="nv">$operations</span><span class="p">[]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;sandbox_batch_process&#39;</span><span class="p">,</span> <span class="k">array</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Déclaration des propriétés de notre batch.</span>
</span><span class='line'> <span class="nv">$batch</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>   <span class="c1">// Le tableau d’opérations à effectuer lors du traitement de notre batch.</span>
</span><span class='line'>   <span class="s1">&#39;operations&#39;</span> <span class="o">=&gt;</span> <span class="nv">$operations</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;Import batch&#39;</span><span class="p">),</span>
</span><span class='line'>   <span class="s1">&#39;init_message&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Initializing&#39;</span><span class="p">),</span>
</span><span class='line'>   <span class="s1">&#39;error_message&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;An error occurred&#39;</span><span class="p">),</span>
</span><span class='line'>   <span class="c1">// Fonction qui sera appelée à la fin du batch.</span>
</span><span class='line'>   <span class="s1">&#39;finished&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;sandbox_finished_method&#39;</span>
</span><span class='line'> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Initialisation du batch.</span>
</span><span class='line'> <span class="nx">batch_set</span><span class="p">(</span><span class="nv">$batch</span><span class="p">);</span>
</span><span class='line'> <span class="nv">$batch</span> <span class="o">=&amp;</span> <span class="nx">batch_get</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'> <span class="nv">$batch</span><span class="p">[</span><span class="s1">&#39;progressive&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">FALSE</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Execution du batch.</span>
</span><span class='line'> <span class="nx">drush_backend_batch_process</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span>

Opération de batch à réaliser

A ce stade notre commande Drush est créée et notre batch déclaré, mais pour le moment il ne fait rien car nous n’avons pas encore implémenté la fonction principale, celle que notre batch devra exécuter. Ici, je récupère un par un tous les utilisateurs ayant le statut actif du site.


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
<span class='line'><span class="k">function</span> <span class="nf">sandbox_batch_process</span><span class="p">(</span><span class="o">&amp;</span><span class="nv">$context</span><span class="p">)</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="nb">isset</span><span class="p">(</span><span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;current_user&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>   <span class="c1">// Récupération du nombre d’élément à traiter.</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;max&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">db_result</span><span class="p">(</span><span class="nx">db_query</span><span class="p">(</span><span class="s1">&#39;SELECT COUNT(DISTINCT uid) FROM {users} WHERE status = 1&#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">// Histoire de ne pas avoir de problèmes nous récupérerons les utilisateurs 50 par 50</span>
</span><span class='line'> <span class="nv">$limit</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'> <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">&quot;SELECT uid FROM {users} WHERE status = 1 AND uid &gt; %d ORDER BY uid ASC&quot;</span><span class="p">;</span>
</span><span class='line'> <span class="nv">$result</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">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;current_user&#39;</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">$limit</span><span class="p">);</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">$result</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// C’est ici que doit se faire le traitement de votre batch.</span>
</span><span class='line'>   <span class="c1">//...</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// Une fois que nous en avons terminé avec les données en cours il nous suffit de mettre à jour les informations du batch et de passer à la suivante.</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;current_user&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$account</span><span class="o">-&gt;</span><span class="na">uid</span><span class="p">;</span>
</span><span class='line'> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Tant que l’on n’a pas traité tout le jeu de données on continue à exécuter notre batch.</span>
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;max&#39;</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;finished&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span> <span class="o">/</span> <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;max&#39;</span><span class="p">];</span>
</span><span class='line'> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_finished_method</span><span class="p">(</span><span class="nv">$success</span><span class="p">,</span> <span class="nv">$results</span><span class="p">,</span> <span class="nv">$operations</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'> <span class="nx">drush_print</span><span class="p">(</span><span class="s1">&#39;Finished importing!&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span>

Et voilà, en quelques lignes nous avons un batch prêt à l’emploi pour traiter nos données. Notez que cette commande drush peut être ajoutée dans un CRON afin d’être exécutée régulièrement.

Pages