Делаю сайт на Drupal 7. В процессе создания сайта возникла такая задача: нужно, чтобы пользователи могли оставлять отзывы о товарах, представленных на сайте.
Комментарии выглядят наиболее подходящим кандидатом для использования в качестве отзывов: они отличаются от отзывов только названием, все остальное поведение совпадает практически один в один. А если где и не совпадает, то это можно исправить изменением настроек.
Итак, будем переименовывать комментарии в отзывы. Самый простой путь — заменить в переводах разные формы слова «коментарий» на аналогичные формы слова «отзыв». Но к сожалению на сайте кроме товаров есть так же другие типы материалов, например статьи, к котором пользователи уже могут оставлять именно комментарии, а не отзывы. То есть для одного типа материала эта сущность должна называться «Отзывы», а для остальных «Комментарии». Поэтому придется прибегнуть к более сложному способу.
Я буду показывать превращение комментариев в отзывы на примере Drupal 7, но этот способ должен подойти и для шестерки.
Для того, чтобы изменять комментарии описываемым здесь способом, нужно модифицировать тему оформления. То есть тема вами уже должна быть выбрана и установлена. Если вы используете стороннюю тему (а не собственного изготовления), то изменения лучше всего вносить не в саму тему, а создать ее подтему. В этом случае, если авторы темы выпустят обновление вам проще будет объединить изменения от авторов с вашими.
Дальше по тексту предполагается, что машинное имя типа материала товара — «product». Если у вас этот материал называется по другому, то в примерах кода замените название «product» на ваше.
Открываем страницу с описанием товара и смотрим:

Видим надпись «Комментарии» крупным шрифтом обозначающую собственно начало радела с комментариями на странице. Заголовок комментариев на странице формируется в файле темы comment-wrapper.tpl.php. Чтобы заменить его, в нашей теме создаем папку templates, и из папки templates родительской темы копируем файл comment-wrapper.tpl.php в нашу. (Если у вашей темы нет родительской темы или уже есть файл comment-wrapper.tpl.php, тогда его копировать не нужно.) Открываем файл в текстовом редакторе. Находим в нем строки содержащие код вида
Очищаем кэш, перезагружаем страницу и видим, что над отзывами у нас теперь висит заголовок «Отзывы»:

Ссылки на действия с отзывами внутри страницы («Добавить комментарий», «N комментариев», «отправлять комментарии») по прежнему ссылаются на комментарии. Ссылки формируются в файле темы node.tpl.php. Этот файл применяется по умолчанию ко всем типам материалов. Для отдельного типа материала, можно сделать свой экземпляр файла node.tpl.php: для этого его нужно скопировать и переименовать таким образом: node--contentname.tpl.php, где вместо contentname стоит машинное имя материала. Для этого типа материала теперь будет применяться этот файл.
Копируем node.tpl.php в свою подтему, переименовываем его в node--product.tpl.php и открываем в текстовом редакторе. Где нибудь ближе к началу вставляем такой кусок кода:
Это функция заменяющая комментарии на отзывы.
Затем ищем в коде место, где формируются ссылки, оно должно выглядеть так:

В ссылках видим отзывы. Наши изменения повлияли так же и на краткий вид материала. Достаточно посмотреть на главную страницу:

В конце отзывов, как и в конце материала, так же есть ссылки на изменение/добавление/удаление. Они по прежнему содержат слово «комментарии». С ними можно бороться примерно так же как и в материале. За оформление отдельных комментариев отвечает файл comment.tpl.php. Скопируйте этот файл из родительской темы в свою тему и откройте в текстовом редакторе. К сожалению нельзя сделать версию этого файла специально для заданного типа материала. Поэтому будем вставлять проверки типа материала непосредственно в коде.
Где-то в начале файла вставляем определение функции ReplaceCommentToReview:
Затем ищем код вида:
Очищаем кэш, перезагружаем страницу, смотрим результат:

Если войти на сайт под своей учетной записью и открыть страницу товара, то можно обнаружить интересный факт:

На отзыв можно написать ответ! И этот ответ тоже будет отзывом, что выглядит не логично и странно. Исправить это можно удалив ссылку «Ответить». Для этого снова открываем файл comment.tpl.php и в том месте где мы меняли код на предыдущем шаге:
Вставляем строчку:
Перезагружаем страницу (кэш можно не очищать), смотрим:

Ссылка «Ответить» исчезла.
Находясь под своей учетной записью переходим по ссылке «Добавить отзыв» (на этом сайте форма добавления отзыва находится на отдельной странице, а не в конце отзывов). И что мы видим:

В заголовке формы присутствует слово «комментарий». Более того, название формы так же есть в цепочке ссылок наверху страницы и в заголовке окна браузера. Изменение вида форм осуществляется с помощью так называемых хуков. Хук — это функция с заданным именем и набором параметров в которой проводиться дополнительная обработка данных. На разных этапах формирования страницы Drupal проверяет, определена ли для этого этапа функция-хук и если определена, то вызывает ее. Определяя хуки, можно влиять почти произвольным образом на почти любой аспект формирования страницы.
За дополнительную обработку форм в темах оформления отвечают функции-хуки вида:
THEMENAME_form_FORMID_alter(&$form, &$form_state)
где THEMENAME — имя темы, FORMID — машинное имя формы. Имя формы можно определить следующим образом: откройте код исходный код страницы и найдите там теги input типа «hidden» с именем «form_id». Значение поля value и будет имя формы. В нашем случае удалось найти такой тег:
В итоге получаем такое имя функции-хука:
В хуке нам нужно поменять название формы. Для этого в Друпале есть специальная функция: drupal_set_title.
Итак, создаем в корневой папке нашей темы новый файл template.php, если он еще не создан. Открываем его в текстовом редакторе. Добавляем открывающий тег <?php, если файл создан только что. Добавляем определение функции:
Очищаем кэш, перезагружаем страницу и смотрим:

Гототово. Теперь посетители могут оставлять отзывы о товарах.
Комментарии выглядят наиболее подходящим кандидатом для использования в качестве отзывов: они отличаются от отзывов только названием, все остальное поведение совпадает практически один в один. А если где и не совпадает, то это можно исправить изменением настроек.
Итак, будем переименовывать комментарии в отзывы. Самый простой путь — заменить в переводах разные формы слова «коментарий» на аналогичные формы слова «отзыв». Но к сожалению на сайте кроме товаров есть так же другие типы материалов, например статьи, к котором пользователи уже могут оставлять именно комментарии, а не отзывы. То есть для одного типа материала эта сущность должна называться «Отзывы», а для остальных «Комментарии». Поэтому придется прибегнуть к более сложному способу.
Я буду показывать превращение комментариев в отзывы на примере Drupal 7, но этот способ должен подойти и для шестерки.
Для того, чтобы изменять комментарии описываемым здесь способом, нужно модифицировать тему оформления. То есть тема вами уже должна быть выбрана и установлена. Если вы используете стороннюю тему (а не собственного изготовления), то изменения лучше всего вносить не в саму тему, а создать ее подтему. В этом случае, если авторы темы выпустят обновление вам проще будет объединить изменения от авторов с вашими.
Дальше по тексту предполагается, что машинное имя типа материала товара — «product». Если у вас этот материал называется по другому, то в примерах кода замените название «product» на ваше.
Шаг 1: Обертка вокруг комментариев.
Открываем страницу с описанием товара и смотрим:

Видим надпись «Комментарии» крупным шрифтом обозначающую собственно начало радела с комментариями на странице. Заголовок комментариев на странице формируется в файле темы comment-wrapper.tpl.php. Чтобы заменить его, в нашей теме создаем папку templates, и из папки templates родительской темы копируем файл comment-wrapper.tpl.php в нашу. (Если у вашей темы нет родительской темы или уже есть файл comment-wrapper.tpl.php, тогда его копировать не нужно.) Открываем файл в текстовом редакторе. Находим в нем строки содержащие код вида
print t('Comments'); или print t('Add new comment'); в общем всевозможные строковые литералы со словом comment внутри функции t и print. Заменяем найденные куски на код вида:if ($node->type == 'product')
print 'Добавить отзыв';
else
print t('Add new comment');Очищаем кэш, перезагружаем страницу и видим, что над отзывами у нас теперь висит заголовок «Отзывы»:

Шаг 2: Ссылки в материале
Ссылки на действия с отзывами внутри страницы («Добавить комментарий», «N комментариев», «отправлять комментарии») по прежнему ссылаются на комментарии. Ссылки формируются в файле темы node.tpl.php. Этот файл применяется по умолчанию ко всем типам материалов. Для отдельного типа материала, можно сделать свой экземпляр файла node.tpl.php: для этого его нужно скопировать и переименовать таким образом: node--contentname.tpl.php, где вместо contentname стоит машинное имя материала. Для этого типа материала теперь будет применяться этот файл.
Копируем node.tpl.php в свою подтему, переименовываем его в node--product.tpl.php и открываем в текстовом редакторе. Где нибудь ближе к началу вставляем такой кусок кода:
<?php
if(!function_exists('ReplaceCommentToReview'))
{
function ReplaceCommentToReview($string)
{
$comments = array("комментарий", "комментария", "комментариев", "комментарии",
"Комментарий", "Комментария", "Комментариев", "Комментарии");
$reviews = array("отзыв", "отзыва", "отзывов", "отзывы",
"Отзыв", "Отзыва", "Отзывов", "Отзывы");
return str_replace($comments, $reviews, $string);
}
}
?>Это функция заменяющая комментарии на отзывы.
Затем ищем в коде место, где формируются ссылки, оно должно выглядеть так:
print render($content['links']);и заменяем этот кусок на такой:print ReplaceCommentToReview(render($content['links']));Сохраняем файл, очищаем кэш, перезагружаем страницу:
В ссылках видим отзывы. Наши изменения повлияли так же и на краткий вид материала. Достаточно посмотреть на главную страницу:

Шаг 3: Ссылки в комментариях
В конце отзывов, как и в конце материала, так же есть ссылки на изменение/добавление/удаление. Они по прежнему содержат слово «комментарии». С ними можно бороться примерно так же как и в материале. За оформление отдельных комментариев отвечает файл comment.tpl.php. Скопируйте этот файл из родительской темы в свою тему и откройте в текстовом редакторе. К сожалению нельзя сделать версию этого файла специально для заданного типа материала. Поэтому будем вставлять проверки типа материала непосредственно в коде.
Где-то в начале файла вставляем определение функции ReplaceCommentToReview:
<?php
if(!function_exists('ReplaceCommentToReview'))
{
function ReplaceCommentToReview($string)
{
$comments = array("комментарий", "комментария", "комментариев", "комментарии",
"Комментарий", "Комментария", "Комментариев", "Комментарии");
$reviews = array("отзыв", "отзыва", "отзывов", "отзывы",
"Отзыв", "Отзыва", "Отзывов", "Отзывы");
return str_replace($comments, $reviews, $string);
}
}
?>Затем ищем код вида:
print render($content['links']);и заменяем его кодом:if ($node->type == 'product')
print ReplaceCommentToReview(render($content['links']));
else
print render($content['links']);Очищаем кэш, перезагружаем страницу, смотрим результат:

Шаг 4: Ответы на отзывы
Если войти на сайт под своей учетной записью и открыть страницу товара, то можно обнаружить интересный факт:

На отзыв можно написать ответ! И этот ответ тоже будет отзывом, что выглядит не логично и странно. Исправить это можно удалив ссылку «Ответить». Для этого снова открываем файл comment.tpl.php и в том месте где мы меняли код на предыдущем шаге:
if ($node->type == 'product')
print ReplaceCommentToReview(render($content['links']));
else
print render($content['links']);Вставляем строчку:
if ($node->type == 'product')
{
unset($content['links']['comment']['#links']['comment-reply']);
print ReplaceCommentToReview(render($content['links']));
}
else
print render($content['links']);Перезагружаем страницу (кэш можно не очищать), смотрим:

Ссылка «Ответить» исчезла.
Шаг 5: Заголовок формы добавления отзыва
Находясь под своей учетной записью переходим по ссылке «Добавить отзыв» (на этом сайте форма добавления отзыва находится на отдельной странице, а не в конце отзывов). И что мы видим:

В заголовке формы присутствует слово «комментарий». Более того, название формы так же есть в цепочке ссылок наверху страницы и в заголовке окна браузера. Изменение вида форм осуществляется с помощью так называемых хуков. Хук — это функция с заданным именем и набором параметров в которой проводиться дополнительная обработка данных. На разных этапах формирования страницы Drupal проверяет, определена ли для этого этапа функция-хук и если определена, то вызывает ее. Определяя хуки, можно влиять почти произвольным образом на почти любой аспект формирования страницы.
За дополнительную обработку форм в темах оформления отвечают функции-хуки вида:
THEMENAME_form_FORMID_alter(&$form, &$form_state)
где THEMENAME — имя темы, FORMID — машинное имя формы. Имя формы можно определить следующим образом: откройте код исходный код страницы и найдите там теги input типа «hidden» с именем «form_id». Значение поля value и будет имя формы. В нашем случае удалось найти такой тег:
<input type="hidden" name="form_id" value="comment_node_product_form" />(На самом деле есть еще такой тег, подходящий под наши критерии: <input type="hidden" name="form_id" value="search_block_form" />Но это очевидно не то что нам нужно.)В итоге получаем такое имя функции-хука:
comments_theme_comment_node_product_form_form_alterХуки для темы задаются в файле template.php, причем этот файл должен находиться в корневой папке темы, а не в подпапке templates. Кроме того, этот файл не нужно копировать из родительской темы: нужно создавать свой. Функции определенные в этом файле будут добавлены в функциям определенным в родительской теме. Еще один нюанс этого файла: в нем должен быть открывающий тег <?php, но не должно быть закрывающего.В хуке нам нужно поменять название формы. Для этого в Друпале есть специальная функция: drupal_set_title.
Итак, создаем в корневой папке нашей темы новый файл template.php, если он еще не создан. Открываем его в текстовом редакторе. Добавляем открывающий тег <?php, если файл создан только что. Добавляем определение функции:
function comments_theme_form_comment_node_product_form_alter(&$form, &$form_state) {
drupal_set_title("Добавить отзыв");
}Очищаем кэш, перезагружаем страницу и смотрим:

Гототово. Теперь посетители могут оставлять отзывы о товарах.