Garder la selection des filtres et Ajax ne fonctionne pas tout le temps

Garder la selection des filtres et Ajax ne fonctionne pas tout le temps

30 Mai 2016Drupal 7.x

Lorsque Ajax et "Se rappeler de la dernière sélection" sont activés pour un filtre exposé, le filtre n'arrive pas a reconnaitre que l'on a selectionné aucun filtre, et nous affiche donc la selection précédente.

Justre appliquer ce patch à view.

views-exposed_filter_remember-1080164-27.patch

wget https://www.drupal.org/files/views-exposed_filter_remember-1080164-27.patch
patch -p1 < views-exposed_filter_remember-1080164-27.patch

Comment modifier les filtres exposé d'un vue

Comment modifier les filtres exposé d'un vue

20 Mai 2016Drupal 7.x

View permet de filtrer par taxonomie des contenus. Cepedant, vous ne pouvez séléctionner des tags que manuellement. Sis votre structure de taxonomie est cencé evoluer, vous ne pouvez pas le faire manuellement. 

il faut donc ajouter du code afin d'altérer les filtres exposés de la vue.

Donc mon exemple je voulais n'afficher que les enfant  du terme de la page en cours.

Pour que le code fonctionne, vous devez avoir un filtre de terme de taxonomie avec l'option  "Limiter la liste aux éléments sélectionnés".

<?
function MODULE_NAME_views_pre_view(&$view, &$display_id, &$args) {
	$node = menu_get_object();
	$tid_parent = $node->field_categorie['und'][0]["tid"];
	if ($view->name == 'VIEW_NAME') {
		$query = db_select('taxonomy_term_data', 'ttd');
		$query->join('taxonomy_term_hierarchy', 'tth', 'tth.tid = ttd.tid');
		$query->condition('tth.parent', $tid_parent)
		->condition('ttd.vid', 1) // 1 is category vocabulary ID
		->fields('ttd', array('tid')); // select tid to set allowed values.
		 
		$allowed_categories = $query->execute()->fetchAllKeyed(0, 0);
		 
		// on assigne les nouveau termes au filtre
		$view->display['default']->handler->options['filters']['tid']['value'] = $allowed_categories;
	}
}
?>

Validation de champs webform regex

Validation de champs webform regex

22 avr. 2015Drupal 7.x, Regex

Voici des regex pour la validation de champs webform :

Téléphone format France

^(0|\+33)[1-9]([-. ]?[0-9]{2}){4}$

Code postal France

/^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/

Filtre tags HTML - Ckeditor

Filtre tags HTML - Ckeditor

15 oct. 2013Drupal 7.x, ckeditor

Les dernières versions de ckeditor intégrent des filtres pour éviter des tags html.

Accèder à la configuration de ckeditor /admin/config/content/ckeditor/edit/Full, section "Options avancées".

Ajouter config.allowedContent = true;

Warning : Illegal offset type in isset or empty in drupal_theme_access()

Warning : Illegal offset type in isset or empty in drupal_theme_access()

7 oct. 2013Drupal 7.x, bugfix, Bug

Vous avez cette erreur et vous venez de perdre une demi journée à essayer de la corriger ... Don't waste your time anymore !

Situation

Warning : Illegal offset type in isset or empty in drupal_theme_access() (line 53 in includes/theme.inc)

Ceci est certainement du au fait que vous avez créé un module qui va se terminer avec le nom _custom.

Dès lors que vous allez vouloir utiliser le hook_theme(), vous serez confronté à ce problème.

Correction

Ne JAMAIS finir un module par _custom. vous vous éviterez ce genre de problèmes ... Changer le nom de votre module et voilà :)

 

Date Drupal 7 dans votre template

Date Drupal 7 dans votre template

13 sept. 2012Drupal 7.x, Date, template

Afficher une date comme vous souhaitez peut être assez complqiué si vous ne savez pas par où commencer.

Modules

Commencer par installer le module Date sur votre instance Drupal 7. 

Rendez vous dans Modules / Lister /  "Date / Time" puis activez les modules Date et Date API.

Customisation votre DATE dans un node Drupal

Ouvrez ensuite le fichier template correspondant à votre node, node.tpl.php par exemple.

Ensuite pour afficher une date avec un format custom il vous suffira de récupérer le champs date de votre node.

$dateNode = field_get_items('node', $node, 'field_date');
$dateObj = new DateObject($dateNode[0]["value"]);
$dateT = date_format_date($dateObj, 'custom', 'j F Y'); // va afficher une date sous la forme 13 Septembre 2012
echo t('Created on')." ".$dateT."<br/>";

et Voilà, vous avez affiché votre date avec le format que vous souhaitiez.

Pour afficher votre date sous d'autre format, il vous suffira de modifier  j F Y par ce que vous souhaitez. Vous trouverez les correspondance sur la page Date de PHP.

node_load - Loader des nodes avec des paramètres drupal 7

node_load - Loader des nodes avec des paramètres drupal 7

22 août 2012Drupal 7.x

Drupal 7 change la manière dont vous allez pouvoir rechercher un node à loader avec des paramètres.

Drupal 6

Sous Drupal 6 on passait par node_load et un array de param afin de "filtrer" les bons nodes avec les paramètres voulus.

$param = array(
    'type' => 'your_node_type',
    'title' => 'your node title',
    'status' => 1,
);
$node = node_load($param);

Drupal 7

Sous Drupal 7 ce processus est un peu plus compliquer mais beaucoup plus puissant. On va en effet passer par la class EntityFieldQuery.

Ceci va nous permettre de faire des filtres non seulement sur les paramètres de base d'un node (nid, vid title, type etc...) mais aussi sur les field ajoutés à notre node; par exemple une référence un terme de taxonomie, ou un fichier , un nombre ou tout ce qui définit votre node.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'your_node_type')
    ->propertyCondition('status', 1)
    ->fieldCondition('field_yourfield',   'tid', 11)
    ->fieldCondition('field_yourfield_2', 'value', 11, "=")
    ->fieldOrderBy('field_yourfield_2',   'value', 'ASC');
    ->execute();

$nodes = node_load_multiple(array_keys($entities['node']));

et voilà, on récupère ensuite un array de node filtré.

Performance, accélérer Drupal 7 avec Apache et Varnish

Performance, accélérer Drupal 7 avec Apache et Varnish

Varnish est un accélérateur de web app. Il va vous permettre d'augmenter la vitesse de votre site web, pour peu que vous soyez sous un serveur dédié évidemment !

Je vais vous proposer dans cet article la procédure pour mettre en place Varnish 3.0 sur un drupal 7.

 

Résumé de ce que fait Varnish

Varnish va mettre en cache certaines requêtes afin que le serveur web (apache) n'ait pas à toutes les traiter. Cela est important car normalement un process apache est utilisé pour chaque requête. Chacune de ces requête coute très chère en Ram / Cpu à votre serveur, car apache contrôle tout.

Cependant, dans certains cas, comme, les images, les css, les js, les pages html statics ... bref les ressources utilisés par votre site, ces requêtes n'ont pas besoin d'un traitement aussi lourd qu'apache, c'est là  qu'intervient Varnish. Il va mettre en cache ces ressources afin que lorsqu'un visiteur en fait la demande, ça ne soit pas apache qui délivre cette ressource mais Vanish, beaucoup moins gourmand en ressource système, et donc plus rapide.

 

Installation de Varnish

Je vais supposer qu'apache est déjà installé sur votre serveur.

apt-get install varnish

 

Configuration Apache

On va configurer votre apache afin d'écouter sur un autre port que le 80 afin de laisser ce port 80 à Varnish plus tard.

vi /etc/apache2/ports.conf
NameVirtualHost *:8000
Listen 127.0.0.1:8000

Vous allez devoir ensuite changer vos virtualhost si vous avez définit leur port d'écoute en 80 par 8000.

<VirtualHost *:80>

par

<VirtualHost *:8000>

 

Configuration Varnish

Changer les lignes suivante :

vi /etc/default/varnish
DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/NOM_DE_VOTRE_FICHIER_DE_CONF.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

Changer la ligne defaut.vcl par un nom de fichier que l'on créera ensuite.

Editer ensuite ce nouveau fichier de configuration de Vanish

Configue VCL tiré du site fourkitchens.atlassian.net

vi /etc/varnish/NOM_DE_VOTRE_FICHIER_DE_CONF.vcl
{syntaxhighlighter brush:bash;}# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
#

# TODO: Update internal subnet ACL and security.

# Define the internal network subnet.
# These are used below to allow internal access to certain files while not
# allowing access from the public internet.
# acl internal {
#  "192.10.0.0"/24;
# }

# Default backend definition.  Set this to point to your content
# server.
#
backend default {
  .host = "127.0.0.1";
  .port = "8000";
}

# Respond to incoming requests.
sub vcl_recv {
  # Use anonymous, cached pages if all backends are down.
  if (!req.backend.healthy) {
    unset req.http.Cookie;
  }

  # Allow the backend to serve up stale content if it is responding slowly.
  set req.grace = 6h;

  # Pipe these paths directly to Apache for streaming.
  #if (req.url ~ "^/admin/content/backup_migrate/export") {
  #  return (pipe);
  #}

  # Do not cache these paths.
  if (req.url ~ "^/status\.php$" ||
      req.url ~ "^/update\.php$" ||
      req.url ~ "^/admin$" ||
      req.url ~ "^/admin/.*$" ||
      req.url ~ "^/flag/.*$" ||
      req.url ~ "^.*/ajax/.*$" ||
      req.url ~ "^.*/ahah/.*$") {
       return (pass);
  }

  # Do not allow outside access to cron.php or install.php.
  #if (req.url ~ "^/(cron|install)\.php$" && !client.ip ~ internal) {
    # Have Varnish throw the error directly.
  #  error 404 "Page not found.";
    # Use a custom error page that you've defined in Drupal at the path "404".
    # set req.url = "/404";
  #}

  # Always cache the following file types for all users. This list of extensions
  # appears twice, once here and again in vcl_fetch so make sure you edit both
  # and keep them equal.
  if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?.*)?$") {
    unset req.http.Cookie;
  }

  # Remove all cookies that Drupal doesn't need to know about. We explicitly
  # list the ones that Drupal does need, the SESS and NO_CACHE. If, after
  # running this code we find that either of these two cookies remains, we
  # will pass as the page cannot be cached.
  if (req.http.Cookie) {
    # 1. Append a semi-colon to the front of the cookie string.
    # 2. Remove all spaces that appear after semi-colons.
    # 3. Match the cookies we want to keep, adding the space we removed
    #    previously back. (\1) is first matching group in the regsuball.
    # 4. Remove all other cookies, identifying them by the fact that they have
    #    no space after the preceding semi-colon.
    # 5. Remove all spaces and semi-colons from the beginning and end of the
    #    cookie string.
    set req.http.Cookie = ";" + req.http.Cookie;
    set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");   
    set req.http.Cookie = regsuball(req.http.Cookie, ";(SESS[a-z0-9]+|SSESS[a-z0-9]+|NO_CACHE)=", "; \1=");
    set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");

    if (req.http.Cookie == "") {
      # If there are no remaining cookies, remove the cookie header. If there
      # aren't any cookie headers, Varnish's default behavior will be to cache
      # the page.
      unset req.http.Cookie;
    }
    else {
      # If there is any cookies left (a session or NO_CACHE cookie), do not
      # cache the page. Pass it on to Apache directly.
      return (pass);
    }
  }
}

# Set a header to track a cache HIT/MISS.
sub vcl_deliver {
  if (obj.hits > 0) {
    set resp.http.X-Varnish-Cache = "HIT";
  }
  else {
    set resp.http.X-Varnish-Cache = "MISS";
  }
}

# Code determining what to do when serving items from the Apache servers.
# beresp == Back-end response from the web server.
sub vcl_fetch {
  # We need this to cache 404s, 301s, 500s. Otherwise, depending on backend but
  # definitely in Drupal's case these responses are not cacheable by default.
  if (beresp.status == 404 || beresp.status == 301 || beresp.status == 500) {
    set beresp.ttl = 10m;
  }

  # Don't allow static files to set cookies.
  # (?i) denotes case insensitive in PCRE (perl compatible regular expressions).
  # This list of extensions appears twice, once here and again in vcl_recv so
  # make sure you edit both and keep them equal.
  if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?.*)?$") {
    unset beresp.http.set-cookie;
  }

  # Allow items to be stale if needed.
  set beresp.grace = 6h;
}

# In the event of an error, show friendlier messages.
sub vcl_error {
  # Redirect to some other URL in the case of a homepage failure.
  #if (req.url ~ "^/?$") {
  #  set obj.status = 302;
  #  set obj.http.Location = "http://backup.example.com/";
  #}

  # Otherwise redirect to the homepage, which will likely be in the cache.
  set obj.http.Content-Type = "text/html; charset=utf-8";
  synthetic {"
<html>
<head>
  <title>Page Unavailable</title>
  <style>
    body { background: #303030; text-align: center; color: white; }
    #page { border: 1px solid #CCC; width: 500px; margin: 100px auto 0; padding: 30px; background: #323232; }
    a, a:link, a:visited { color: #CCC; }
    .error { color: #222; }
  </style>
</head>
<body onload="setTimeout(function() { window.location = '/' }, 5000)">
  <div id="page">
    <h1 class="title">Page Unavailable</h1>
    <p>The page you requested is temporarily unavailable.</p>
    <p>We're redirecting you to the <a href="/">homepage</a> in 5 seconds.</p>
    <div class="error">(Error "} + obj.status + " " + obj.response + {")</div>
  </div>
</body>
</html>
"};
  return (deliver);
}{/syntaxhighlighter}

 

Module Varnish Drupal

Télécharger le module Varnish HTTP Accelerator Integration, installer le module dans sites/all/modules, activer le module dans drupal.

Editer le fichier /sites/default/settings.php et ajouter les lignes :

<?php
// Add Varnish as the page cache handler.
$conf['cache_backends'] = array('sites/all/modules/varnish/varnish.cache.inc');
$conf['cache_class_cache_page'] = 'VarnishCache';
// Drupal 7 does not cache pages when we invoke hooks during bootstrap. This needs
// to be disabled.
$conf['page_cache_invoke_hooks'] = FALSE;
?>

Aller à l'adresse /admin/config/development/varnish de votre drupal.

Mettre la version 3.x de Varnish,

Renseigner la Clé de control Varnish qui se trouve sur le serveur 

cat /etc/varnish/secret

Vérification présence de Varnish

Avec chrome, inspecter le site qui se trouve sur votre serveur avec la touche F12.

Dans l'onglet network, vous allez vérifier que vos ressources png ou css dispose bien de l'entete X-Varnish-Cache. HIT va signifier que la ressource vient du cache, et MISS qu'elle ne vient pas du cache.

Accept-Ranges:bytes
Age:4388
Cache-Control:max-age=1209600
Connection:keep-alive
Content-Encoding:gzip
Content-Length:389
Content-Type:text/css
Date:Wed, 15 Aug 2012 11:02:43 GMT
ETag:"3e0fde-400-4c2e47a7a2580"
Expires:Wed, 29 Aug 2012 09:49:34 GMT
Last-Modified:Wed, 20 Jun 2012 10:01:10 GMT
Server:Apache
Vary:Accept-Encoding
Via:1.1 varnish
X-Varnish:1363926136 1363923807
X-Varnish-Cache:HIT

Sinon il y a aussi le site http://www.isvarnishworking.com/, qui fait exactement le même travail :)

Voilà, vous savez maintenant installer et configurer Varnish sur votre serveur avec Drupal 7.

Performances lenteur Drupal 7, Theme Zen, Theme development settings

Performances lenteur Drupal 7, Theme Zen, Theme development settings

31 juill. 2012Drupal 7.x, performance, thème, Zen

Des performances en chute libre !

Il est possible que certains d'entre vous aient des problèmes de lenteurs sur leur drupal après l'installation et la mise en place de certains modules/themes. Evidemment, plus vous allez activer de modules, plus votre site sera "lent", mais ne vous inquiétez pas cela reste dans une limite acceptable.

Cependant, certains modules (indispensables) si vous ne les configurez pas correctement vont faire de votre site un calvaire pour vos utilisateurs et pour vous en DEV.

Si votre site est lent de temps en temps, genre toute les 1h à 3h, reportez vous à l'article parlant de la gestion du cron de drupal 7.

Si par contre sur votre site, le site mais longtemps à générer une page, il est possible que vous ayez oublié quelque chose.

Les thèmes basé sur Zen

Zen est un template de base qui va vous permettre de créer vos propres templates custom en bénéficiant de nombreuses fonctionnalités importé de ce thème de base.

Cependant si vous omettez de configurer votre thème, vous pouvez oublier une option très importante dans la phase de dev, mais plus du tout en prod !

Rendez-vous dans la configuration de votre thème, Apparence / Paramètres / Votre thème.

Vous devez avoir un onglet Theme development settings disponible avec par défaut une checkbox Rebuild theme registry on every page coché. Ceci va vous permettre lorsque vous développer un nouveau thème, d'avoir à vider le cache drupal afin de le forcer à vérifier les nouveaux fichiers .tpl, ou hook que vous avez ajouté. Cependant, ceci va évidement ralentir la navigation de votre site ! Personnellement, je préfère donc décocher cette option et vider le cache quand j'en ai besoin pour la prise en compte d'un nouveau fichier ou fonction.

Voilà, ce n'est pas une astuce ni un paramètre que vous trouverez sur tous les drupal puisque que ceci ne s'applique qu'aux templates Zen. Mais bon, si votre site est lent... peut-être que vous avez oublié cette petite option ;)

Drupal 7 - Multiblock, sauvegarde impossible de la configuration

Drupal 7 - Multiblock, sauvegarde impossible de la configuration

Multiblock

Bon voici un article très court sur le Module Drupal 7, Multiblock.

Multiblock est un module qui va permettre de générer des instances différente d'un seul Block. Chose qui n'est pas possible dans Drupal. Un block = une instance.

Il y un bug dans la version Drupal 7 qui fait qu'il ets impossible d'enregistrer la configuration d'un module créé. Ce qui entre nous, est un bug majeur de mon point de vue ^^

Bref, si vous rencontrez ce problème :

Warning : Missing argument 2 for yourmodule_block_view() dans yourmodule_block_view()

Vous devrez patcher à la bourrin le fichier multiblock.module.

Solution

Allez en ligne 102 de votre fichier et remplacer la ligne

{syntaxhighlighter brush:php;}if ($op == 'save') { {/syntaxhighlighter}

par

{syntaxhighlighter brush:php;}if ($block_info->multi_settings == 1 || $op == 'configure') {{/syntaxhighlighter}
 
Le bug n'est toujours pas corrigé à ce jours dans les releases officielles.

 

Pages

Subscribe to RSS - Drupal 7.x