在Drupal 7的公开视图过滤器上使用hook_form_alter


12

我在使用hook_form_alter()Views 3和Drupal 7时遇到了一些麻烦。

我无法添加if语句来唯一标识视图;无论我输入什么内容,都永远不会发现if语句是正确的。但是,我可以使用以下命令轻松地使用form_id,因此我不确定哪里出错了!

if ($form_id == 'views_exposed_form') {
}

如何使用hook_form_alter()独特地改变我的单一观点?

Answers:


25

您可以通过访问在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
        }
    }
}

这是一个更好的解决方案,因为$ form_id对于暴露的表单是不够的(与其他答案的状态不同),不幸的是,在某些情况下,在同一页面上具有复杂的视图集的情况下,current_display可能不够用
Rotari Radu 2015年

同意-这是更具针对性的解决方案。如果您使用多个视图公开的过滤器表单,则非常有用。
Sage

使用drupal_set_message($ view-> name); &drupal_set_message($ view-> current_display); 得到你的名字。我有点困惑,认为它是“ views_deals”,但就我而言,这只是“ deals”。
柯林斯

我们如何做同一件事Drupal 8?
Sharique

最好使用mymodule_form_views_exposed_form_alter() 代替mymodule_form_alter,然后可以跳过的检查$form_id
Berend de Boer

18

我要做的是退后一步,看看您是否正在注册此挂钩。经常$form_id改变。

调试过程:

  • 打开开发
  • 像以前使用D6一样,将dsm($ form_id)插入到钩子中
  • 清除缓存

来自drupal.org的示例代码(内部mymodule.moduletemplate.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钩子暴露的过滤器中更改过滤器


2

最近,我也遇到了这个问题,但是我使用的是功能模块,而不是自定义模块。这有助于我解决问题。

/**
 * 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(),
    );
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.