Дорабатываем формирователь запроса во Views

Главные вкладки

Аватар пользователя dimanjy dimanjy 13 сентября 2007 в 23:26

Задумал сделать на сайте возможность писать отзывы к узлам. Воспользовался модулем nodereview. Очень симпатичный модуль, делает соответствующие закладки к узлу "Просмотреть отзывы" и "Добавить отзывы", а также позволяет формировать категории для оценки, например "Качество обслуживания", "Скорость доставки".

Вот с этими-то категориями я и налетел на грабли, пытаясь сформировать отображение таблицы со списком всех узлов и суммой баллов отзывов. Дело в том, что nodereview формирует алиасы таблиц, буквально соответствующие оценочной категории, т.е. таблица получает название voting_api_cache_Качество обслуживания_value (или что-то в этом роде), т.е. прямо с пробелом! Конечно же, MySQL кричала и материлась на такого рода конструкции!

Чтобы разобраться в ситуации полез в код views_query.inc и обнаружил, что при формировании запроса в базу имена и алиасы таблиц никак не экранируются. Я подправил формирование запроса, добавив туда символ '`' в некоторые строки:

<?php

// $Id: views_query.inc,v 1.51.2.11 2007/04/12 15:18:59 merlinofchaos Exp $

327: $table = '`'.$this->use_alias_prefix . $table ."`.";
331: $a = " AS `$this->use_alias_prefix$alias`";
602: $joins .= " $join_type JOIN {" . $table_real . "} `$table_alias` ON `" . $left_table_alias ."`.".
603: $joininfo['left']['field'] . " = `$table_alias`." . $joininfo['right']['field'];
607: $joins .= " AND `$table_alias`.$field";
?>

Этого оказалось достаточно для исправления ситуации, хотя там есть еще места, которые можно было бы экранировать, но перебарщивать пока не стал.

Надеюсь, это кому-нибудь поможет!

Комментарии

Аватар пользователя Andigo Andigo 13 сентября 2007 в 23:52

Хм. Очень даже помогло. Последний час пытался выяснить почему у меня виды не формируются с данными от этого модуля. Полез искать, а тут уже решение как по заказу:0)
Если с английским хорошо, напиши в багтрекер разработчиков модуля, пускай исправляют.

Аватар пользователя dimanjy dimanjy 14 сентября 2007 в 1:48

Я уже написал, только, наверное, не туда Smile

Нашел еще один баг там же. Он относится уже даже не к модулям, а, как я понимаю, вообще к ядру! При попытке сортировки таблицы по такому полю вновь выскакивает ошибка. На этот раз, докопался до /includes/tablesort.inc. Как раз отвечает за получение параметров сортировки. Функцию tablesort_sql подправил следующим образом:

<?php
function tablesort_sql($header, $before = '') {
$ts = tablesort_init($header);
if ($ts['sql']) {
$sql = db_escape_string($ts['sql']);
$sort = drupal_strtoupper(db_escape_string($ts['sort']));
return " ORDER BY $before `$sql` $sort";
}
}
?>

Т.е. заэкранировал переменную $sql.

Аватар пользователя Andigo Andigo 14 сентября 2007 в 4:42

Вот если бы категориям для оценки можно было еще веса проставлять, а потом автоматом взвешенную оценку выводить - этому модулю цены бы не было. Пытался найти что-то подобное на drupal.org но там многокритериальная оценка материалов похоже не в почете:0)
А этот модуль в ближайшее время по-любому доработают, он пока еще dev.