Snippets

Drupal 8 - Entité - Champ de base « Date »

Partager cet article :

    $fields['date_naissance']  = BaseFieldDefinition::create('datetime')
      ->setLabel(t('Date de naissance'))
      ->setRequired(TRUE)
      ->setDefaultValue(NULL)
      ->setSetting('datetime_type', 'date')
      ->setDisplayOptions('form', array(
        'type' => 'date',
      ))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

 

Pour un champ DateTime : Drupal 8 - Entité - Champ de base datetime

Drupal 8 - Ajouter des propriétés à un type d'entité existant

Partager cet article :

Drupal vient avec des types d'entité prédéfinis (Node, ou User par exemple). À ces type d'entité il est possible d'ajouter des fields, mais il est aussi possible d'ajouter des propriétés.

Voici comment ajouter des propriétés (prénom et nom) aux utilisateurs.

Dans le fichier monmodule.module :

function monmodule_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) {
  if ($entity_type->id() === 'user') {
    $fields = [];

    $fields['firstname'] = \Drupal\Core\Field\BaseFieldDefinition::create('string')
      ->setLabel(t('Firstname'))
      ->setSettings(array(
        'max_length' => 100,
        'text_processing' => 0,
      ))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

    $fields['lastname'] = \Drupal\Core\Field\BaseFieldDefinition::create('string')
      ->setLabel(t('Lastname'))
      ->setSettings(array(
        'max_length' => 100,
        'text_processing' => 0,
      ))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

    return $fields;
  }
}

Dans le fichier monmodule.install :

/**
 * Create user additional properties
 */
function monmodule_update_8001() {
  $entity_manager = \Drupal::entityManager();
  $definition = $entity_manager->getFieldStorageDefinitions('user')['firstname'];
  $entity_manager->onFieldStorageDefinitionCreate($definition);
  $definition = $entity_manager->getFieldStorageDefinitions('user')['lastname'];
  $entity_manager->onFieldStorageDefinitionCreate($definition);
}

function monmodule_uninstall() {
  $entity_manager = \Drupal::entityManager();
  $definition = $entity_manager->getLastInstalledFieldStorageDefinitions('user')['firstname'];
  $entity_manager->onFieldStorageDefinitionDelete($definition);
  $definition = $entity_manager->getLastInstalledFieldStorageDefinitions('user')['lastname'];
  $entity_manager->onFieldStorageDefinitionDelete($definition);
}

 

Drupal 8 - Créer un élément de menu vers une vue

Partager cet article :

Dans le fichier monmodule.links.menu.yml :

monmodule.menu.cle:
  title: 'Titre de ma mage'
  description: 'Liste des options'
  route_name: view.admin_options.page
  parent: system.admin_content
  weight: 90

Quelques explications :

  • monmodule.menu.cle est la clée du menu item, cette clée doit être unique
  • title : Le label affiché pour le menu
  • description : Sera affichée au rollover
  • route_name : le nom de la route, sous la forme view.NOM_VUE.NOM_AFFICHAGE
  • parent : Le parent (niveau supérieur) de notre élément de menu, ici notre menu item sera présent sous "Contenu" dans le menu d'administration
  • weight : le poids de l'élément de menu, pour gérer l'odre.

Petite astuce pour le nom de la route, rendez-vous sur la page d'édition de votre vue vous retrouverez les élement dans l'url (voici un exemple pour mon cas : http://monsite.dev/admin/structure/views/view/admin_options/edit/page

Si vous souhaitez ajouter le menu item au premier "niveau" d'un menu (donc sans parent), au lieu de "parent", il faut utiliser la clé "menu_name" qui doit référencer le nom machine du menu, voici la structure à adopter :

monmodule.menu.cle:
  title: 'Titre de ma mage'
  description: 'Liste des options'
  route_name: view.admin_options.page
  manu_name: "main"
  weight: 90

Drupal 8 - Entité - Champ de base « image »

Partager cet article :

$field['photo'] = BaseFieldDefinition::create('image')
      ->setLabel(t('Photo'))
      ->setDescription(t("Photo du contenu"))
      ->setSettings([
        'file_directory' => 'dossier/image',
        'alt_field_required' => FALSE,
        'file_extensions' => 'png jpg jpeg',
      ])
      ->setDisplayOptions('view', array(
        'label' => 'hidden',
        'type' => 'image',
        'weight' => 0,
      ))
      ->setDisplayOptions('form', array(
        'label' => 'hidden',
        'type' => 'image_image',
        'weight' => 4,
      ))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

Merci DuaelFr ;)

Drupal 8 - Views - Ajouter une relation vers une entité de type custom

Partager cet article :

Contexte :

Un type d'entité custom "Carte" qui utilise come table de stockage "cards". Cette entité possède une propriété "owner" qui permet de la relier à l'utilisateur qui possède la carte. (propriété du type "entity_reference").

Dans une vue listant les cartes, on peut facilement créer une relation vers le "owner" pour accèder à ses informations.

Par contre sur une vue listant les utilisateurs, on ne peut pas avoir la relation inverse, liant les utilisateurs à leur carte. Pour cela il faut utiliser le hook_views_data_alter :

/**
 * Implements hook_views_data_alter().
 */
function MONMODULE_views_data_alter(array &$data) {
  $data['users_field_data']['cards'] = [
    'title' => t("Les cartes de l'utilisateur"),
    'help' => t("Permet de relier l'utilisateur courant à ses cartes"),
    'relationship' => [
      'group' => t('Cartes'),
      'label' => t("Cartes de l'utilisateur"),
      'base' => 'cards', // nom de la table stockant nos entités custom
      'base field' => 'owner', // nom du champ sur lequel faire la jointure
      'relationship field' => 'uid', // nom du champ cible sur lequel faire la jointure (de la table users_field_data)
      'id' => 'standard',
    ],
  ];
}

Merci à flocondetoile sur IRC pour m'avoir mis sur la bonne piste !

Pages