web-dev-qa-db-fra.com

Comment puis-je modifier l'option par défaut '- Tout -' dans les vues du filtre exposé?

J'ai exposé les filtres dans une vue sous forme de listes de sélection. Comment puis-je changer le texte de l'option de filtre par défaut "- Tout - -"? Dans les versions précédentes, il était suggéré d'utiliser une fonction de prétraitement comme celle-ci:

if($form['#id'] == 'views-exposed-form') {
      foreach ($form['FIELDNAME']['#options'] as $key => &$option) {
        if ($key === 'All') {
          $option = 'All';
        }
      }
    }

Mais dans Drupal 8, au lieu d'une clé/valeur modifiable, il est coincé dans une classe protégée.

protected string -> string(7) "- Any -"

Comment puis-je modifier cela?

Remarque: J'ai également essayé de meilleurs filtres exposés, mais il n'est pas en mesure de réécrire l'option "- N'importe quel".

8
user61857

La clé "All" contient un objet traduisible, donc cela fonctionne comme avant, il vous suffit de faire quelque chose comme:

$form['field_your_field']['#options']['All'] = t('Text you want');
5
Paulo Gomes

De meilleurs filtres exposés fonctionnent bien pour moi dans mon Drupal 8. La seule chose que vous avez à faire est de suivre ce chemin.

Filtres mieux exposés> Paramètres> Plus d'options> Réécrire les résultats.

Ensuite, vous devez remplacer le texte en utilisant ce format dans Drupal 8. Je pense que ce que vous avez manqué est celui-ci. Remplacez en utilisant ce jeton

- Any -|your replacement
3
Eyosiyas Tadele

J'ai trouvé un moyen de le faire au niveau du thème. Vous pouvez remplacer "- Tout -" par une valeur particulière ou une autre variable.

Copiez select.html.twig dans votre thème. Modifiez le modèle pour vérifier si option.label est égal à '- Tout -' et si c'est le cas, changez-le en ce que vous voulez. Dans le code ci-dessous, il est défini sur la valeur de l'étiquette du filtre.

{% elseif option.type == 'option' %}
  {# custom if statement #}
  {% if option.label == '- Any -' %} 
    {% set option = option|merge({ 'label': element['#title'] }) %}
  {%  endif %}
  <option value="{{ option.value }}"{{ option.selected ? ' selected="selected"' }}>{{ option.label }}</option>
{% endif %}
2
user61857

Peut-être que vous ne voulez pas installer le module "Filtres mieux exposés", et peut-être que vous ne voulez pas coder votre fonction de modèle.

Dans ce cas, vous pouvez choisir soit:

1
augusto

En option, vous pouvez utiliser select.html.twig dans votre thème personnalisé avec le code suivant.

{% spaceless %}
  {% if input_group %}
    <div class="input-group">
  {% endif %}

  {% if prefix %}
    {{ prefix }}
  {% endif %}

  {# Browsers do not recognize pseudo :after selectors, we must create a wrapper
   # around the select element to style it properly.
   # @see http://stackoverflow.com/q/21103542
   #}
  {% if not attributes.offsetExists('multiple') %}
  <div class="select-wrapper">
  {% endif %}
  {% set classes = ['form-control'] %}
  <select{{ attributes.addClass(classes) }}>
    {% for option in options %}
      {% if option.type == 'optgroup' %}
        <optgroup label="{{ option.label }}">
          {% for sub_option in option.options %}
            <option
              value="{{ sub_option.value }}"{{ sub_option.selected ? ' selected="selected"' }}>{{ sub_option.label }}</option>
          {% endfor %}
        </optgroup>
      {% elseif option.type == 'option' %}
        {# custom if statement #}
        {% if option.label == '- Any -' %}
          {% set option = option|merge({ 'label': '-All-' }) %}
        {% endif %}
        <option value="{{ option.value }}"{{ option.selected ? ' selected="selected"' }}>{{ option.label }}</option>
      {% endif %}
    {% endfor %}
  </select>
  {% if not attributes.offsetExists('multiple') %}
  </div>
  {% endif %}

  {% if suffix %}
    {{ suffix }}
  {% endif %}

  {% if input_group %}
    </div>
  {% endif %}
{% endspaceless %}
1
Ruslan P

@ user61857 Cela m'a orienté dans la bonne direction, merci pour votre aide. Le filtre de fusion n'a pas fonctionné pour moi, je ne sais pas ce qui n'allait pas, j'ai donc utilisé l'option plus simple.

      {% elseif option.type == 'option' %}
        {# custom if statement #}
        {% if option.label == '- Any -' %}
          <option value="{{ option.value }}"{{ option.selected ? ' selected="selected"' }}>- All -</option>
        {% else %}
          <option value="{{ option.value }}"{{ option.selected ? ' selected="selected"' }}>{{ option.label }}</option>
        {%  endif %}
      {% endif %}

drupaling heureux

1
Bruce Davidson

Lorsque vous cliquez sur Filtres mieux exposés: Paramètres, puis cliquez sur "Plus d'options pour ...", il y aura une liste déroulante appelée "Options de filtre de réécriture". Là, ajoutez: - Tout - | Tout

ou changez-le en tout ce dont vous avez besoin. Cela marche.

0
hmartens

Vous pouvez le mettre dans votre fichier themename.theme dans votre répertoire de thème. Cela a fonctionné pour moi: -

/**
     * Implements hook_form_alter().
     */
    function nameofwebtheme_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
      if ($form_id=='views_exposed_form' && $form['#id']=='views-exposed-form-what-s-on-page-1') {
        //var_dump($form_id); uncomment to find out the form_id for the if clause above...
        //var_dump($form['#id']); uncomment to find out the form['#id'] for above...
        //var_dump($form); uncomment to look for your field name below...
        $form['field_date_range_value']['#options']['All'] = t('Text you want');
      }
    }
0
Rod