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