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

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

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