Snippets

Les snippets sont des bout de code.

Présenté ici de manière volontairement « brute », ces snippets ont vocation à servir d'aide mémoire.

N'hésitez-pas à poser un commentaire si vous rencontrez un problème avec un des éléments.

Vous pouvez utiliser la navigation via les tags présents sur la droite

  • Drupal 7 - Supprimer un champ (de manière brutale)

    Posté le Mercredi 4 novembre 2015 - 16:35
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Parfois vous pouvez vous retrouver avec un problème d'intégrité de données qui entraîne l'impossibilité de supprimer un champ, voici comment faire avec Drush, dans un terminal donc :

    drush eval 'field_delete_field("NOM_MACHINE_DU_FIELD")'
    drush core-cron
    drush eval 'field_purge_batch(1)'
    

    Ou bien dans un HOOK_update_X :

    function MODULE_update_7001() {
      field_delete_field("NOM_MACHINE_DU_FIELD");
      field_purge_batch(1);
    }

     

  • Drupal 7 - Créer un vocabulaire et des terms de taxonomy

    Posté le Mardi 3 novembre 2015 - 09:28
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Le script suivant permet de créer un nouveau vocabulaire et de lui affecter des termes en concervant l'ordre défini dans le tableau.

    Il est à utiliser dans un HOOK_install ou un HOOK_update_X par exemple.

      $voc_name = "Nom du vocabulaire";
      $voc_desc = "Description du vocabulaire";
      $voc_machine_name = "nom_machine"; //sans espace et caractères spéciaux 
    
      $vocabulary = new stdClass();
      $vocabulary->name = $voc_name;
      $vocabulary->description = $voc_desc;
      $vocabulary->machine_name = $voc_machine_name;
      taxonomy_vocabulary_save($vocabulary);
    
      //on charge maintenant le vocabulaire pour avoir son VID
      $vocabulary = taxonomy_vocabulary_machine_name_load($voc_machine_name);
    
      //les termes à créer
      $terms = array(
        'Term 1',
        'Term 2',
        'Term 3',
      );
    
      foreach($terms as $key => $term) {
        $new_term = new stdClass();
        $new_term->name = $term;
        $new_term->weight = $key; //permet de définir le poids (pour l'ordre)
        $new_term->description = '';
        $new_term->vid = $vocabulary->vid;
        taxonomy_term_save($new_term);
      }

     

  • Drupal 7 - Supprimer toutes les entités d'un certain type

    Posté le Mardi 20 octobre 2015 - 10:26
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Pour faire du ménage sur un site et supprimer tous les contenus de test, on peut biensûr le faire à la main, ou utiliser un script.

    Celui qui suit fonctionne à la fois pour les types de contenu mais aussi pour les entités custom.

    Créez un fichier php à la racine de votre site drupal avec le contenu suivant. Modifiez simplement les variables $entity_type et $bundle pour correspondre à votre besoin.

    Pour lancer le script, appelez-le depuis votre navigateur.

    <?php
    define('DRUPAL_ROOT', getcwd());
    
    require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
    
    
    $entity_type = "node"; //Nom du type de l'entité
    $bundle = "article"; //Bundle de l'entité ('article', 'page'...)
    
    $query = new EntityFieldQuery();
    $result = $query
      ->entityCondition('entity_type',$entity_type)
      ->entityCondition('bundle', $bundle)
      ->execute();
    
    $deleted_count = 0;
    foreach ($result[$entity_type] as $key => $record) {
      entity_delete($entity_type,$key);
      $deleted_count++;
    }
    
    print("$deleted_count entites de type $entity_type ont été supprimées.");

     

  • Drupal 7 - Passer des variables à un formulaire

    Posté le Lundi 19 octobre 2015 - 16:57
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Via la fonction drupal_get_form il est possible de passer des variables à notre formulaire custom.

    //On ajoute la ou les variables à la suite de l'identifiant de notre formulaire
    $form = drupal_get_form('mon_formulaire',$ma_variable_a_passer);

    On les récupère ensuite dans la déclaration du formulaire :

    function mon_formulaire($form,&$form_state) {
      //On récupère les variables dans un tableau d'arguments
      $ma_variable_a_recuperer = $form_state['build_info']['args'][0];
      ...
    }

    Même principe avec plusieurs variables :

    $form = drupal_get_form('mon_formulaire',$var1,$var2);

    Récupération :

    function mon_formulaire($form,&$form_state) {
      $var1 = $form_state['build_info']['args'][0];
      $var2 = $form_state['build_info']['args'][1];
      ...
    }

     

  • Drupal 7 - Afficher formulaire de création et modification d'une entité définie par ECK

    Posté le Mardi 13 octobre 2015 - 10:08
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    ECK (Entity Construction Kit) est un module qui permet de créer facilement vos types d'entités via l'interface d'administration de Drupal.

    Il se peut que vous souhaitiez afficher les formulaires à des endroits personnalisés, voila comment faire :

    Formulaire de création

    $entity_machine_name = "lorem"; //Nom machine de votre entité
    $bundle_machine_name = "ipsum"; //Nom machine de votre ipsum
    
    $form = eck__entity__add($entity_machine_name, $bundle_machine_name);
    
    $content = drupal_render($form); 

    Formulaire de modification

    $entity_machine_name = "lorem"; //Nom machine de votre entité
    $bundle_machine_name = "ipsum"; //Nom machine de votre ipsum
    $id = 5; // identifiant de l'entite à modifier
    
    $form = eck__entity__edit($entity_machine_name,$bundle_machine_name,$id);
    
    $content = drupal_render($form); 

     

  • Drupal 7 - Afficher un bloc où l'on veut

    Posté le Jeudi 8 octobre 2015 - 18:04
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Afficher un block créé via l'administration

    $identifiant = 1; //c'est l'identifiant du bloc visible dans l'url lors de sa modification
    $block = block_load('block', $identifiant);
    
    $monBlock = _block_get_renderable_array(_block_render_blocks(array($block)));
    
    //Code pour afficher le block
    //Peut aussi être passé à un template via theme()
    print render($monBlock); 

    Afficher un block créé dans un module

    $module = 'mon_module' //Le nom du module définissant le bloc
    $identifiant = 'mon_bloc'; //le nom "machine" du bloc, défini dans HOOK_block_info()
    
    $block = block_load($module, $identifiant);
    $monBlock = _block_get_renderable_array(_block_render_blocks(array($block)));
    
    //Code pour afficher le block
    //Peut aussi être passé à un template via theme()
    print render($monBlock); 

    Afficher un block créé dans views

    Note : pour cela il est préférable d'utiliser le type d'affichage "Embed" ou "Intégré" de Views, qui est fait pour ça.

    $nom_vue = 'mon_bloc'; //le nom "machine" de la vue
    $nom_affichage = 'block1' //le nom "machine" de l'affichage ("Display")
    
    $block = block_load('views', $nom_vue.'-'.$nom_affichage);
    $monBlock = _block_get_renderable_array(_block_render_blocks(array($block)));
    
    //Code pour afficher le block
    //Peut aussi être passé à un template via theme()
    print render($monBlock); 
    

     

  • Drupal 7 - Form API - #states sur champ checkbox

    Posté le Mercredi 7 octobre 2015 - 20:32
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Exemple issu d'un patch que j'ai soumis pour le module twitter_post :

      $form['twitter_post_add_tracking_code'] = array(
        '#type' => 'checkbox',
        '#title' => t('Add tracking code'),
        '#default_value' => variable_get('twitter_post_add_tracking_code', 0),
      );
      //Le champ qui suit ne sera visible que si le champs précédant est coché
      //cela grâce à l'option #states
      $form['twitter_post_add_tracking_code_utm_medium'] = array(
        '#type' => 'textfield',
        '#title' => t('Campaign Medium  (utm_medium)'),
        '#maxlength' => 140,
        '#default_value' => variable_get('twitter_post_add_tracking_code_utm_medium', ''),
        '#states' => array(
          //À noter, le required ne fera qu'ajouter une asterisque rouge, aucun test ne sera
          //effectué côté serveur. (merci @DuaelFr)
          'required' => array(
            ':input[name="twitter_post_add_tracking_code"]' => array('checked'=>true)
          ),
          'visible' => array(
            ':input[name="twitter_post_add_tracking_code"]' => array('checked'=>true)
          ),
        ),
      );
    

     

  • Drupal 7 - Charger une ou plusieurs entité(s)

    Posté le Mercredi 7 octobre 2015 - 11:13
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Chargement d'une entité :

    $entity_type = 'selection'; //nom du type d'entité
    $entity_id = 1; //l'id de l'entité que l'on veut charger
    
    $entite = entity_load($entity_type,array($entity_id));//la fonction entity_load attends un tableau
    
    $entite = array_pop($entite) //la fonction entity_load retourne un tableau avec comme clé l'id
    //OU
    $entite = $entite[$entity_id]

    Chargement de plusieurs entités :

    $entity_type = 'selection'; //nom du type d'entité
    $entity_id = array(1,5,7);  //les ids des entités que l'on veut charger
    
    $entites = entity_load($entity_type,$entity_ids);//la fonction entity_load attends un tableau
    
    //$entites est un tableau d'entités dont les clés sont les ids (1,5,7 dans cet exemple)

     

  • Drupal 7 - Créer et populer une entité

    Posté le Mercredi 7 octobre 2015 - 09:30
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Dans une fonction :

    $entity_type = 'selection'; //Type de l'entité voulue
    $entity_bundle = 'selection'; //Bundle de l'entité voulue
    
    $entity = entity_create($entity_type, array('type' => $entity_bundle));
    $wrapper = entity_metadata_wrapper($entity_type, $entity);
    
    //Modification de propriétés
    $wrapper->uid = $user_id;
    
    //Modification de champs
    //Remplacez ici "field_selection_country" par le nom machine de votre champ
    $wrapper->field_selection_country->set($country_id);
    
    //Sauvegarde de l'entité et de ses champs
    $wrapper->save();

    À noter, cela peut aussi fonctionner avec un type de contenu, avec les valeurs ci-dessous :

    $entity_type = 'node'; //À ne pas modifier
    $entity_bundle = 'article'; //Nom du type de contenu

     

  • Installer Ruby, Sass & Compass sur Ubuntu

    Posté le Mardi 6 octobre 2015 - 19:11
    Dernière mise à jour le Mardi 31 juillet 2018 - 08:28

    Dans un terminal :

    sudo apt-get install ruby-dev
    sudo gem install sass compass

    Ancienne méthode :

     gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
    sudo apt-get update
    sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties
    sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
    
    curl -L https://get.rvm.io | bash -s stable
    
    rvm install ruby --latest
    
    gem install compass