Задумал сделать на сайте возможность писать отзывы к узлам. Воспользовался модулем 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";
?>
Этого оказалось достаточно для исправления ситуации, хотя там есть еще места, которые можно было бы экранировать, но перебарщивать пока не стал.
Надеюсь, это кому-нибудь поможет!
Комментарии
Хм. Очень даже помогло. Последний час пытался выяснить почему у меня виды не формируются с данными от этого модуля. Полез искать, а тут уже решение как по заказу:0)
Если с английским хорошо, напиши в багтрекер разработчиков модуля, пускай исправляют.
Я уже написал, только, наверное, не туда
Нашел еще один баг там же. Он относится уже даже не к модулям, а, как я понимаю, вообще к ядру! При попытке сортировки таблицы по такому полю вновь выскакивает ошибка. На этот раз, докопался до /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.
Вот если бы категориям для оценки можно было еще веса проставлять, а потом автоматом взвешенную оценку выводить - этому модулю цены бы не было. Пытался найти что-то подобное на drupal.org но там многокритериальная оценка материалов похоже не в почете:0)
А этот модуль в ближайшее время по-любому доработают, он пока еще dev.