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 - Database API - db_select et count

    Posté le Lundi 4 janvier 2016 - 09:26
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Comment utiliser count dans un db_select avec Drupal ?

     

    Dans l'exemple ci-dessous, on détermine le nombre de nodes de type "page" publiées.

    $nb_results = db_select('node')
      ->fields(NULL, array('nid'))
      ->condition('type','page')
      ->condition('status',1)
      ->countQuery()
      ->execute()
      ->fetchField();
    
  • Drupal 7 - Database API - Utiliser IS NULL et IS NOT NULL

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

    Quand l'on fait des jointures on veut parfois récupérer les enregistrements dont un champ n'est pas renseigné ou au contraire que ceux qui le sont.

    Pour cela en SQL on utilise le "IS NULL" ou "IS NOT NULL".

    Pour faire la même chose avec la database API de Drupal 7 il faut utiliser les methodes isNull() et isNotNull().

    Exemple avec isNull() :

    $query = db_select('scald_atoms', 'a');
    $query->fields('a', array('sid','title'));
    $query->leftjoin('table_name','table_alias','table_alias.entity_id = a.sid');
    $query->isNull('table_alias.mon_field_value');
    $query->execute();
    $query->fetchAllAssoc('nid');

    Exemple avec isNotNull() :

    $query = db_select('scald_atoms', 'a');
    $query->fields('a', array('sid','title'));
    $query->leftjoin('table_name','table_alias','table_alias.entity_id = a.sid');
    $query->isNotNull('table_alias.mon_field_value');
    $query->execute();
    $query->fetchAllAssoc('nid');

     

  • 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)