Planète

Par j0nathan

Liens de menu en ligne dans Drupal 7

Aujourd’hui j'avais une de ces taches d’intégration Drupal qui semble constamment resurgir: celle de transformer un bloc du module menu d'une liste html a un jeu de liens en ligne. En images je devais me rendre

de ça: Menu Drupal standard à ça: Liens tel que affiché dans le design

Comme d'habitude je fait surtout du développement de modules et des taches semblables chez Koumbit, j'étais conscient que Drupal avait déjà une classe pour des listes contenant des liens en ligne, "lists inline", mais je ne savais pas comment changé ces valeurs au niveau du thème. Donc j'ai visité la page API de theme_menu_tree() pour y trouver de l'inspiration, ce que j'ai trouvé dans un commentaire de wgsimon. Un thème Drupal peut supplanter la fonction de thème d'un menu précis dans Drupal avec la pattern THEME_menu_tree__MENU_NAME().

J'ai ajouté le code suivant au template.php de mon thème, pour rendre le menu d'usager standard de Drupal ainsi que notre menu pour les visiteurs avec le style Drupal de liens en ligne:

/**
 * Afficher le menu d'usager en ligne
 */
function customtheme_menu_tree__user_menu($variables) {
  return '<ul class="links inline clearfix">' . $variables['tree'] . '</ul>';
}

/**
 * Afficher le menu d'usager anonyme en ligne
 */
function customtheme_menu_tree__menu_user_menu_anonymous_($variables) {
  return '<ul class="links inline clearfix">' . $variables['tree'] . '</ul>';
}

Vous n'avez qu'à remplacer le mot customtheme avec le nom de votre thème et ensuite changer les noms des menus pour utiliser ça sur n'importe quel menu.

Pour le changeur de langage j'ai fait quelque-chose de semblable, après avoir consulter locale_block_view() dans le API. J'ai vue que le bloc du changeur de langue utilise theme(&#039;links__locale_block&#039;, $variables); pour fournir son contenu. J'ai supplanter cette fonction dans template.php:

/**
 * Afficher les liens du changeur de langue en ligne
 */
function customtheme_links__locale_block($variables) {
  array_push($variables['attributes']['class'], 'links', 'inline', 'clearfix');
  return theme('links', $variables);
}

J'ai donc découvert que la pattern theme_function__object_name marche pour n'importe quel fonction thème appeler de cette manière. Je suis sur que ceci est précisé quelque-part dans la documentation de l'API de Drupal.

Mes menus ressemblais maintenant à ceci: Liens menu après les changements dans template.php

La dernière étape varie selon le thème. Dans mon cas j'ai déplacé &amp;lt;div class=&quot;region region-header&quot;&amp;gt; et son contenu à avant le logo, dans page.tpl.php, et j'ai inséré le CSS suivant dans les fichiers appropriés:

.region-header .block {
  display: inline-block;
  margin-bottom: 0;
}

.region-header {
  text-align: right;
}

Le résultat: Liens après les modifications du CSS

Il reste évidement à finir l'intégration, mais mon soucis principal jusqu'à présent c'était d'éviter de charger mon CSS avec du code déjà présent dans Drupal.

Pour commenter cet article, faire des suggestions, et voir les échantillons de code avec du syntaxe couleur.

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 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 fgm@drupal.org
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.

Entity Reference : afficher un contenu similaire

Contenu similaire avec Entity Reference

Cette vue permet d'afficher dans un bloc le contenu de votre site qui référence la même entité que celle référencée par l'article consulté.

Par exemple, si vous disposez d'un type de contenu Artiste qui dispose d'une référence (via un champ Entity Reference) vers le type de Contenu Mouvement  vous voulez afficher, lors de la consultation d'un artiste, tous les autres artistes qui appartiennent même mouvement (artistique) et qui donc référencent le même mouvement.

Thème : 
Views
Entity reference

Entity Reference : afficher un contenu similaire

Cette vue permet d'afficher dans un bloc le contenu de votre site qui référence la même entité que celle référencée par l'article consulté.

Par exemple, si vous disposez d'un type de contenu Artiste qui dispose d'une référence (via un champ Entity Reference) vers le type de Contenu Mouvement  vous voulez afficher, lors de la consultation d'un artiste, tous les autres artistes qui appartiennent même mouvement (artistique) et qui donc référencent le même mouvement.

Afficher un menu sous Drupal 7

Navigation

D'une manière générale, pour lire un menu (créé depuis l'interface d'administration, chemin admin/structure/menu/add) et l'afficher, il faut utiliser la fonction menu_navigation_links pour le lire, et la fonction theme pour l'afficher.

Thème : 
Menu
Preprocess
Drupal 7

Pages