Как я могу использовать 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внутри вашего модуля, а вы этого не сделали?
нонсенс
я поместил alterform.views.inc в мой файл модуля
alterform
Как включить / потребовать alterform.views.inc внутри вашего модуля? спасибо
наслаждайся

Ответы:

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.

Изменить: Это предполагает, что представления 2 и Drupal 6. Вы бы лучше спросить, если это не ваше оружие выбора.

NikLP
источник
Это отлично работает :)
Kalidasan
4

Вы можете проверить 3 вещи:

  • очистить кеш
  • скачать и включить Devel ,
  • использовать dpm()вместоecho()
  • проверить $view->nameсdpm()
Manu
источник
Я очистил кэш и повторил $ ​​view-> name. но до сих пор нет никакого вывода об имени представлений в блоке представлений.
наслаждайся
странно. Обычно я не полагаюсь на эхо ... Кстати, я заметил небольшую ошибку в вашем коде, есть "}", которого не должно быть ... ошибка вставки?
Ману
но когда я печатаю _r ($ views), в блоке views все еще нет вывода о синице.
наслаждайся
print_r ($ views) не должен печатать ничего, кроме print_r ($ view) yes. Вы положили это перед выключателем?
Ману
3

Вам нужно поместить файл yourmodule.views.inc в каталог модуля, а не в подкаталог, иначе Views не сможет автоматически его забрать.

shaneonabike
источник
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/';
загар
источник