Answers:
您可以通过访问在hook_form_alter中访问视图对象$form_state['view']
。这样就可以识别特定的视图:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'views_exposed_form') {
$view = $form_state['view'];
if ($view->name == 'my_view_machine_name' && $view->current_display == 'display_name') {
// alter your exposed form here
}
}
}
mymodule_form_views_exposed_form_alter()
代替mymodule_form_alter
,然后可以跳过的检查$form_id
。
我要做的是退后一步,看看您是否正在注册此挂钩。经常$form_id
改变。
调试过程:
来自drupal.org的示例代码(内部mymodule.module
或template.php
文件):
<?php
/**
* Implements hook_form_alter().
*/
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'form_views_exposed_form') {
drupal_set_message("Form ID is : " . $form_id);
}
}
?>
您将看到一堆打印出的表单ID,然后选择显示在表单挂钩上的视图并从那里开始工作。
另外,使用drupal 7,您可以直接通过ID定位特定表单。
例:
<?php
/**
* Implements hook_form_alter().
*/
function mymodule_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
drupal_set_message("Form ID is : " . $form_id);
}
?>
请注意,如果您使用多个公开的表单,则可以通过检查表单更改函数中的$ form ['#id']来检查特定视图。
最后,如果那行不通,我建议您查看此问题队列: 如何在通过form_alter钩子暴露的过滤器中更改过滤器
最近,我也遇到了这个问题,但是我使用的是功能模块,而不是自定义模块。这有助于我解决问题。
/**
* Implements hook_views_api_alter()
*/
function MY_FEATURE_views_api_alter(&$vars) {
if (isset($vars['MY_FEATURE'])) {
$vars['MY_FEATURE']['path'] = drupal_get_path('module', 'MY_FEATURE');
}
}
然后,您可以使用hook_form_views_exposed_form_alter():
/**
* Implements hook_form_views_exposed_form_alter().
*/
function MY_FEATURE_form_views_exposed_form_alter(&$form, &$form_state) {
if($form['#id'] == 'views-exposed-form-search-products-page') {
$form['price'] = array(
'#type' => 'select',
'#size' => NULL,
'#options' => _getPriceOptions(),
);
}
}