Deaktivieren Sie eine Option für das Feld Formular auswählen

9

Wie deaktiviere ich eine Option im Feld Formular auswählen?

$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.'),
);

Wie kann ich beispielsweise die Option "Nur Titel" deaktivieren?

Miguel Borges
quelle
Dies wäre toll zu wissen, wie es geht. Ich möchte immer noch, dass die Option in der Liste
angezeigt wird

Antworten:

6

Die einzige Möglichkeit, eine der Optionen für ein Formularfeld "Auswählen" zu deaktivieren, besteht darin, die Funktion theme_select () zu überschreiben, die hook_theme_registry_alter () implementiert .

theme_select() führt den folgenden Code aus:

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>';
}

Die von Ihnen implementierte Funktion sollte anstelle von form_select_options () Ihre eigene Funktion aufrufen .

Wie theme_select()für jedes Auswahlfeld, das in einem Drupal-Formular verwendet wird, aufgerufen wird, würde ich lieber hook_form_alter () implementieren , um die Option aus dem gewünschten Formularfeld zu entfernen.

kiamlaluno
quelle
6

Eine Option zu deaktivieren kann schwierig sein , zu erreichen ( Mit form_alter zu deaktivieren ONE Option eines Auswahlfeld ) , damit ich Sie empfehlen zu sehen optgroups als Alternative. Die Dokumentation zur Drupal- Formular-API erklärt dies nicht, aber die API erlaubt verschachtelte Arrays für die Optionen. Schauen Sie sich form_select_options () und das <optgroup>Teil an.
Sie können diesen Code schreiben:

$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.'),
);

Schauen Sie sich Drupal 6-Formulare und Optgroup-Arrays an .

Bearbeiten : Um dies zu verdeutlichen, ist dies eine Alternative und keine direkte Antwort.

tostinni
quelle
Bei der Frage geht es darum, eine der Optionen zu deaktivieren und nicht zu gruppieren.
Kiamlaluno
Ich habe das verstanden, aber ich dachte, optgroup bietet eine gute Alternative.
Tostinni
brillant! Genau das habe ich gesucht, danke !!!
Uwe
3

Ich weiß es nicht und konnte keine Möglichkeit finden , eine einzelne Option zu deaktivieren . Es sieht so aus, als würden sie versuchen, so etwas in Drupal zu bringen. Vielleicht einige Alternativen, könnte das, was Sie wollen, mit CSS gemacht werden?:

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

Wenn Sie nicht möchten, dass die Werte überhaupt angezeigt werden, können Sie sie deaktivieren

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

Ich habe meine mit der folgenden Zeile arbeiten

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

Dabei ist 1 der Index des Elements, das nicht angezeigt werden soll.

ErzbischofLolly
quelle
Dies entfernt die Option. Bei der Frage geht es darum, die Option zu deaktivieren (sie bleibt ausgegraut).
Koen
0

Konvertieren Sie das einzelne Element, das Sie deaktivieren möchten, in ein leeres <optgroup>.

Vorteile:

  • Dies kann in einem hook_form_alteroder direkt beim Erstellen Ihres benutzerdefinierten Formulars erfolgen. Es ist nicht erforderlich, eine theme_selectFunktion in Ihrem Thema zu implementieren .

Nachteile:

  • Es gibt keine Möglichkeit, das value='title'dem Original zugeordnete Attribut <option>im resultierenden DOM darzustellen .
  • YMMV, wenn Sie versuchen, eine Option zu deaktivieren, die sich bereits auf eine Optgruppe bezieht. Verschachtelte Optgruppen könnten zwar funktionieren, dies ist jedoch nicht getestet und nicht bestätigt.

Implementierung:

Optgruppen in Drupal werden innerhalb des #optionsArrays als alle key => valuePaare bezeichnet, bei denen der Wert selbst ein Array ist.

Aus dem Beispiel im OP würden wir also den Wert von verschieben t('Titles only'), um der zu werden, keyund dann den Wert zu einem leeren Array machen.

$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.'),
);

Das resultierende HTML sieht ungefähr so ​​aus:

<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>
James Wilson
quelle
0

Verwenden Sie zum Deaktivieren des gesamten Felds

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

Verwenden Sie zum Deaktivieren einer Option im Auswahlfeld

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

wo:

['Feldname'] ist der Name Ihres Feldes

[1] ist der Index der Option in der Liste

Rony Samuel
quelle