当前位置: 首页 > 编程笔记 >

Drupal 6:将视图暴露的过滤器表单选择元素更改为复选框列表

禄烨然
2023-03-14
本文向大家介绍Drupal 6:将视图暴露的过滤器表单选择元素更改为复选框列表,包括了Drupal 6:将视图暴露的过滤器表单选择元素更改为复选框列表的使用技巧和注意事项,需要的朋友参考一下

前几天,在为Drupal网站创建视图时,我创建了一个公开的表单,但不是将要显示的常规选择框,而是将其作为复选框列表。在Google上进行搜索时,我最终找到了这篇文章,该文章提供了可以实现此目的的功能。这是完整的功能。

/**
 * hack to make exposed dropdowns appear as checkboxes
 * (can't do it w/ form_alter b/c whole structure is different)
 * just render the options directly as checkboxes, pass the values the same as the SELECT,
 * tricks the form api and views to think it's a dropdown
 * [registered w/ hook_theme, toggled w/ #theme in form_alter]
 */
function theme_select_as_checkboxes($element) {
  $output = '';
 
  $selected_options = (array) $element['#post'][$element['#name']]; // 从#options中选择的键
 
  foreach ($element['#options'] as $key => $value) {
    $id = $element['#id'] . '-' . $key; // 风俗
 
    // 选择此选项吗?
    $selected = (array_search($key, $selected_options) !== false); // (返回键或假)
 
    $checkbox = '<input type="checkbox" '
      . 'name="'. $element['#name'] . '[]' .'" ' // 括号是关键-就像选择
      . 'id="'. $id .'" '
      . 'value="'. $key .'" '
      . ($selected ? ' checked="checked" ' : ' ')
      . drupal_attributes($element['#attributes']) .' />';
 
    $output .= '<label for="'. $id .'">' . $checkbox .' '. $value .'</label>' . "\n";
  }
  return theme_form_element($element, $output); // 整齐地包裹它
}

唯一的问题是,作者没有同时包含将该功能集成到站点中所需的其余功能。结果,有很多评论询问如何执行此操作。经过一番修补后,我设法使此功能起作用,所以我认为我会将解决方案放在这里,以防任何人使用。在开始之前,请务必注意所有这些功能必须位于模块中。如果将它们放在template.php文件中,当前它们不会被Drupal接收。

我们需要做的第一件事(在创建视图之后)是创建一个主题挂钩,以便我们可以让Drupal知道该theme_select_as_checkboxes()函数,以便它可以在theme()调用中使用它。

/**
 * Implementation of HOOK_theme.
 *
 * @return array An array of theme hooks.
 */
function mymodule_hooks_theme() {
  return array(
    'select_as_checkboxes' => array(
      'function' => 'theme_select_as_checkboxes'
    ),
  );
}

最后一步是包含hook_form_alter()名称如下形式的函数:

<modulename>_form_<formname>_alter()

公开的表单名称为views_exposed_form,因此在名为“ mymodule”的模块中,将调用该函数modulename_form_views_exposed_form_alter()。此功能的全部作用就是更改表单,以便我们需要更改复选框的任何元素都具有正确的主题。

/**
 * Implementation of HOOK_form_alter().
 *
 * @param array $form        The form
 * @param string $form_state The current state of the form.
 */
function mymodule_hooks_form_views_exposed_form_alter(&$form, &$form_state)
{
    // 我们只想更改某种形式,所以不要让Drupal查看任何形式。
    // 其他公开视图形式
    if ($form['#id'] == 'views-exposed-form-myview-page-1') {
        // 使选择框显示为复选框列表
        $form['formelement']['#theme'] = 'select_as_checkboxes';
        $form['anotherformelement']['#theme'] = 'select_as_checkboxes';
    }
}

一切就绪后,您应该会看到您的选择元素已作为复选框列表打印出来。关于表单的所有内容都将以完全相同的方式工作,显示层即已更改。

对此的另一种解决方案是使用“更好的选择”模块。该模块会将所有多选表单html" target="_blank">元素更改为在Drupal中任何位置出现的复选框列表。更好的选择是一种易于实施的解决方案,但可能并非您想要执行的操作。

 类似资料:
  • 我将primefaces数据表与bootsfaces一起使用,我想解决一个CSS冲突。 从primefaces showcase实现过滤器示例: 给我这个结果:datatable过滤器示例很好 但是,在页面中添加bootsfaces组件,例如(唯一的更改是添加一个空

  • 对不起,我仍然是小新在这方面,只是万一有代码有人想看到我否定这里是整个代码要点嵌入 我花了2个星期建立这个应用程序,并已卡在这个过滤在过去的2天。我需要有这个应用程序MVP明天下午演示在一个就业活动为最近的毕业生,这是仅剩的2件事之一。 我没有足够的代表赏金,但任何帮助或建议都很感激

  • 我的ListView自定义适配器(及其新实现的viewHolder)有一些问题。我有一个列表视图,每个项目都有一个复选框(这里没有新内容)。问题是,如果我的列表中有超过9个项目,当我选中第一个复选框时,第十个将自动选中(第二个与第十一个相同),就像两个项目都有一个监听器一样(我认为在某种程度上是这样)。 我在这里读到了listView、视图回收和ViewHolder解决它的方法的位置问题:如何使我

  • 问题内容: 我想过滤结果。 有一个葡萄酒清单,我的愿望是当未选中任何复选框时,将显示整个葡萄酒清单。 当仅选中1个复选框时,显示相关类别 当选中多个复选框时,将显示相关类别 我是AngularJS的新手,我尝试了ng-model都没有成功,这是没有与函数关联的ng-model的代码: 如何使用ng-model或ng-change将功能与每个复选框按钮相关联以具有实时过滤模型? 问题答案: 只是添加

  • 我试着练习用CSS选择器获取值,我想出了这个(不像预期的那样工作) (我也尝试过) 我对的期望:第三个没有id属性和data-ad-show属性的元素被选中,其值将是所需的值3。

  • 问题内容: 我试图以与从中选择类似的方式选择的列名称。 我似乎找不到解决办法。有没有其他人以前做过此事,或者知道是否有可能? 问题答案: information_schema.columns.Table_name(至少在Sql Server 2000下)包含视图,因此只需使用