Drupal 7 : regénérer sa cron_key en cas de problème

Au secours ! ma cron_key a disparu !!

Dernièrement, ayant des soucis de crons, j’ai suivi des tas de forums disant comment s’en sortir.
Sauf que parmi les manip, j’ai viré toutes les variables commençant par cron_
Donc dedans, il y avait la cron_key !

Des modules existent vous permettant de le faire, mais franchement, pas besoin d’installer tout un module pour le faire

drush php-eval "variable_set('cron_key', drupal_random_key());"

La cron_key sera alors de nouveau renseignée en base, et vous pourrez la récupérer comme d’habitude dans votre back-office, onglet Report (admin/reports/status).

(pour info, vous ne pouvez l’insérer avec un phpMyAdmin facilement, en créant name=cron_key, value=la valeur, car la valeur est un objet PHP sérialisé en fait.

Enjoy !

Validateur asynchrone avec Mongoose

Comment valider un champ de son modèle en asynchrone avant de l’enregistrer ?

Prenons le cas suivant : on a un modèle Mobilhomes et un modèle Marque.  On utilise mongoose pour enregistrer un mobilhome.

Ici, je n’utilise pas les ref dans le schéma, mais on pourrait le faire (cf http://mongoosejs.com/docs/populate.html).

var MobilHomeSchema = Schema({
  _id: Schema.Types.ObjectId,
  marque: {
    _id: Schema.Types.ObjectId,
    lib: String
  }
});

var MarqueSchema = Schema({
  _id: Schema.Types.ObjectId,
  lib: String
});

Le souci est que lorsqu’on enregistre un mobilhome avec un ID de marque « bidon », pour valider que l’ID existe bien et qu’un petit malin ne s’amuse pas à essayer d’enregistrer un ID bidon, on veut valider la donnée.

Il faut donc aller chercher dans la collection Marque, si l’ID existe ou non.

On a créé un validateur « custom » mongoose, qui se déclenche au validate(). Dans ce validateur, on fait un marque.findById(ID_A_VALIDER, callback) => ARGH ! on ne récupère le résultat du findById qu’en asynchrone, dans le callback, trop tard pour le validateur mongoose ! En gros, le validateur aurait besoin de savoir, en synchrone, si l’ID existe ou non….

var MobilHomeSchema = Schema({
  _id: {
      type: Schema.Types.ObjectId,
      validate: myCustomValidatorFunction
  marque: {
    _id: Schema.Types.ObjectId,
    lib: String
  }
});

function myCustomValidatorFunction(val){
   // supposons que Marque soit défini, que ce soit un modèle mongoose
   Marque.findById(val, function(err, item){
     if (err) handleError(err);

     // et là, qu'est-ce qu'on fait ?? on retourne TRUE ou FALSE ?
     // ben non... c'est trop tard...
     // 'suite' a déjà été affiché ! Vive l'asynchrone...

     // le code suivant ne sert évidemment à rien :(
     return (item != null);
   });

   console.log('suite');
}

La solution est donc, comme assez souvent avec l’asynchrone, que la librairie nous a prévu le coup ! Le custom validator peut attendre un second paramètre, qui est un callback que mongoose utilise pour traiter des validateurs asynchrones. Bon c’est écrit noir sur blanc dans la doc, mais ça mérite un petit exemple (http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate) :

function myCustomValidatorFunction(val, respond){
   // supposons que Marque soit défini, que ce soit un modèle mongoose
   Marque.findById(val, function(err, item){
     if (err) handleError(err);

     // ici, on appelle le callback avec un booléen en paramètre, résultat de notre validateur
     respond(item != null);
   });
}

D’Angular.js à Backbone.js… le retour

Il y a quelques temps, j’avais écrit un article sur les frameworks JS clients, pour réaliser des applications mono-page (SPA).
Mon choix s’orientait alors plutôt vers Angular.js, après l’avoir testé, ainsi que Ember et Backbone.

Depuis la création de cette article, pas mal d’eau à couler sous le pont de mes essais, et j’avoue revenir vers Backbone.js finalement !

Pourquoi ?
Tout d’abord, entre temps j’avais réalisé mon propotype en Angular.js pour comparer. Seulement, bien que plus simple quand on commence (un certain nombre de choses fonctionnent sans avoir à les coder sois-même : binding des events entre vue et controlleur, etc.), on se rend compte petit à petit que c’est pas forcément le cas quand on dépasse le simple cas d’école, qu’il vaut mieux faire des directives plutôt que d’utiliser des composants natifs (comme pour bootstrap widgets par ex), qu’on est finalement pieds et poings liés au fonctionnement d’Angular. Backbone.js offre beaucoup plus de liberté, puisqu’il est très bas niveau. Il offre des briques avec lesquelles composer, mais finalement c’est toujours la même logique, très simple, bien qu’assez verbeuse.
De plus, en approfondissant le sujet, la verbosité de Backbone peut s’améliorer nettement en ajoutant une surcouche comme Marionette.js

De plus, autre argument non négligeable : Angular est une techno Google, soit disant open-source, mais la seule communauté travaillant sur ce dit  code est… Google ! Et les technos Google sont parfois éphémères.

Bon et pour finir, j’ai aussi été formé entre temps sur Node.js (par Christophe Porteneuve, allez-y les yeux fermés, c’est génialissime ! ), on a pu également échanger sur les frameworks JS pour les SPA, ce qui m’a aussi influencer dans mon choix de Backbone.js. Ca a nettement améliorer ma vision d’ensemble de comment articuler toutes ces briques : serveur, API REST, client, offline first, …

Je commence une application (une vraie, pas un proto cette fois !) en Node.js pour le côté serveur REST, et en Backbone.js/Marionette.js pour le côté client.
Je compte donc vous écrire un petit article là-dessus prochainement !

A bientôt  !

 

La petite pause technique s’offre un hébergement dédié !

Eh oui, ras le bol de l’hébergement mutualisé chez online.net, c’est une misère de performance, et en plus, pour un bidouilleur qui aime toucher à tout, l’hébergement dédié et idéal !J’ai donc franchi le pas, d’autant que j’en utilise déjà au boulot…

Ce blog devrait donc être désormais beaucoup plus rapide qu’avant, sans page 404 ou 500 aléatoires, un wordpress qui se met à jour très simplement, et ce n’est qu’un tout petit aperçu des possibilités qu’offre du dédié.

A votre bon plaisir !

 

Mettre en évidence les champs d’édition d’un nœud synchronisés d’une langue à l’autre (i18n_sync)

En multilingue, lorsque votre contenu contient un grand nombre de champs en tous genres, et que certains sont copiés d’une traduction à l’autre, il est souvent utile pour le contributeur de savoir que tel ou tel champ sera écrasé dans les autres langues. De même, il saura ainsi s’il doit aller dans chaque traduction modifier le champ ou s’il sera copié d’une traduction à l’autre.

C’est le rôle du module « i18n_sync » livré avec le module i18n, mais pas activé par défaut.

Lire la suite

Fontello : l’utiliser avec LESS, industrialisation

Fontello est un outil génial pour généré LA webfont contenant uniquement les caractères dont vous avez besoin => gain de poids énorme.

J’en ai déjà parlé dans mon article « Ajouter LESS à un site Drupal existant » : on sélectionne ses icônes et on télécharge un package contenant la font et le CSS associé généré. C’est très bien pensé car parmi les fichiers CSS, l’un comporte TOUTE la définition de la webfont (fontello.css), alors qu’un autre ne comporte que la définition des icones elles-mêmes (fontello-codes.css).

Lire la suite

Convertir une colonne VARCHAR en DATETIME sans perdre les données (MySQL)

Voici le code compatible MySQL 5.5 (BDD que j’utilise), en passant par une colonne intermédiaire.

ALTER TABLE pre_reservation ADD date_dem_old VARCHAR(30) NULL DEFAULT NULL AFTER date_demande;

update pre_reservation set date_dem_old = date_demande;

ALTER TABLE pre_reservation MODIFY date_demande DATETIME NOT NULL;

UPDATE pre_reservation set date_demande = CAST( FROM_UNIXTIME( date_dem_old ) AS DATETIME );

ALTER TABLE pre_reservation DROP date_dem_old;

Il est possible de faire la même chose en passant par une table intermédiaire, mais c’est un peu plus complexe de faire matcher les lignes de la table source et de la table intermédiaire lors de l’UPDATE (selon la clé primaire qu’il y a).

Ajouter LESS à un site Drupal existant

logo lesscssLESS est un langage dynamique pour écrire des CSS. C’est une surcouche en quelques sortes. Cela ajoute ce qui manque aux CSS : les fonctions, les variables, l’imbrication des instructions principalement. L’autre compilateur/language du même style est SASS. Ce sont 2 très bons outils, le choix vous appartient. Pour avoir fait quelques recherche, on trouve pas mal de librairies (type bootstrap, etc) qui utilisent LESS, d’autre part, le site de LESS est plus clair et beau, et lecompilateur est simple à intégrer, notamment dans Drupal. J’ai donc choisi LESS.

Lire la suite