フォームの選択フィールドのオプションを無効にする


9

フォームの選択フィールドのオプションを無効にするにはどうすればよいですか?

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

たとえば、「タイトルのみ」オプションを無効にするにはどうすればよいですか?


これは、方法を知るのに最適です。オプションをリストに表示したいのですが、選択できません...
DrCord

回答:


6

「選択」フォームフィールドのオプションの無効1への唯一の方法は、上書きすることであるtheme_select()関数の実装hook_theme_registry_alterを()

theme_select() 次のコードを実行します。

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

実装する関数は、form_select_options()ではなく独自の関数を呼び出す必要があります。

theme_select()Drupalフォームで使用される各選択フィールドに対して呼び出されるので、必要なフォームフィールドからオプションを削除するために、hook_form_alter()を実装することを検討します。


6

オプションを無効にするのは難しい場合があります(form_alterを使用して、選択フィールドのONEオプションを無効にする)ため、代わりにoptgroupsを検討することをお勧めします。Drupal フォームAPIのドキュメントにはそれが説明されていませんが、APIはオプションのネストされた配列を許可しています。form_select_options()<optgroup>パートを見てください
あなたはこのコードを書くことができます:

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

見ていDrupalの6フォームとOPTGROUPアレイを

編集:これを明確にするために、これは選択肢であり、直接的な回答ではありません。


問題は、オプションをグループ化するのではなく、1つを無効にすることです。
kiamlaluno

私はそれを理解しましたが、optgroupが良い代替案を提供すると思いました。
tostinni 2011

鮮やかさ!それがまさに私が探していたものです、ありがとう!!!
uwe

3

個別のオプションを無効にする方法がわかりません。彼らはこのようなものをDrupalに取り込もうとしているように見えます。多分いくつかの代替案、CSSであなたがしたいことはありますか?:

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

または、値をまったく表示したくない場合は、設定を解除できます

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

3

私は次のラインで私の仕事を得ました

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

1は、表示したくないアイテムのインデックスです。


これにより、オプションが削除されます。問題は、オプションを無効にすることです(灰色で表示されたままにします)。
Koen

0

無効にする1つのアイテムを空に変換します<optgroup>

長所:

  • これはhook_form_alter、カスタムフォームを作成するときに、または直接行うことができtheme_selectます。テーマに関数を実装する必要はありません。

短所:

  • 結果のDOMでvalue='title'オリジナル<option>に関連付けられた属性を表す方法はありません。
  • YMMVは、すでにoptgroupに関連しているオプションを無効にしようとしている場合。ネストされたoptgroupは実際に機能する可能性がありますが、これはテストされておらず、確認されていません。

実装:

Drupalのoptgroupは、値がそれ自体配列であるペア#optionsとして配列内に示されkey => valueます。

したがって、OPの例から、の値をt('Titles only')に移動し、値をkey空の配列にします。

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

結果のHTMLは次のようになります。

<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

フィールド全体を無効にするには、次を使用します

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

選択フィールドのオプションを無効にするには、次を使用します

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

どこ:

['field_name']はフィールドの名前です

[1]はリスト内のオプションのインデックスです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.