web-dev-qa-db-fra.com

Désactiver une option pour le champ de formulaire de sélection

Comment désactiver une option dans le champ de formulaire de sélection?

$form['feed'] = array(
  '#type' => 'select', 
  '#title' => t('Display of XML feed items'), 
  '#options' => array(
    'title' => t('Titles only'), 
    'teaser' => t('Titles plus teaser'), 
    'fulltext' => t('Full text'),
  ),
  '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Comment puis-je désactiver, par exemple, l'option "Titre uniquement"?

9
Miguel Borges

Désactiver une option peut être difficile à réaliser ( tiliser form_alter pour désactiver UNE option d'un champ de sélection ) donc je vous recommande de regarder optgroups comme alternative. La documentation Drupal API de formulaire ne l'explique pas mais l'API autorise un tableau imbriqué pour les options, jetez un œil à form_select_options () et le <optgroup> partie.
Vous pouvez écrire ce code:

$form['feed'] = array(
    '#type' => 'select', 
    '#title' => t('Display of XML feed items'), 
    '#options' => array(
        'Titles only' => array(, 
          'teaser' => t('Titles plus teaser'), 
          'fulltext' => t('Full text'),
        ),
        'Titles only 2' => array(, 
          'teaser2' => t('Titles plus teaser 2'), 
          'fulltext2' => t('Full text 2'),
        ),
    ),
    '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Jetez un œil à formulaires Drupal 6 et tableaux optgroup .

Edit : pour clarifier c'est une alternative et non une réponse directe.

6
tostinni

La seule façon de désactiver l'une des options d'un champ de formulaire "sélectionner" est de remplacer la fonction theme_select () implémentant hook_theme_registry_alter () .

theme_select() exécute le code suivant:

function theme_select($variables) {
  $element = $variables['element'];
  element_set_attributes($element, array('id', 'name', 'size'));
  _form_set_class($element, array('form-select'));

  return '<select' . drupal_attributes($element['#attributes']) . '>' . form_select_options($element) . '</select>';
}

La fonction que vous implémentez doit appeler votre propre fonction au lieu de form_select_options () .

Comme theme_select() est appelé pour chaque champ de sélection utilisé dans n'importe quel formulaire Drupal, je préfère envisager d'implémenter hook_form_alter () pour supprimer l'option de la champ de formulaire que vous souhaitez.

6
kiamlaluno

Je ne sais pas et je n'ai pas réussi à trouver un moyen désactiver une option individuelle. On dirait qu'ils essaient de faire quelque chose comme ça dans Drupal. Peut-être quelques alternatives, ce que vous voulez faire avec CSS?:

$form['feed']['#attributes'] = array('class' => array('options-styles-class'));

Ou, si vous ne voulez pas que les valeurs soient affichées, vous pouvez les annuler

unset($form['feed']['#options']['title']);
3
jordojuice

J'ai fait travailler le mien avec la ligne suivante

unset($form['field_name']['und']['#options'][1]);

où 1 est l'index de l'élément que vous ne souhaitez pas afficher.

3
ArchbishopLolly

Convertissez le seul élément que vous souhaitez désactiver en un <optgroup> Vide.

Avantages:

  • Cela peut être fait dans un hook_form_alter Ou directement lors de la création de votre formulaire personnalisé, il n'est pas nécessaire d'implémenter une fonction theme_select Dans votre thème.

Contre:

  • Il n'y a aucun moyen de représenter l'attribut value='title' Associé à l'original <option> Dans le DOM résultant.
  • YMMV si vous essayez de désactiver une option qui appartient déjà à un optgroup. Les optgroups imbriqués peuvent en effet fonctionner, mais cela n'est pas testé et n'est pas confirmé.

Implémentation:

Les groupes optiques dans Drupal sont indiqués à l'intérieur du tableau #options Comme n'importe quelle paire key => value Où la valeur est elle-même un tableau.

Donc, à partir de l'exemple de l'OP, nous pourrions déplacer la valeur de t('Titles only') pour devenir key, puis faire de la valeur un tableau vide.

$form['feed'] = array(
  '#type' => 'select', 
  '#title' => t('Display of XML feed items'), 
  '#options' => array(
    t('Titles only') => array(), // This one becomes disabled as an empty optgroup
    'teaser' => t('Titles plus teaser'), 
    'fulltext' => t('Full text'),
  ),
  '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Le code HTML résultant ressemblera à ceci:

<form>
  <div>
    <label>Display of XML feed items</label>
    <select>
      <optgroup>Titles only</optgroup>
      <option value="teaser">Titles plus teaser</option>
      <option value="fulltext">Full text</option>
    </select>
  </div>
</form>
0
JamesWilson

Pour désactiver l'ensemble du champ, utilisez

$form['field_name']['#disabled']= TRUE;

Pour désactiver une option dans le champ de sélection, utilisez

unset($form['field_name']['und']['#options'][1]);

où:

['field_name'] est le nom de votre champ

[1] est l'index de l'option dans la liste

0
Rony Samuel