web-dev-qa-db-fra.com

affiche le filtre exposé pour avoir une liste déroulante de référence d'entité dans une entité personnalisée

J'ai généré avec drupal mon propre module et code d'entité de contenu. Après avoir ajouté un champ de référence d'entité utilisateur et un champ de référence d'entité de terme de taxonomie.

Maintenant, je liste mon contenu avec des vues, je ne fais rien avec le code généré, l'intégration est effectuée.

Mais, lorsque j'expose un filtre par champ de taxonomie et champ d'utilisateur, il ne me donne pas la possibilité de l'afficher sous forme de liste déroulante, il apparaît directement comme un champ de texte.

Dans d'autres vues, la liste des nœuds avec des champs de référence d'entité, si j'ajoute un filtre exposé de référence d'entité, m'offre un widget déroulant ou de saisie semi-automatique.

Que dois-je changer pour mon entité pour que la liste déroulante soit sélectionnée pour mon champ de référence d'entité comme filtre exposé dans une vue?

Voici la définition du champ dans la classe Entity

    $fields['term_id'] = BaseFieldDefinition::create('entity_reference')
  ->setLabel(t('Log type'))
  ->setDescription(t('The term ID of the Log entry type.'))
  ->setRevisionable(FALSE)
  ->setSetting('target_type', 'taxonomy_term')
  ->setSetting('handler', 'default:taxonomy_term')
  ->setSetting('handler_settings', 
    array(
      'target_bundles' => array(
        'logs_type' => 'logs_type'
    )))
  ->setTranslatable(FALSE)
  ->setDisplayOptions('view', array(
    'label' => 'inline',
    'type' => 'taxonomy_term',
    'weight' => -2,
  ))
  ->setDisplayOptions('form', array(
    'type' => 'entity_reference_autocomplete',
    'weight' => -2,
    'settings' => array(
      'match_operator' => 'CONTAINS',
      'size' => '60',
      'autocomplete_type' => 'tags',
      'placeholder' => '',
    ),
  ))
  ->setDisplayConfigurable('form', TRUE)
  ->setDisplayConfigurable('view', TRUE);

Mise à jour:

Je parviens à avoir une liste déroulante dans le filtre exposé à mon avis en créant le fichier mymodule.views.inc et en mettant ce code:

function log_activity_views_data_alter(&$data) {
  $data['log']['term_log_tid_depth'] = array(
    'help' => t('Display content if it has the selected taxonomy terms, or children of the selected terms. Due to additional complexity, this has fewer options than the versions without depth.'),
    'real field' => 'term_id',
    'argument' => array(
      'title' => t('Log type (with depth)'),
      'id' => 'taxonomy_index_tid_depth',
      'accept depth modifier' => TRUE,
    ),
    'filter' => array(
      'title' => t('Has taxonomy terms (with depth)'),
      'id' => 'taxonomy_index_tid_depth',
    ),
  );
}

Mais lorsque je choisis un terme pour filtrer la vue, il ne renvoie aucun élément et il doit le faire.

3
ferriol

Comme l'a dit Berdir, tant que https://www.drupal.org/node/2429699 n'est pas prêt, vous devez fournir votre propre plugin Views Filter.

J'ai créé ce plugin, basé sur TaxonomyIndexTid, pour les nœuds, voir https://Gist.github.com/StryKaizer/ae1cb9abc4844a9e7ac12317a9d84a78

Vous devez placer ce fichier dans un module personnalisé à votremodule/src/Plugin/views/filter/NodeIndexNid.php, et également implémenter hook_views_data_alter dans votre fichier yourmodule.module, comme ceci:

/**
 * Implements hook_field_views_data_alter().
 *
 * Views integration for entity reference fields which reference nodes.
 * Adds a term relationship to the default field data.
 *
 * @see views_field_default_views_data()
 */
function yourmodule_field_views_data_alter(array &$data, FieldStorageConfigInterface $field_storage) {
  if ($field_storage->getType() == 'entity_reference' && $field_storage->getSetting('target_type') == 'node') {
    foreach ($data as $table_name => $table_data) {
      foreach ($table_data as $field_name => $field_data) {
        if (isset($field_data['filter']) && $field_name != 'delta') {
          $data[$table_name][$field_name]['filter']['id'] = 'node_index_nid';
        }
      }
    }
  }
}
4
StryKaizer

Views n'offre actuellement que cela pour les références taxonomy_term, car taxonomy.module fournit une intégration spéciale de Views.

Il existe des problèmes de base ouverts pour rendre ce générique, par exemple: https://www.drupal.org/node/2429699 .

Jusqu'à ce que cela soit résolu, vous devez fournir votre propre plug-in de filtre de vues pour cela, basé sur\Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid, et ajouter un gestionnaire views_data à votre type d'entité où vous remplacez le filtre utilisé pour ce champ , comme taxonomy.module le fait pour tous les champs de référence d'entité pointant vers des termes dans taxonomy_field_views_data_alter ()

1
Berdir

Le module Filtres exposés de référence d'entité offre la possibilité de générer un filtre exposé de vues des entités Titres référencées.

1
romain ni