Мой модуль добавляет поле CCK к существующему типу контента. Как затем изменить существующее представление для сортировки с использованием нового поля?


Я создаю новый модуль ('best_answer'), который основывается на функциональности существующего модуля ('ответы').

Новый модуль добавляет новое поле CCK ('best_answer_p') к типу контента CCK ('ответ'), который был определен в исходном модуле.

Исходный модуль также определил представление ('question_answers'), в котором перечислены узлы ответов, отсортированные по нескольким факторам. Я хотел бы изменить это представление, чтобы оно также сортировалось по новому полю "best_answer_p".

Я мог бы сделать это, просто переопределив представление, используя пользовательский интерфейс представлений. Однако это означает, что если какой-либо другой модуль также захочет каким-либо образом переопределить представление, моя сортировка "best_answer" будет потеряна.

Итак, я хотел бы сделать это таким образом, чтобы программно изменять существующее представление, а не переопределять его. Я пытаюсь сделать это с помощью Hook_views_query_alter. Но я столкнулся с ошибкой.

Может ли кто-нибудь указать мне правильное направление?

Вот мой код:

function best_answer_views_query_alter (&$view, &$query) {

  if ($view->name == 'question_answers') {

    // add the best answer field to the query
    $query->tables['node']['node_data_field_best_answer_p'] = array(
      'count' => 1,
      'alias' => 'node_data_field_best_answer_p',
    );

    // sort answers so that the best answer is displayed first 
    $new_orderby[0] = 'node_data_field_best_answer_p_field_best_answer_p_value DESC';
    foreach ($query->orderby as $key => $value) {
      $new_orderby[$key+1] = $value;
    }
    $query->orderby = $new_orderby; 

  }
}

Вот ошибка:

Предупреждение пользователя: Неизвестный столбец "node_data_field_best_answer_p_field_best_answer_p_value" в предложении "порядок" запрос: ВЫБЕРИТЕ node.nid КАК nid, votingapi_cache_node_points_vote_sum.значение КАК votingapi_cache_node_points_vote_sum_ значение, node.создано КАК node_created ИЗ узла узел СЛЕВА ПРИСОЕДИНИТЬСЯ К votingapi_cache votingapi_cache_node_points_vote_sum НА узле.nid = votingapi_cache_node_points_vote_sum.идентификатор содержимого И (votingapi_cache_node_points_vote_sum.content_type = 'узел' И votingapi_cache_node_points_vote_sum.value_type = 'точки' И votingapi_cache_node_points_vote_sum.tag = 'голосовать' И votingapi_cache_node_points_vote_sum.функция = 'сумма') СЛЕВА ПРИСОЕДИНИТЬСЯ К content_type_answer node_data_field_answer_question НА узле.vid = node_data_field_answer_question.vid, ГДЕ (узел.статус <> 0 ИЛИ (узел.uid = 1 И 1 <> 0) ИЛИ 1 = 1) И (узел.введите ("ответ")) И (вопрос node_data_field_answer_question.field_answer_question_nid = 2) ПОРЯДОК ПО node_data_field_best_answer_p_field_best_answer_p_значение DESC, голосование_каче_нод_поинтов_воте_сум_значение DESC, ОГРАНИЧЕНИЕ node_created DESC 0, 10 в D:\xampp\htdocs\drupal\sites\all\modules\views\includes\view.inc на линии 771.

Author: kiamlaluno, 2011-04-30

1 answers

Вы должны переопределить представление и изменить сортировку. Я никогда не видел модуля, который пытался бы изменить представление, определенное другим модулем.

 1
Author: Jody, 2011-04-30 17:31:15