选择列表的钩形更改 -- 7 领域 和 forms 领域 drupal 相关 的问题

Hook form alter for select list


简体版||繁體版
3
vote

问题

中文

我试图将标题的文本字段过滤器转换为使用钩形窗体删除的选定列表:

  function myhook_form_alter(&$form, &$form_state, $form_id) {    if($form_id == 'views_exposed_form'){        // load nodes filtered by content type - news       $nodes = node_load_multiple(array(), array('type' => 'news'));        // Build an array           $dropdown_array = array('' => '--Any--');       foreach ($nodes as $node) {          $key = $node->title;          $value = $node->title;           $dropdown_array[$key] = $value;               }        // Alter form       $form['title'] = array(               '#type' => 'select',          '#default_value' => '1',                  '#options' => $dropdown_array,       );      }//endif  }   

上面的代码很好。现在我想知道有更好,更短,更高效或适当的API来实现吗?我是一个笨蛋编程的新手。以更糟糕的方式学习代码。请指教。谢谢。

英文原文

I tried to convert a text field filter for title into a select list filtered by content type using hook form alter:

function myhook_form_alter(&$form, &$form_state, $form_id) {    if($form_id == 'views_exposed_form'){        // load nodes filtered by content type - news       $nodes = node_load_multiple(array(), array('type' => 'news'));        // Build an array           $dropdown_array = array('' => '--Any--');       foreach ($nodes as $node) {          $key = $node->title;          $value = $node->title;           $dropdown_array[$key] = $value;               }        // Alter form       $form['title'] = array(               '#type' => 'select',          '#default_value' => '1',                  '#options' => $dropdown_array,       );      }//endif  } 

The code above works well. Now I wonder is there a better, shorter, more efficient or proper API to implement ? I'm a newbie in drupal programming. Learning to code in a more drupal way. Please advise. Thanks.

     
       
       

回答列表

5
 
vote
vote
最佳答案
 

如果您知道此列表不会超过几十个节点(您必须使用更多项目进行一些测试),我只需避免加载完整节点 - 如果您只需要标题,则是不必要的。
此呼叫可能成为一个重要的数据库命中(=>页面将加载较慢,并将在网站上添加更多节点时,将慢向其他访问者慢下来)。
当您调用 node_load() 时,drupal构建完整的节点对象,这意味着它查找添加的所有其他字段,设置和调用来自其他模块的相应节点挂钩。只要您可以,避免将其拨打小细节。

这是你可以使用的东西:

  function myhook_form_alter(&$form, &$form_state, $form_id) {    if($form_id == 'views_exposed_form'){        $nodes = db_select('node', 'n')         ->fields('n', array('title'))         ->condition('type', 'news')         ->orderBy('n.title', 'ASC')         ->execute();       $dropdown_array = array('' => t('-- Any --'));       foreach ($nodes as $node) {         $dropdown_array[$node->title] = $node->title;       }        // Alter form       $form['title'] = array(               '#type' => 'select',          '#default_value' => '1',                  '#options' => $dropdown_array,       );      }//endif  }   

签出也是所选模块for drupal - 它将允许您具有更好的选择表单元素比默认的一个。安装非常简单。
你可以看到一个演示 。

 

If you know that this list won't grow more than few dozens of nodes (you have to make some tests with more items) I'd just avoid loading complete nodes - it's unnecessary if you need only the title.
This call might become a significant database hit (=> page will load slower and will slow down other visitors of the site) when you add more nodes to the site.
When you call node_load(), Drupal builds the complete node object, meaning it looks for all additional fields you added, settings and calls corresponding node hooks from other modules. Avoid calling it for small details whenever you can.

Here's what you could use instead:

function myhook_form_alter(&$form, &$form_state, $form_id) {    if($form_id == 'views_exposed_form'){        $nodes = db_select('node', 'n')         ->fields('n', array('title'))         ->condition('type', 'news')         ->orderBy('n.title', 'ASC')         ->execute();       $dropdown_array = array('' => t('-- Any --'));       foreach ($nodes as $node) {         $dropdown_array[$node->title] = $node->title;       }        // Alter form       $form['title'] = array(               '#type' => 'select',          '#default_value' => '1',                  '#options' => $dropdown_array,       );      }//endif  } 

Check out also Chosen module for Drupal - it will allow you to have a much nicer select form element than the default one. It's pretty straightforward to install.
You can see a demo here.

 
 
 
 

相关问题

9  如何使用正确的方式使用form_set_error()?  ( How do i use form set error the right way ) 
在我的Drupal 7模块中,我有一个表单及其验证处理程序。我从一个字段称我的表单。用 998887664 ;它按预期工作。 在输入值错误的情况下,问题是错误的。 它需要两个错误的提交在显示错误消息之前:第一次,在错误的输入周围有红色边框,第二次,显示错误消息(使用红色边框)。 所以,使用 form_set_erro...

0  在表单提交期间执行jQuery代码  ( Executing jquery code during form submission ) 
我开发了一个模块,以在节点编辑表单上显示"结束" 按钮,它可以正常工作。 function renew_form_alter(&$form, &$form_state, $form_id) { $form['actions']['property_endlease'] = array( '#type'...

1  通过Hook_Form_alter添加类以查看外露过滤器不起作用  ( Adding class to form element via hook form alter for views exposed filter is not ) 
我有一个曝光过滤器的视图,我正在尝试通过 hook_form_alter() 使用以下代码添加类: $form['price']['#attributes'] = array('class' => array('price-hide')); 使用devel表示表单数组显示,这是添加该属性精细的;但是,我只能...

2  Hook_Form_Alter如果启用缓存,则不运行  ( Hook form alter not running if cache enabled ) 
我已经启用了管理员的缓存 - >开发 - >性能。我使用 hook_form_alter 更改了用户配置文件。但是 hook_form_alter中的代码在几天后自动播放。我想,它可能是缓存问题。 我在hook_form_alter中所做的一切都没有运行。我更改了提交按钮值。我添加了一个自定义保存并继续...

0  如何在管理/结构/类型/管理/ <content_type>上制作配置字段粘贴?  ( How to make config fields stick at admin structure types manage content type ) 
我向所有内容类型添加配置选项。我现在有TextField和复选框。 如何保存我在提交时在文本域和复选框的状态中写入的内容?我需要改变此表格的提交功能吗? function neil_misc_form_node_type_form_alter(&$form, $form_state) { global $u...

2  如何通过自定义表单更新节点?  ( How do i update a node via a custom form ) 
我在提交时建立​​了自定义表单(在模块中)在数据库中创建多个相关节点。现在,我需要创建一个模块,以便用户可以在以后更新他/她提交的表单数据。这是我的粗略计划: (1)确定用户想要在请求的URL中通过通配符更新的节点; (2)从数据库中检索所需的数据; (3)构建表单并通过#Value属性插入检索到的数据库值; (4)...

3  如何将表单元素值输出为文本?  ( How to output form element values as text ) 
在节点编辑表单上,我想使某些字段由所有用户不可编辑,但存储在其上的值在表单上可见。我的思想是要将它们作为文本而不是HTML表单元素打印出来。什么是完成此目的的最佳方式? 要提供一些上下文,这些值通过迁移填充,不应在网站上编辑。 ...

1  用户提交的业务多个方面的回顾?  ( User submitted reviews of multiple aspects of a business ) 
我的网站是基于业务的用户提交的评论。我希望用户评价不同的方面和amp;而不是仅仅是一个整体评级。业务提供的服务。例如,我希望他们以"非常无益" 的规模来评价"员工" ,以"非常有帮助" ,"服装质量" 为1-10。我理想情况下也希望用户可以进入的表格领域,例如他们在商店度过了多少。 为用户填写的审查表单创建审查表的...

0  如何更改节点表单上的菜单父选项列表?  ( How to alter menu parent select list on node form ) 
我想修改选择列表以选择菜单父级以用于创建节点(从菜单选项卡)。我正在寻找 $form 变量,但我没有看到此列表数据。如何更改此选择列表? ...

0  WEBForm自定义验证红色亮点  ( Webform custom validation red highlight ) 
如何以编程方式将红色错误边框添加到WebForm组件? 我在表单提交时做如此自定义表单验证,并且我需要在非常特定于我的模块的规则下设置红色边框。 目前,我正在进行以下操作: form_set_error('email_address', 'Please supply matching email addresse...

6  如何更改“请求新密码”表单验证  ( How to alter the request new password form validation ) 
我已使用hook_form_form_id_alter调整了登录过程,以便凭据检查另一个数据库。现在我也需要更改忘记密码验证。似乎此表单的Form_ID是User_pass,但是,我为此定义的钩子不触发。我也尝试使用hook_form_alter来查看触发的表单,但钩子也从未触发(虽然为例)。 是"请求新密码" 某种...

1  如何在hook_node_load()中添加表单到$节点?  ( How to add a form to node in hook node load ) 
我想在传递到主题层之前向节点添加表单。 我的模块有一个 hook_node_load < / a>,如下: function gp_shop_node_load($nodes, $types) { foreach($nodes as $nid => $node) { //Determine if w...

2  Drupal的Multiboad Filefield小部件是否提供了表单API元素?  ( Does multiupload filefield widget for drupal provides a form api element ) 
我有一个表单在我的drupal页面上,使用multiboad filefield窗口小部件一次上传多个图像。 我想使用hook_form_alter从我的自定义模块改变此多层文件域窗口小部件的功能。 起初我认为它将是 managed_file 小部件。但它不是。 有没有办法做到这一点? ...

6  Ajax表单 - 替换#default_value不起作用  ( Ajax form replacing default value not working ) 
我有一个ajax形式。触发按钮时,我要更新文本字段的文本。但这不起作用。我的表格如下: <?php function my_form($form, &$form_state) { $form['ask_first_name'] = array( '#type' => 'textfield', ...

0  更改节点的方面添加表单(不仅通过CSS)  ( Change aspect of node add form not only via css ) 
我需要以图形方式重新创建"节点添加表单" (我的客户端通过PSD通过了 节点的最终版本 )。有没有办法操纵节点添加表单 设计 ,这不是使用CSS的常用变化? ...

0  通过ID块更改登录表单  ( Alter login form in block by id ) 
我在d7上有一个小问题,我需要改变块内的登录表单(将类添加到输入,占位符和提交按钮文本,自定义通过重置和登录链接)IM,即时通讯。我不需要使用自定义模块。 块id = block-user-login,form id = user_login_block 我的主题.php代码 function themenam...

3  以编程方式更新实体参考字段  ( Update entity reference field programmatically ) 
我有点新的沮丧的发展,我有点丢失了我想要做的事情: 我的公司有几个地点,我正在开发一种方法,其中每个位置都可以在我公司网站上有自己的页面。 我希望位置管理人员能够登录并发布关于它们各自位置的新闻文章,并在适当的位置页面上显示这些文章。 我有内容类型设置为"位置" 和"站点文章" 。 "网站文章" 有一个"位置" 字...

3  多步注册表格有两个角色  ( Multistep registration form for two roles ) 
目标: 我有两个不同的用户角色: 借款人 提供者 这些用户有5个类别可以选择(如果他们想要选择所有类别): 市场1 市场2 市场3 市场4 市场5 每个角色都有不同的注册表格,具体取决于他们挑选的类别。假设: 借款人角色: If Market 1: step one: form A...

0  如何从hook_node_presave()输出调试信息?  ( How can i output debug info from hook node presave ) 
我正在学习Drupal 7的模块设计,我想看看hook_node_preSave正在传递哪些(并使用),我如何输出调试信息,以便我学习如何操纵它? 有没有类似的钩子,我可以用来打印出调试信息? ...

4  使用参数创建节点  ( Node creation with parameters ) 
我有一种表单,当提交和验证时,需要重定向到页面以创建节点(节点/添加/ factura-tmn),但我想向此页面发送参数。是否有可能? 我目前有以下代码: function add_invoice_file_form_submit($form, &$form_state) { $form_state['red...

0  更改用户注册中的用户名字段的描述  ( Change the description for username field in user registration ) 
我想禁用用户名中的空格。因为我安装了一个规则模块,我应用了一个规则。一切都很好,但现在标签仍然在说: "Spaces are allowed; punctuation is not allowed except for periods, hyphens, apostrophes, and underscores." ...

2  Ajax回调调用textfield键入  ( Ajax callback called on textfield typing ) 
我正在尝试与自动完成字段完全相同的状态。当用户在Textfield中键入时,我希望Ajax等待其回调,以便用户可以编写所有文本。 我正在尝试在问题。但我失败了。也许是因为我第一次在Drupal中玩JavaScript。无论如何,这是我的代码。 form_alter中的.module(我的特征生成) if (em...

39  添加CSS和JS以形成附件  ( Adding css and js to form with attachments ) 
我需要将一些外部和本地CSS和JavaScript文件添加到表单中,但我似乎无法找到正确的方法。我只需为JS和CSS文件添加路径和URL? 我假设 $form['#attached']['css'][] 和 $form['#attached']['js'][] 是正确的代码,所以他们在形式重建时得到重新加载。我似乎错...

0  用户注册默默地失败 - 如何调试?  ( User registration silently fails how to debug ) 
在我们的Drupal 7站点上,用户注册默默地失败。 Drupal甚至没有达到表格的验证函数。 我们检查了什么: 禁用JavaScript没有帮助。 删除与注册相关的安装模块,例如:logintoboggan,user_registrationPassword没有帮助。 错误日志显示。 用户模块当然是启用,人们...

6  是否有相当于表单编辑的视图模式?  ( Is there an equivalent of view modes for form editing ) 
我有一个包含很多字段的内容类型。最终用户需要创建此类型的内容,因此我想以简化的形式提供它们,以便他们可以在不知道大多数选项的情况下创建内容项并编辑它。然后那些想要潜入复杂性的人可以有一种先进的形式,它暴露了它们。 查看模式看起来像我想要做的那种东西,所以我使用 hook_entity_info_alter 来创建自定...




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