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中任何位置出现的复选框列表。更好的选择是一种易于实施的解决方案,但可能并非您想要执行的操作。

以上是 Drupal 6:将视图暴露的过滤器表单选择元素更改为复选框列表 的全部内容, 来源链接: utcz.com/z/311494.html

回到顶部