Ajax Template preprocess Drupal 7

Ajax Template preprocess Drupal 7

7 févr. 2012Drupal 7.x, PHP

Le but de ce petit article n'est pas de vous expliquer en long et en large le fonctionnement des templates dans drupal 7, mais de mettre en lumières les fonctionnalités principales qui vous permettront de customiser vos pages selon vos désirs.

Je vais prendre un exemple simple, vous souhaitez générer des pages en ajax. La structure de votre node est correct, vous souhaitez juste l'afficher mais sans toutes les feuilles de styles, les headers et footers ... car ceux ci se trouvent la page qui va appeler en ajax le contenu.

Attention, je me base sur un thème de base ZEN pour la construction des templates. Si vous ne l'avez pas je vous invite à lire les avantages de ce thème de base.

Ce que je souhaite est donc très simple en réalité, le templating drupal permet de customiser le template que l'on souhaite utiliser suivant de nombreuses règles.

Fichiers templates par défaut

page.tpl.php – Toutes les pages. Affiche l'accueil, les taxonomies et les node. C'est la page par défaut utiliser si aucun template ne vient surcharger celui-ci.
html.tpl.php –  Toutes les pages. Structure globale de toutes les pages du site.

On veut donc pouvoir avoir des pages pour nos requêtes ajax avec un minimum de structure dans les 2 templates ci dessus.

Nous allons créer 2 templates qui n'afficherons donc que le contenu propre d'un node.

page--ajax.tpl.php

<?php ​print $content; ?>

html--ajax.tpl.php

<?php print $page; ?>

Maintenant il faut que nous puissions dire que notre page ne doit pas être construite avec les templates par défaut mais par les templates ajax que l'on a déterminés.

Template.php theme_preprocess_page()

On va ajouter deux fonctions dans le fichier template.php de votre theme. 

On détermine que lorsque l'on détecte la variable ajax en paramètre GET et que cette variable est =1, dans ce cas, on ajoute une suggestion de template pour l'affichage de cette page.

{syntaxhighlighter brush:php;}function votretheme_preprocess_page(&$vars, $hook) {
  if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
    array_splice($vars['theme_hook_suggestions'], -1, 0, 'page__ajax');
  }
}
function votretheme_preprocess_html(&$vars, $hook) {
  if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
    array_splice($vars['theme_hook_suggestions'], -1, 0, 'html__ajax');
  }
}{/syntaxhighlighter}

N'oubliez pas de changer dans le nom des fonction le votretheme par le nom du thème que vous utilisez.

Voilà, vous pouvez désormais afficher n'importe quelle page de node sans aucune structure html polluante. 

Démo

Drupal 7, Strict warning: Only variables should be passed by reference in include()

Drupal 7, Strict warning: Only variables should be passed by reference in include()

1 févr. 2012Drupal 7.x, PHP, error

Voici une petite erreur que l'on peut trouver quand on développe en drupal 7.

Strict warning: Only variables should be passed by reference in include()

Le cas se présente lorsque l'on souhaite afficher un node par exemple depuis une page de template ou autre.

Affichage d'un type de node dans un template drupal.

// on charge le node souhaité
$topic = node_load(1);
//on génère la construction de ce node en ajoutant un $view_mode qui permettra de définir
//le template que l'on veut lui appliquer (ici sommaire). ceci n'est pas nécessaire
print drupal_render(node_view($topic,"sommaire"));

Ce code vous générera l'erreur au dessus. Pour faire simple, les fonctions node_view, ou node _show ne retourne pas de référence. Depuis PHP 5.05, une erreur fatale est retourné.

La correction à apporter est cependant très simple.

Il vous suffit de retourner le résultat de votre fonction node_view dans une variable et de passer cette même variable dans la fonction render de drupal. Dans ce cas, vous n'avez plus de problèmes de passage de référence.

Passez donc par une variable intermédiaire

$topic = node_load(1);
$nodeView = node_view($topic,"sommaire");
print drupal_render($nodeView ); 
 
Pour ceux qui souhaiteraient en savoir plus sur le passage par référence.

 

Erreur JS unrecognized expression: [href=/]

Erreur JS unrecognized expression: [href=/]

25 janv. 2012Drupal 7.x, PHP

Erreur JS, jquery update sur drupal 7

En travaillant sur drupal 7, j'ai trouvé un petit bug JS.

Les modules activés pour reproduire le bug sont les modules admin  et Jquery update.

Uncaught Syntax error, unrecognized expression: [href=/]

Il se trouve qu'il y a une petite erreur comme l'explique cette page dans le code admin_menu.

Corrections à appliquer

/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.js

Initialement le fichier est celui ci :

{syntaxhighlighter brush:php;}Drupal.admin.behaviors.toolbarActiveTrail = function (context, settings, $adminMenu) {
  if (settings.admin_menu.toolbar && settings.admin_menu.toolbar.activeTrail) {
    $adminMenu.find('> div > ul > li > a[href=' + settings.admin_menu.toolbar.activeTrail + ']').addClass('active-trail');
  }
};{/syntaxhighlighter}

Remplacez les lignes ci-dessus par :

{syntaxhighlighter brush:php;}Drupal.admin.behaviors.toolbarActiveTrail = function (context, settings, $adminMenu) {
  if (settings.admin_menu.toolbar && settings.admin_menu.toolbar.activeTrail) {
    $adminMenu.find('> div > ul > li > a[href$="' + settings.admin_menu.toolbar.activeTrail + '"]').addClass('active-trail');
  }
};{/syntaxhighlighter}

Thanks to WillHall for this correction.

Performances lenteur Drupal 7, le Cron

Performances lenteur Drupal 7, le Cron

23 janv. 2012Drupal 7.x, performance

Problème de performance, lenteur Drupal6 vs Drupal 7

Il est connu de tout le monde que drupal 7 est plus lent que drupal 6 .... ceci est normal me direz vous ... et bien oui, l'ajout de fonctionnalité dans le core ne se font évidement pas sans une contrepartie.

Cependant, j'ai remarqué sur mes sites en Dev des performances horribles sur le 1er accès au site. Alors moi je me dis que ce n'étais pas possible que les dev drupal aient laissé un temps d'initialisation du framework aussi important ! D'autant que le problème ne se produit que très rarement sur les mêmes sites, passés en production, sur même config serveur dédié.

Les temps de latence remarquées étaient de l'ordre de 15-20sec pour générer la 1ère page ... une horreur quand on fait la demo client ^^

Mais c'est pas possible il est lent votre site ! Non non ne vous inquiétez pas c'est la version de DEV .... :)

Du coup j'ai décidé de me plongé sur ce problème. 

Cron est la solution

Résultat, il s'avère qu'en fait, le problème venait simplement du cron ... vous savez le process qui permet de faire tout un tas de choses, comme un clean DB ou mise à jour du moteur de recherche. 

Sur drupal 6, le cron était dissocié du site, je veux dire par là que si vous ne configuriez pas une tâche cron un de vos dédié ou votre machine perso qui allait visiter l'url cron toutes les  x heures, votre cron n'était jamais lancé.

Et bien sur drupal 7 .. ils ont associé le cron aux visites du site. De base le cron doit se déclencher toutes les 3heures. Sauf que si vous n'avez pas beaucoup de visiteurs cas des sites en dev ^^) et bien toutes les 3 heures à chaque visite d'une page, le cron se lance lors du chargement de votre page ... d'où les 15-20sec d'attentes avec une belle page blanche.

Donc si, comme moi, vous ne pouvez  pas vous permettre que vos clients ou visiteurs ne se tape ce foutu délais, je vous conseille de régler l'exécution du cron de drupal 7 à jamais

Désactivation du cron drupal

admin/config/system/cron

Evidement vous devrez dans ce cas lancer votre cron depuis un process externe.  cette fois ce sera une vrai tache cron linux, ou autre pour les autres ^^

Voici comme configurer votre serveur dédié linux ou machine perso dans le cas d'un hébergement mutualisé.

Vous devez d'abord récupérer le lien à exécuter pour lancer le cron, vous le trouverez dans votre tableau de bord drupal 7

Récupération du lien pour lancer le cron drupal

/admin/reports/statu​s

Edition du crontab linux

 crontab -e

Ajoutez la ligne pour lancer votre cron toutes les 5 heures.

0  */5 *   *   *     /usr/bin/lynx -source http://www.urlsite.fr/cron.php?cron_key=d561az56d16az54df546ze564v6sd854v68frez8g

Ctrl + x pour sauvegarder votre crontab.

Et voilà. Désormais, les tâches lancées dans votre cron drupal seront exécutés par un processus indépendant de vos visiteurs et c'est beaucoup mieux ! 

ckeditor.styles.js - Menu Styles dans CKEDITOR - WYSIWYG Drupal

ckeditor.styles.js - Menu Styles dans CKEDITOR - WYSIWYG Drupal

il n'est jamais évidement de trouver comment customiser l'éditeur WYSIWYG dans drupal. 

Voici le fichier que vous devez modifier afin de pouvoir disposer de nouveaux styles dans le menu format de l'éditeur CKEDITOR dans drupal.

Solution

Allez dans le dossier ou vous avez déposé la version de CKeditor, normalement : /sites/all/librairies/ckeditor/plugins/styles/default.js

Vous trouverez une exemple dans le répertoire styles.

Ensuite, vous n'avez plus qu'a créer vos lignes en fonction de vos styles.

Code ckeditor.styles.js Drupal 6


CKEDITOR.stylesSet.add('default',
[{name:'titre H1',element:'span',attributes:{class:'titleH1'}},
{name:'titre H2',element:'span',attributes:{class:'titleH2'}},
{name:'titre H3',element:'span',attributes:{class:'titleH3'}},
{name:'Puce rouge',element:'p',attributes:{class:'puceRouge'}}]);

Code ckeditor.styles.js Drupal 7

Rendez vous sur l'url suivante, /admin/config/content/ckeditor/edit/Full, ceci vous permettra de configurer le "PREDEFINED STYLES PATH" de votre Ckeditor.
Renseignez par exemple: /sites/all/themes/votreTheme/ckeditor.styles.js

Et voici votre fichier ckeditor.styles.js.

 


CKEDITOR.addStylesSet( 'drupal',
[
    /* Block Styles */
    { name : 'Paragraphe' , element : 'p' },
    { name : 'Titre 1' , element : 'h1' },
    { name : 'Titre 2' , element : 'h2' },
    { name : 'Titre 3' , element : 'h3' },

    /* Inline Styles */
    { name : 'Gros' , element : 'big' },
    { name : 'Petit' , element : 'small' }
]);

Vous pouvez bien entendu utiliser la même méthode sous drupal 6, le chemin de configuration de votre ckeditor n'étant pas le même cepedant. Il vous faudra alors ajouter le code plus haut

 

Drupal 7, db_query migration de la version 6 à la 7

Drupal 7, db_query migration de la version 6 à la 7

1 août 2011Drupal 6.x, Drupal 7.x, PHP

Et oui toute évolution de version apporte son lot de nouveautés.

Sur Drupal 7, la fonction db_query() a été revu et corrigé. Auparavant, pour exécuter une requête SQL, vous deviez écrire votre fonction comme suit :

{syntaxhighlighter brush: php}
$result = db_query("SELECT field FROM {table} WHERE field_int = %d AND field_text LIKE '%s'", $int_var, $text_var);
while ($row = db_fetch_object($result)) {
// Boucle sur les réultats de la recherche.
}
{/syntaxhighlighter}

Aujourdh'ui c'est sensiblement la même chose à deux trois choses prêts !

1. On utilise plus de boucle while, mais un foreach qui va parser le résultat directement

2. L'insertion des variables dans une requête a changé : on n'utilise plus les %d, ou %s, mais une autre syntaxe :nom ou :votre_var.
Et c'est là qu'il faut faire attanetion ! Avant pour insérer une chaîne de caractère, vous deviez protéger votre var '%s' par des guillemets, désormais ce n'est plus la peine, et surtout il ne faut plus le faire. Sinon quoi ? et bien cela ne fonctionne plus  du tout ^^

 

{syntaxhighlighter brush: php}
$result = db_query("SELECT field FROM {table} WHERE field_int = :intvar AND field_text LIKE :textvar ", array(':intvar' => $int_var, ':field_text' => $text_var));
foreach ($result as $row) {
// Boucle sur les réultats de la recherche.
}
{/syntaxhighlighter}

Et voilà !

Drupal 7 affichage des champs d'un template node--typeContent.tpl.php

Drupal 7 affichage des champs d'un template node--typeContent.tpl.php

1 août 2011PHP, Drupal 7.x

Vous savez certainement comment customiser vos propres contenus dans drupal 7.

Juste un petit rappel sur ce point :

Créer un dossier templates dans votre thème, et y insérer vos fichiers .tpl.php personnalisés.

Pour maitriser l'affichage des pages de base de drupal vous devrez donc créer un fichier node--page.tpl.php.

Jusque là il n'y a pas beaucoup de différences avec drupal 6 (à part le nommage des fichiers avec 2 tirets et le nouveau répertoire templates).

Cependant, lorsque vous allez vouloir afficher les champs qui composent votre page, un champ image, body, date ..., vous serez un peu déstabilisé si vous avez l'habitude avec drupal 6.

On utilise désormais la méthode render(). Ensuite, tous les champs de votre contenus se trouvent dans la variable $content.

<?php
print "<div class='imageHome'>";
print render($content['field_image']);
print "</div>";
print render($content['body']);
?>

Récupérer le contenu d'un field de votre node

Pour afficher un field sans passer par la fonction render de drupal est donc ne pas passer par le sytsème de templating intégré, vous devrez récupérer manuellement la value du field et afficher cette valuecomme vous le désirez.

//On récupère un tableau correspondant aux value de field_title
$yourTitle = field_get_items('node', $node, 'field_title');
//Ensuite on affiche la value souhaitée
print (yourTitle[0]["value"]); 

Ceci marche avec tous avec tous les field de vos nodes.

Pages

Subscribe to RSS - Drupal 7.x