禁用选择表单字段的选项


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 2014年

Answers:


6

禁用“选择”表单字段的选项之一的唯一方法是重写实现hook_theme_registry_alter()theme_select()函数。

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禁用select字段的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数组

编辑:澄清这是一个替代方法,而不是直接的答案。


问题是关于禁用选项之一,而不是对它们进行分组。
kiamlaluno

我了解这一点,但我认为optgroup提供了一个不错的选择。
tostinni 2011年

辉煌!那正是我在寻找的东西,谢谢!!!
uwe 2011年

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是您不想显示的项目的索引。


这将删除该选项。问题是关于禁用该选项(将其显示为灰色)。
科恩2015年

0

将您要禁用的单个项目转换为空<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]是列表中选项的索引

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.