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

9

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"?

Miguel Borges
la source
Ce serait génial de savoir comment faire, je veux toujours que l'option apparaisse dans la liste, mais pas sélectionnable ...
DrCord

Réponses:

6

La seule façon de désactiver l'une des options d'un champ de formulaire "select" 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 cela 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 du champ de formulaire que vous souhaitez.

kiamlaluno
la source
6

La désactivation d'une option peut être difficile à réaliser (en utilisant form_alter pour désactiver UNE option d'un champ de sélection ), je vous recommande donc de considérer les optgroups comme alternative. La documentation de l' API de formulaire Drupal ne l'explique pas, mais l'API autorise un tableau imbriqué pour les options, jetez un œil à form_select_options () et à la <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 aux formulaires Drupal 6 et aux tableaux optgroup .

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

tostinni
la source
La question est de désactiver une des options, pas de les regrouper.
kiamlaluno
J'ai compris cela, mais j'ai pensé qu'optgroup était une bonne alternative.
tostinni
brillant! C'est exactement ce que je cherchais, merci !!!
uwe
3

Je ne sais pas et je n'ai pas trouvé de moyen de désactiver une option individuelle. Il semble 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']);
jordojuice
la source
3

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.

ArchbishopLolly
la source
Cela supprime l'option. La question concerne la désactivation de l'option (en la laissant grisée).
Koen
0

Convertissez l'élément unique que vous souhaitez désactiver en un élément vide <optgroup>.

Avantages:

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

Les inconvénients:

  • Il n'y a aucun moyen de représenter l' value='title'attribut 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é.

La mise en oeuvre:

Les groupes optiques dans Drupal sont désignés à l'intérieur du #optionstableau comme toutes les key => valuepaires où la valeur est elle-même un tableau.

Donc, à partir de l'exemple de l'OP, nous déplacerions la valeur de t('Titles only')pour devenir le key, puis ferions 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>
JamesWilson
la source
0

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

Rony Samuel
la source