禁用“选择表单”字段的选项 -- 7 领域 和 forms 领域 drupal 相关 的问题

Disable an option for the select form field


10
vote

问题

中文

如何在"选择表单" 字段中禁用选项?

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

如何禁用,例如,"仅标题" 选项?

英文原文

How do I disable an option in the select form field?

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

How can I disable, for example, the "Title only" option?

     
 
 

回答列表

6
 
vote

禁用"选择" 表单字段的一个选项的唯一方法是覆盖 theme_select()函数实现 hook_theme_registy_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() 为任何鼠标形式使用的每个选择字段调用,我宁愿考虑实现 hook_form_alter()从所需的表单字段中删除选项。

 

The only way to disable one of the options for a "select" form field is to override the theme_select() function implementing hook_theme_registry_alter().

theme_select() executes the following code:

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

The function that you implement should invoke your own function instead of form_select_options().

As theme_select() is called for each select field used in any Drupal form, I would rather consider implementing hook_form_alter() to remove the option from the form field you want.

 
 
6
 
vote

禁用选项可能是棘手的(使用form_alter禁用一个选定字段的一个选项)所以我建议你看看 Optgroups 作为替代方案。 drupal form 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阵列。

编辑:澄清这是另一种选择,而不是直接答案。

 

Disabling an option may be tricky to achieve (Using form_alter to disable ONE option of a select field) so I'll recommend you to look at optgroups as an alternative. The Drupal form API documentation doesn't explain it but the API allows nested array for the options, have a look at form_select_options() and the <optgroup> part.
You can write this 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.'), ); 

Have a look at Drupal 6 forms and optgroup arrays.

Edit: to clarify this is an alternative and not a direct answer.

 
 
     
     
4
 
vote

我得到了下面的行

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

其中1是您不想显示的项目的索引。

 

I got mine working with the following line

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

where 1 is the index of the item which you don't want to be displayed.

 
 
   
   
3
 
vote

我不知道并没有能够找到任何方式到禁用一个单独的选项。它看起来他们试图将这样的东西变成drupal。也许是一些替代方案,可以用CSS完成什么?:

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

或者,如果您不希望首先要示出的值,则可以取消设置它们

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

I don't know and haven't been able to find any way to disable an individual option. It does look like they are trying to get something like this into Drupal. Maybe some alternatives, could what you want be done with css?:

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

Or, if you don't want the values to be shown at all you can unset them

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

转换要禁用的单个项,以禁用为空 <optgroup>

优点:

  • 这可以在 99887669 或直接在构建自定义表单时完成,无需在主题中实现 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>'; } 0 函数。

缺点:

  • 在得到的dom中没有任何方法可以表示与原始 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>'; } 2 相关联的 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>'; } 1 属性。
  • ymmv如果您尝试禁用已经与OptGroup有关的选项。嵌套的OptGroups可能确实有效,但这是未经测试和未经证实的。

实现:

drupal中的OptGroups在 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>'; } 3 阵列中表示为任何 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>'; } 4 对,其中值本身是一个数组。

所以从op中的例子我们将移动 998876615 的值成为 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>'; } 6 ,然后使值成为空数组。

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

结果HTML将如下所示:

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

Convert the one single item you want to disable into an empty <optgroup>.

Pros:

  • This can be done in a hook_form_alter or directly when building your custom form, there is no need to implement a theme_select function in your theme.

Cons:

  • There's no way to represent the value='title' attribute associated with the original <option> in the resulting DOM.
  • YMMV if you're trying to disable an option that already pertains to an optgroup. Nested optgroups might indeed work, but this is untested and unconfirmed.

Implementation:

Optgroups in Drupal are denoted inside the #options array as any key => value pairs where the value is itself an array.

So from the example in the OP we would move the value of t('Titles only') to become the key and then make the value be an empty array.

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

The resulting HTML will look something like this:

<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
 
vote

要禁用整个字段,请使用

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

在"选择" 字段中禁用选项,请使用

  theme_select()0  

其中:

['field_name'] 是您字段的名称

[1] 是列表中选项的索引

 

For disabling the whole field, use

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

For disabling an option in the select field, use

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

where:

['field_name'] is the name of the your field

[1] is the index of the option in the list

 
 

相关问题

0  用于自定义内容的存档页面  ( Archive page for custom content ) 
我想为自定义内容类型创建一个存档页面。基本上在单个页面上列出它们。 我了解我需要创建一个模块,并实现 hook_block_info() 和 hook_block_view() 。我不知道如何做是为了检索内容,所以我可以循环它。在Wordpress中,有 query_posts($post_type = mycust...

0  内容管理屏幕上的各种“未定义”通知  ( Various undefined notices on content admin screen ) 
我在内容admin屏幕上偶尔地旋转。这些似乎是引用我在模板中的字段,这对这些实际屏幕来说都是很好的。我只是没有得到为什么这个内容管理屏幕正在寻找这些值。 以下是错误消息: • Notice: Undefined property: stdClass::$field_pcast_fname in include...

0  如何在页面标题中添加内容类型令牌?  ( How do i add the content type token in the page title ) 
我已安装页面标题模块。我想要实现的是将内容类型令牌添加为页面标题。我试图在页面标题模块的配置中更改模式,但令牌显示为:"[当前 - 页:页面:页面标题],[field_glossary_transliterations] - [field_glossary_meaning] | [站点:name]。" < / p...

2  Drupal是否已经是照片,即使它已经是正确的图像样式,也是正确的尺寸?  ( Does drupal resave the photo even if its already the correct size as your image ) 
drupal仍会重新按压照片,即使您上传的文件是已经与所选图像样式相同的大小?如果它确实会重新按压,有没有办法阻止它?在这种情况下,图像质量是股份,因为它将其保存在JPG中。 ...

2  魔术引号是否应该打开/关闭Drupal 7?  ( Should magic quotes be on off for drupal 7 ) 
应该打开或关闭魔术引号? ...

0  如何在清单页面中包含表单?  ( How to include a form in a listing page ) 
我正在显示内容信息页面。在内容显示页面的末尾,我需要显示一个表单。 我该怎么做? 我做了什么? 在 hook_menu() 中写入菜单回调 编写了一种收集信息的方法 在 hook_theme() 中注册了主题 写入hook_preprocess_theme()注册变量 创建了一个模板并分配变量 通过完成上...

8  将您自己的内容添加到节点  ( Add your own content to node ) 
我创建了一个模块,将自定义内容添加到节点;我想在节点视图中显示此自定义内容。我认为 hook_node_view() 是右挂钩要使用,但我的内容没有显示。 到目前为止我的内容是以下代码: function mymodule_node_view($node, $view_mode = 'full', $langco...

0  隐藏特定内容类型中的本地选项卡  ( Hide local tabs in specific content type ) 
我想隐藏特定内容类型的本地选项卡。我怎样才能做到这一点?自从我想在其他内容类型中向他们展示以来,我不想删除它 ...

4  如何创建一个接受唯一值的字段?  ( How do i create a field that accepts only unique values ) 
我正在使用字段集合模块,因为我在字段之间有一些复杂的关系,我有试图将其与唯一字段模块集成,而不会成功,因为 字段不支持唯一字段模块集合模块。 有没有更简单的方法检查值是否是唯一的,并且要显示验证错误,如果值不是唯一的? 不幸的是,Drupal 7默认情况下没有此功能,因此必须有一种方法来执行此操作。 ...

1  Drupal 7视图,路径,通过分类节点关联  ( Drupal 7 views paths node associations via taxonomy ) 
在很多小时后,我仍然不能在让我的情况工作中围绕着我的头脑。这是: 我现在正在使用如此/艺术家/艺术家名称路由内容类型艺术家的清洁网址。我有内容类型:arists,专辑发布,旅游日期和媒体。我想使用词汇艺术家标签将所有东西系在一起(是的,甚至艺术家内容类型会被标记)。所以,例如,我在艺术家内容中有"测试艺术家" 。我用...

29  表单中的动态选择列表(依赖下拉列表)  ( Dynamic select list in the form dependent dropdown ) 
我正在使用drupal七。我想在SELECT列表中制作选项依赖于表单中另一个选择列表中选择的值。我相信这已经被询问了很多次,但我很难找到明确的答案,了解如何做到这一点。 表单用于用户输入工作历史记录。它们需要选择一个中队,该中队是对Squadron字段类型的节点引用,这是在下拉列表中。但是,中队,取决于城市下拉列表。...

2  将默认值设置为空结果,视图暴露过滤器  ( Set default to empty result with views exposed filters ) 
我正在使用视图(7.x-3.0-beta3),我已经为视图创建了一个公开的文本过滤器,工作正常。 问题是默认结果值:当字段为空时,显示所有可能的结果。但我想默认情况下显示空结果。如果您有解决方案,请剪切。 ...

2  在Drupal 7中,“由Drupal供电”块的代码在哪里?  ( In drupal 7 where is the code for the powered by drupal block ) 
"由drupal供电" 块曾经是Drupal 6中的模块。我找不到Drupal 7中的这个模块。我在哪里找到这个模块/块?所以我可以复制它,或修改它。 ...

0  在哪里放置脚本以提供ajax / json响应?  ( Where to put a script to provide ajax json response ) 
我正在使用drupal 7.我想创建一个使用drupals db抽象层来查询数据库并吐出JSON数据的PHP脚本。我会在哪里放置这样的脚本?目前,我通过创建一个新的节点,然后在 function theme_process_page() theme/template.php 的 function theme_pro...

2  使用Git将核心和模块保持最新状态  ( Using git to keep core and modules up to date ) 
我正在寻找一种使用git来拉动核心和模块的方法。让我们说,例如,我从Drupal Git克隆Drupal Core,并提交自己的Git Repo;然后,我提取一堆模块,也提交给自己的git repo。 这是可能的吗?我可以在从其他存储库中签出的存储库中的子文件夹吗?我仍然可以使用drupal保持我的代码最新吗?也许我...

8  如何将CSS类添加到渲染阵列?  ( How to add a css class to an render array ) 
在模板文件中,之前 print render($content['field_image']); 我想向 998887661 渲染阵列中的图像添加CSS类。我怎样才能做到这一点? 这是渲染阵列: Array ( [#theme] => field [#weight] => 2 [#title] => Image ...

0  拥有150多个用户字段太重了吗?  ( Is having 150 user fields too heavy ) 
我们的用户实体为公共配置文件有大约5个字段,以及5个字段,设置设置的设置为我们的实现需要60个其他字段(我想到了制作60个"计算字段" )。最后一个可以覆盖用户,所以我们需要另外60秒来存储用户输入的值(不遗留默认值)和30个字段以充当指示使用默认或自定义版本(30个标志是否足够的标志因为60个字段成对,它们是30对...

2  网站离线通知  ( Site offline notification ) 
如何关闭有关站点的通知在维护模式下脱机? 在维护模式下运行。上网。 ...

0  如果页面URL包含“页面=”,则不会呈现使用视图创建的块  ( A block created with views is not rendered if the page url contains page ) 
我有一个奇怪的问题。我正在使用Drupal 7和Omega Subtheme。在视图中,我有一个块定义,它很棒 - 出现它在网站上都应该在网站上 - 除非URL有一个"?页面=" 。有些可能相关的信息:CLEAN_URL和PATHAUTO启用,已安装的三角形和布局,但没有定义DELTAS。 当我创建了一个页面视图(不...

1  在块中显示自定义字段  ( Show a custom field in a block ) 
我疯了试图在侧栏块中显示自定义字段(现在在核心)的值。我试图用渲染函数来显示它,直接调用字段,没有运气。 我有一个名为"content1" 的自定义内容类型,以及名为"field_test1" 的自定义字段;我希望在查看页面节点时将在块上显示该值。 你有什么建议如何做到吗? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.