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 « Nombre Décimal »

    Posté le Mercredi 7 mars 2018 - 11:36

    Le type nombre décimal peut-être pratique pour stocker tout nombre à virgule (un prix par exemple).

    Voici comment attacher une propriété « nombre décimal » à un type d'entité personnalisé.

    1. $fields['prix'] = BaseFieldDefinition::create('decimal')
    2. ->setLabel(t('Prix'))
    3. ->setSetting('unsigned', TRUE)
    4. ->setSetting('scale', 2)
    5. ->setSetting('min', 0)
    6. ->setSetting('suffix', '€ TTC')
    7. ->setRequired(TRUE)
    8. ->setDisplayOptions('form', array(
    9. 'type' => 'number',
    10. 'weight' => 5,
    11. ))
    12. ->setDisplayConfigurable('form', TRUE)
    13. ->setDisplayConfigurable('view', TRUE);

     

  • Drupal 8 - Générer un lien de « flagging » dans le code

    Posté le Jeudi 1 mars 2018 - 19:02

    Voici comment générer un lien pour « flaguer » une entité avec drupal 8 et le module flag :

    1. $type_entite_a_flaguer = 'user';
    2. $id_entitee_a_flaguer = $user->id();
    3. $id_du_flag = 'follow_user';
    4.  
    5. $f = \Drupal::service('flag.link_builder');
    6. $link = $f->build($type_entite_a_flaguer, $id_entitee_a_flaguer, $id_du_flag);

    vous pourrez alors utiliser le lien dans un template en faisant par exemple :

    1. {{- link -}}

     

  • Drupal 8 - Afficher un webform où l'on veut via le code

    Posté le Jeudi 15 février 2018 - 09:14

    Pour récupérer et retourner un webform où l'on veut via le code (que ce soit dans un bloc, un controller...) on peut utiliser les lignes suivantes :

    1. // Ici, « contact » est le nom machine de mon webform
    2. $webform = \Drupal::entityTypeManager()->getStorage('webform')->load('contact');
    3. return $webform->getSubmissionForm();

     

  • Drupal 8 - Domain Access - récupérer le domaine courant

    Posté le Jeudi 8 février 2018 - 16:16
    Dernière mise à jour le Jeudi 12 avril 2018 - 18:17

    Voici comment récupérer le domaine actif quand on utilise le module Domain Access pour Drupal 8 :

    1. $current_domain = \Drupal::service('domain.negotiator')->getActiveDomain();

    Pour récupérer le domaine par défaut :

    1. $default_domain = \Drupal::service('entity_type.manager')->getStorage('domain')->loadDefaultDomain()

     

  • Drupal 8 - Entité - Champ de base « link » (lien / URL)

    Posté le Mardi 6 février 2018 - 17:15

    Pour créer un champ de base de type lien, dans la définition de votre entité :

    1. $fields['mon_lien'] = BaseFieldDefinition::create('link')
    2. ->setLabel(t('Path'))
    3. // valeurs possible : LinkItemInterface::LINK_EXTERNAL ou LinkItemInterface::LINK_GENERIC
    4. ->setSetting('link_type', LinkItemInterface::LINK_GENERIC)
    5. //Activer ou non le titre
    6. ->setSetting('title', DRUPAL_DISABLED)
    7. ->setDisplayOptions('form', [
    8. 'type' => 'link_default',
    9. 'weight' => 0,
    10. ])
    11. ->setDisplayConfigurable('form', TRUE);

     

  • CentOS - Mettre à jour PHP vers la version 7.1

    Posté le Jeudi 25 janvier 2018 - 18:43
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    En supposant que vous utilisez les dépôt REMI et que vous ayez préalablement testé tous vos sites pour vérifier leur bon fonctionnement sous PHP 7.1 :

    1. yum-config-manager --enable remi-php71
    2. yum update

    Vous pouvez ensuite tester voir si vos sites répondent. Si c'est ok, tentez un coup de relancer apache ou nginx, et si tout fonctionne encore, alors bravo, vous avez gagné !

     

  • Terminal - Chaîner des opérations même en cas d'échec

    Posté le Vendredi 19 janvier 2018 - 06:34
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Dans un terminal il est possible d’enchaîner plusieurs opérations avec l'opérateur &&, par exemple :

    1. cp fichier1 fichier2 && rm fichier1

    Ici fichier1 sera copié en fichier2 et une fois terminé fichier1 sera supprimé (oui cela irait plus vite d'utiliser la commande mv, c'est pour l'exemple.)

    Si jamais l'opération cp échoue, la seconde rm ne sera pas executée et tant mieux.

    Par contre dans certain cas, on veut enchaîner des opérations même si une ou plusieurs échouent, et bien dans ce cas là on peut utiliser l'opérateur ||, exemple :

    1. cp fichier1 fichier2 || cp fichier3 fichier4

    Ici fichier1 sera copié en fichier2 et fichier3 en fichier4, même si la première opération échoue.

  • Drupal - Création d'une table dans une base secondaire

    Posté le Jeudi 4 janvier 2018 - 18:24
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Voici comment créer une table dans une base de donnée autre que celle par défaut.

    Code à mettre dans votre MODULE.install

    Le principe : création d'un « HOOK_schema fake » et utilisation des HOOK_install et HOOK_uninstall pour créer / supprimer cette table en sélectionnant la bonne base.

    Le code est pour drupal 8 mais il peut facilement être adapté pour drupal 7.

    1. <?php
    2.  
    3. use \Drupal\Core\Database\Database;
    4.  
    5. function MODULE_schema_autre_db() {
    6. $schema['users'] = [
    7. 'description' => 'Members informations',
    8. 'fields' => [],
    9. 'primary key' => ['id'],
    10. ];
    11.  
    12. $schema['users']['fields']['id'] = [
    13. 'description' => 'ID',
    14. 'type' => 'serial',
    15. 'not null' => TRUE,
    16. 'unsigned' => TRUE,
    17. ];
    18.  
    19. $schema['users']['fields']['uid'] = [
    20. 'description' => 'Drupal ID',
    21. 'type' => 'int',
    22. 'not null' => TRUE,
    23. 'unsigned' => TRUE,
    24. ];
    25.  
    26. $schema['users']['fields']['mail'] = [
    27. 'type' => 'varchar',
    28. 'length' => 255,
    29. ];
    30. return $schema;
    31. }
    32.  
    33.  
    34. function MODULE_install() {
    35. Database::setActiveConnection('NOM_DB');
    36. $schema = MODULE_schema_autre_db();
    37. foreach ($schema as $name => $table) {
    38. Database::getConnection()->schema()->createTable($name, $table);
    39. }
    40. Database::setActiveConnection();
    41. }
    42.  
    43. function MODULE_uninstall() {
    44. Database::setActiveConnection('NOM_DB');
    45. $schema = MODULE_schema_autre_db();
    46. foreach ($schema as $name => $table) {
    47. Database::getConnection()->schema()->dropTable($name);
    48. }
    49. Database::setActiveConnection();
    50. }

     

     

  • Drupal 8 - Rediriger l'utilisateur lors de l'accès aux pages d'un type de contenu en particulier

    Posté le Mercredi 6 décembre 2017 - 09:41
    Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

    Ça vient à contresens du paradigme des noeuds, mais parfois on souhaite que les pages de détail d'un noeud d'un type de contenu en particulier ne soient pas accessible.

    Avec quelques adaptation, ceci peut aussi fonctionner pour les pages de terme de taxonomie.

    Voici comment faire :

    1ère étape, déclarer un services dans mon_module.services.yml

    1. services:
    2.   mon_module.node_cp_redirect:
    3.   class: Drupal\mon_module\EventSubscriber\NodeCPRedirect
    4.   tags:
    5.   - { name: event_subscriber }

    2ème étape, créer l'event subscriber: src/EventSubscriber/NodeCPRedirect.php dans le dossier de mon module.

    Ici je vais chercher à rediriger tous les noeuds de type « communiques_de_presse » vers la vue « view.front_communiques_de_presse.page », mais cela peut-être évidement n'importe quelle route.

    1. <?php
    2.  
    3. namespace Drupal\mon_module\EventSubscriber;
    4.  
    5. use Drupal\Core\Url;
    6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    7. use Symfony\Component\HttpFoundation\RedirectResponse;
    8. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    9. use Symfony\Component\HttpKernel\KernelEvents;
    10.  
    11. class NodeCPRedirect implements EventSubscriberInterface {
    12.  
    13. public static function getSubscribedEvents() {
    14. return [KernelEvents::REQUEST => [['redirectionCommuniquesPresse']]];
    15. }
    16.  
    17. /**
    18.   * Redirection des contenus de type communique_de_presse vers la vue de listing.
    19.   */
    20. public function redirectionCommuniquesPresse(GetResponseEvent $event) {
    21. $request = $event->getRequest();
    22.  
    23. if ($request->attributes->get('_route') !== 'entity.node.canonical') {
    24. return;
    25. }
    26. if ($request->attributes->get('node')->getType() !== 'communique_de_presse') {
    27. return;
    28. }
    29. $response = new RedirectResponse(Url::fromRoute('view.front_communiques_de_presse.page')->toString(), 301);
    30. $event->setResponse($response);
    31. }
    32.  
    33. }

     

  • Drupal 8 - Views - Récupérer un formulaire exposé

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

    Pour un besoin spécifique, il fallait que je récupère un formulaire exposé de views pour l'afficher ailleurs.

    Il fallait en fait qu'à un endroit j'affiche les filtres exposés et à un autre le tri exposé.

    J'ai donc créé un bloc, qui récupère ce formulaire, masque un champ.

    Voici donc comment récupérer un formulaire exposé :

    1. $view_name = 'ma_vue';
    2. $view_display = 'page';
    3.  
    4. $view = \Drupal\views\Views::getView($view_name);
    5. $view->initHandlers();
    6. $view->setDisplay($view_display);
    7. $form_state = new \Drupal\Core\Form\FormState();
    8. $form_state->setFormState([
    9. 'view' => $view,
    10. 'display' => $view->display_handler->display,
    11. 'exposed_form_plugin' => $view->display_handler->getPlugin('exposed_form'),
    12. 'method' => 'get',
    13. 'rerender' => TRUE,
    14. 'no_redirect' => FALSE,
    15. 'always_process' => TRUE,
    16. ]);
    17.  
    18. // Ici j'ajoute une info pour connaitre le contexte si le formulaire est altéré
    19. // afin de distiguer cette instance de formulaire de la « normale ».
    20. $form_state->addBuildInfo('exposed_block', TRUE);
    21.  
    22. $form = \Drupal::formBuilder()->buildForm('Drupal\views\Form\ViewsExposedForm', $form_state);
    23.  
    24. // Je masque le champs qui ne m'intéresse pas
    25. $form['sort_by']['#access'] = FALSE;

    Dans le cadre d'un HOOK_form_alter je peux récupérer l'information "exposed_block" de la façon suivante :

    $form_state->getBuildInfo()['exposed_block']