如何使用hook_views_query_alter()?


20

按照hook_views_query_alter()文档中报告的内容,我创建了一个名为的文件alterform.views.inc,并将其放入名为的已启用模块中alterform。我在alterform.views.inc..中添加了以下代码,但不起作用。

function alterform_views_query_alter(&$view, &$query) {
  switch($view->name) {
    case 'myViewName':  
      echo 'test test'; // test       
      $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";
      $query->orderby[1] = "node_title ASC";
      break;
  }
}

为什么不输出“测试测试”?我的代码有什么问题?

仍然没有测试和视图的输出。我的代码有什么问题?谢谢


从未使用过它,但是有可能您必须alterform.views.inc在模块内部包含/要求它,而 您没有这样做吗?
nonsenz

我已将alterform.views.inc放入我的alterform模块文件中
enjoylife 2011年

如何在模块中包含/要求alterform.views.inc?谢谢
Enjoylife 2011年

Answers:


22

对。为了对模块中的视图执行“任何操作”,必须实现hook_views_api。没有这个,您的模块将根本无法被Views识别(AFAIK)。

请在模块代码中添加以下内容:

/**
 * Implementation of hook_views_api().
 */
function alterform_views_api() { // your module name into hook_views_api
  return array(
    'api' => 2,
    // might not need the line below, but in any case, the last arg is the name of your module
    'path' => drupal_get_path('module', 'alterform'),
  );
}

这应该可以修复它,以便至少可以识别您的模块,然后就可以开始调试它了:)

开始调试视图(例如,轻松的步骤)的一个好方法是将dpm($view);您要实现的视图功能置于开始位置。在大多数情况下,这会将信息转储到屏幕上,以帮助您查看自己的位置。建议在安装/打开devel.module的情况下执行此操作。

编辑:这假定Views 2和Drupal6。您最好问一下这些不是您选择的武器。


这很好:)
kalidasan

4

您可以测试3件事:

  • 清除缓存
  • 下载并启用Devel
  • dpm()代替echo()
  • 测试$view->namedpm()

我已经清除了缓存,并回显了$ view-> name。但在views块中仍然没有任何有关view名称的输出。
Enjoylife 2011年

奇怪的。我通常不依赖echo​​ ...顺便说一句,我注意到您的代码中有一个小错误,应该有一个“}”不应该是...粘贴错误?
马努

但是当我print_r($ views)时,views块中仍然没有关于tit的任何输出。
enjoylife 2011年

除了print_r($ view)是,print_r($ views)不应打印任何内容。你把这个放在开关前吗?
马努

3

您需要将yourmodule.views.inc文件放在模块目录中,而不是放在子目录中,否则View无法自动将其拾取。


2
    $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";

应该

    $query->orderby[0]['field'] = "field_name ASC";

1

如果您使用的是yourmodule.views.inc目录,则需要使用类似于以下代码的方式在模块文件中提及其路径:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
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.