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 8 - Entité - Champ de base « Référence à un terme de taxonomie »

    Posté le Vendredi 28 juillet 2017 - 12:01
    Dernière mise à jour le Jeudi 11 avril 2019 - 09:26

    Pour faire un champ de base référence à un terme de taxonomie, on va utiliser le type "entity_reference", en lui passant évidement le nom du vocabulaire, (ici "option_types") :

    1. $fields['type'] = BaseFieldDefinition::create('entity_reference')
    2. ->setLabel(t('Catégorie'))
    3. ->setSetting('target_type', 'taxonomy_term')
    4. ->setSetting('handler', 'default:taxonomy_term')
    5. ->setSetting('handler_settings', [
    6. // ici définir l'id du vocabulaire
    7. 'target_bundles' => [ 'option_types' => 'option_types']
    8. ])
    9. //on utilisera l'affichage en mode "radio / checkbox" en fonction de la cardinalité
    10. ->setDisplayOptions('form', array(
    11. 'type' => 'options_buttons',
    12. 'weight' => 3,
    13. ))
    14. ->setDisplayConfigurable('form', TRUE)
    15. ->setDisplayConfigurable('view', TRUE);

    Pour utiliser le formulaire type "tag" :

    1. $fields['type'] = BaseFieldDefinition::create('entity_reference')
    2. ->setLabel(t('Catégorie'))
    3. ->setSetting('target_type', 'taxonomy_term')
    4. ->setSetting('handler', 'default:taxonomy_term')
    5. ->setSetting('handler_settings', [
    6. 'target_bundles' => [ 'option_types' => 'option_types']
    7. ])
    8. ->setDisplayOptions('form', array(
    9. 'type' => 'entity_reference_autocomplete',
    10. 'weight' => 3,
    11. 'settings' => array(
    12. 'match_operator' => 'CONTAINS',
    13. 'size' => '10',
    14. 'autocomplete_type' => 'tags',
    15. 'placeholder' => '',
    16. ),
    17. ))
    18. ->setDisplayConfigurable('form', TRUE)
    19. ->setDisplayConfigurable('view', TRUE);

    Cardinalité

    Pour avoir une cardinalité illimitée (autant de valeurs possibles que l'utilisateur le désir) ajouter l'appel suivant à la déclaration de votre propriété :

    1. ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)

    Création automatiques des termes

    Pour permettre la création automatique des terme de taxonomy dans le vocabulaire, les lignes :

    1. ->setSetting('handler_settings', [
    2. 'target_bundles' => [ 'option_types' => 'option_types']
    3. ])

    Deviennent :

    1. ->setSetting('handler_settings', [
    2. 'target_bundles' => [ 'option_types' => 'option_types'],
    3. 'auto_create' => TRUE,
    4. ])

     

     

  • Drupal 8 - Changer le libellé d'un élément de menu

    Posté le Mercredi 26 juillet 2017 - 11:20
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Dans Drupal 8 la gestion des menus et des route à été complètement revue, le hook_menu_alter n'existe plus.

    Si vous souhaitez modifier le label d'un élément de menu (dans la barre d'administration par exemple) il faut utiliser le hook_menu_links_discovered_alter.

    Par exemple si l'on souhaite modifier le menu item « Personnes » (ou « People ») en « Gestion des utilisateurs » :

    /**
     * Implements hook_menu_links_discovered_alter().
     */
    function monmodule_menu_links_discovered_alter(&$links) {
      $links['entity.user.collection']['title'] = t('Gestion des utilisateurs');
    }

    entity.user.collection correspond à la clé de l'élément de menu défini dans le fichier user.links.menu.yml.

    Merci à Julien de m'avoir indiqué ce hook sur IRC ;)

  • Drupal 8 - Créer un alias d'url dans le code

    Posté le Jeudi 8 juin 2017 - 10:05
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Pour créer un alias d'url dans le code, au sein d'une fonction d'update par exemple on appelle le service path.alias_storage :

    function MON_MODULE_update_8021() {
      \Drupal::service('path.alias_storage')->save('/url-de-base', "/mon/alias/propre");
    }
    

     

  • Drupal 8 - Routing - Utiliser le theme d'administration

    Posté le Lundi 15 mai 2017 - 16:15
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Pour définir qu'une route doit utiliser le thème d'administration, il faut utiliser le fichier MON_MODULE.routing.yml.

    Cela se fait en défininssant l'option _admin_route à TRUE.

    Exemple :

    1. ma.route:
    2.   path: '/mon/chemin'
    3.   defaults:
    4.   _controller: '\Drupal\mon_module\Controller\MonController::MaMethode'
    5.   _title: 'MaMethode'
    6.   options:
    7.   _admin_route: TRUE

     

  • Drupal 8 - Entité - Champ de base «Liste d'entiers»

    Posté le Vendredi 14 avril 2017 - 08:48
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35
        $fields['photos_number'] = BaseFieldDefinition::create('list_integer')
          ->setLabel(t('Nombre de photos autorisées'))
          ->setRequired(TRUE)
          ->setSettings(array(
            'allowed_values' => [
              1 => t('1 photo'),
              2 => t('2 photos'),
              3 => t('3 photos'),
            ],
          ))
          ->setDefaultValue('public')
          ->setDisplayOptions('form', array(
            'type' => 'options_buttons',
          ))
          ->setDisplayConfigurable('form', TRUE)
          ->setDisplayConfigurable('view', FALSE);

     

  • Drupal8 - Installer un module dans le code

    Posté le Jeudi 6 avril 2017 - 13:13
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Pour installer un module via le code dans drupal 8 il faut utiliser le service ModuleInstaller, exemple avec le snippet suivant :

     \Drupal::service('module_installer')->install(['mon_module']);

    Les dépendances, si existantes seront automatiquement installées aussi.

    Pour activer plusieurs modules à la fois, il faut simplement les ajouter à l'array :

     \Drupal::service('module_installer')->install(['mon_module', 'mon_autre_module']);

    La pluaprt du temps vous voudrez utiliser cette solution dans une fonction d'update :

    /**
     * Enable modules
     */
    function HOOK_update_8001() {
     \Drupal::service('module_installer')->install(['mon_module', 'mon_autre_module']);
    }
    
  • Drupal 8 - Flag - Récupérer le nombre de « flag » d'une entité

    Posté le Lundi 27 mars 2017 - 16:07
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Comment récupérer le nombre de fois qu'une entité a été « flaguée » via le module Flag dans drupal 8 :

    $flag_number = \Drupal::service('flag.count')->getEntityFlagCounts($mon_entite);
    return isset($flag_number['NOM_MACHINE_FLAG']) ? $flag_number['NOM_MACHINE_FLAG'] : 0;

    Plus d'exemples : https://www.drupal.org/node/2476349

  • Sauvegarde d'un dossier via FTP (sans rsync ou ssh)

    Posté le Mercredi 1 mars 2017 - 08:40
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Certains mutualisé n'offrent toujours pas d'accès SSH, donc les backup ne peuvent se faire via rsync par exemple. 

    On peut dans ce cas utiliser la commande "lftp" avec la ligne de commande suivante, à adapter selon vos environnement :

    lftp ftp://USER:PASSWORD@HOST -e "mirror --delete --only-newer --verbose CHEMIN/DISTANT/A/SAUVEGARDER/ /DOSSIER/LOCAL/;exit;"

    Ici le dossier CHEMIN/DISTANT/A/SAUVEGARDER du serveur HOST sera sauvegardé récursivement dans le dossier /DOSSIER/LOCAL/ en se connectant avec l'identifiant USER et le mot de passe PASSWORD.

    --delete supprimera les fichiers local qui n'existent pas/plus sur le serveur distant (dans le cas de sauvegardes repetitives)

    --only-newer ne retransferera pas les fichiers déjà existants (toujours dans le cas de sauvegardes repetitives)

    On peut caler cette ligne directement comme une tache cron pour automatiser les sauvegardes.

    Note : lftp n'est parfois pas installé de base, pour l'installer sous debian / ubuntu :

    sudo apt-get install lftp

    centos / redhat / fedora :

    sudo yum install lftp

    Si vous voulez utiliser sftp c'est possible :

    lftp sftp://USER:PASSWORD@HOST -e "mirror --delete --only-newer --verbose CHEMIN/DISTANT/A/SAUVEGARDER/ /DOSSIER/LOCAL/;exit;"

     

    Tags

  • Drupal 8 - Ajouter des variables à l'objet javascript DrupalSettings

    Posté le Mercredi 11 janvier 2017 - 18:44
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Via le hook hook_page_attachments() :

    /**
     * Implements hook_page_attachments().
     *
     * Add custom variables to DrupalSettings.
     */
    function MODULE_page_attachments(array &$attachments) {
      $attachments['#attached']['drupalSettings']['basepath'] = base_path();
      $attachments['#attached']['drupalSettings']['pathtotheme'] = base_path() . drupal_get_path('theme', \Drupal::theme()->getActiveTheme()->getName());
      $attachments['#attached']['drupalSettings']['pathtotfiles'] = PublicStream::basePath();
    }