Дополнительное поле для отзывов к товару в OpenCart
По стандарту, в CMS OpenCart для добавления отзыва к каждому товару существуют такие поля для заполнения (если вы гость), как имя, оценка и сам отзыв. Мне же потребовалось немного расширить функционал и внедрить еще одно дополнительное поле для моих данных. Готовой инструкции в Интернете я не нашел, поэтому предлагаю вам свой вариант. Он относительно сложный и тестировался на OpenCart версии 2.3.0.2.
Создание пользовательского поля для отзывов в OpenCart
Для создания поля и функции его сохранения нужно проделать несколько шагов. Будьте внимательны, и все у вас получится. Вся статья будет описывать добавление поля «Фамилия». Во всех случаях для создания нового поля, отличного от моего, last_name вы заменяете на свое значение. default в адресах файлов – это папка темы по умолчанию, в вашем же случае вы ищете файлы в папках рабочей темы сайта.
Поехали!
1. Подключитесь к вашему сайту по FTP.
2. Откройте файл product.tpl в папке /catalog/view/theme/default/template/product. Здесь вы находите форму для добавления комментариев. В стандартной теме форма начинается с кода:
<form class="form-horizontal" id="form-review">
Внутри этой формы вы помещаете свое поле для заполнения:
<div class="form-group required">
<div class="col-sm-12">
<label class="control-label" for="input-last_name"><?php echo $entry_last_name; ?></label>
<input type="text" name="last_name" value="" id="input-last_name" class="form-control" />
</div>
</div>
Здесь же, ниже, найдите строку:
$('textarea[name=\'text\']').val('');
И сразу после нее вставьте:
$('input[name=\'last_name\']').val('');
Сохраняете все изменения и файл отправляете на сайт.
3. Далее открываете файл review.php в папке /admin/language/ru-ru/catalog/. В нем вы находите блоки Entry и Error, в каждый из которых вставляете:
$_["entry_last_name"] = "Фамилия";
и
$_["error_last_name"] = "Фамилия обязательна к заполнению!";
соответственно.
Этот файл также сохраняете и отправляете обратно на сайт.
4. Следующим шагом вы открываете файл review.php в папке /admin/controller/catalog/. В нем вы два раза находите строку:
$data['entry_author'] = $this->language->get('entry_author');
и делаете сразу после нее две вставки:
$data["entry_last_name"] = $this->language->get("entry_last_name");
по одному, после каждой найденной строки. В этом же файле вы находите блок:
if (isset($this->error['text'])) {
$data['error_text'] = $this->error['text'];
} else {
$data['error_text'] = '';
}
и сразу после него вставляете:
if(isset($this->error["last_name"])) {
$data["error_last_name"] = $this->error["last_name"];
} else {
$data["error_last_name"] = "";
}
Здесь же находите блок:
if (isset($this->request->post['text'])) {
$data['text'] = $this->request->post['text'];
} elseif (!empty($review_info)) {
$data['text'] = $review_info['text'];
} else {
$data['text'] = '';
}
и сразу после вставляете:
if(isset($this->request->post["last_name"])) {
$data["last_name"] = $this->request->post["last_name"];
} elseif(!empty($review_info)) {
$data["last_name"] = $review_info["last_name"];
} else {
$data["last_name"] = "";
}
Следующую правку вы делаете по желанию, так как она позволяет сделать поле обязательным для заполнения. Делается она все в том же файле review.php. Ищете строки, похожие на:
if (utf8_strlen($this->request->post['text']) < 1) {
$this->error['text'] = $this->language->get('error_text');
}
и сразу после них вы вставляете:
if(utf8_strlen($this->request->post["last_name"]) < 1) {
$this->error["last_name"] = $this->language->get("last_name");
}
Логика проверки поля тут такая – если в поле меньше 1 символа (то есть 0), то поле пустое и его нужно заполнить. Для поля типа E-mail лучше всего в качестве проверки вставить условие из этой статьи.
С этим файлом работать мы заканчиваем, сохраняем его и отправляем обратно на сайт.
5. Открываем файл review.php в папке /admin/model/catalog/. Здесь вы находите строки, которые содержат часть:
text = '" . $this->db->escape(strip_tags($data['text'])) . "',
и сразу после них вставляете:
last_name = '".$this->db->escape(strip_tags($data['last_name']))."',
Обратите внимание! У вас должно быть найдено два совпадения при поиске указанной части.
По этому файлу все. Сохраняете и отправляете на сайт.
6. Далее открываете файл review_form.tpl в папке /admin/view/template/catalog/. В нем вы ищете код, похожий на этот:
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-product"><span data-toggle="tooltip" title="<?php echo $help_product; ?>"><?php echo $entry_product; ?></span></label>
<div class="col-sm-10">
<input type="text" name="product" value="<?php echo $product; ?>" placeholder="<?php echo $entry_product; ?>" id="input-product" class="form-control" />
<input type="hidden" name="product_id" value="<?php echo $product_id; ?>" />
<?php if ($error_product) { ?>
<div class="text-danger"><?php echo $error_product; ?></div>
<?php } ?>
</div>
</div>
И сразу после него вставляете:
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-last_name"><?php echo $entry_last_name; ?></label>
<div class="col-sm-10">
<input type="text" name="last_name" value="<?php echo $last_name; ?>" placeholder="<?php echo $entry_last_name; ?>" id="input-last_name" class="form-control" />
<?php if($error_last_name) { ?>
<div class="text-danger"><?php echo $error_last_name; ?></div>
<?php } ?>
</div>
</div>
С этим файлом также все. Отправляете файл обратно на сайт.
7. Открываете файл product.php в папке /catalog/controller/product/. В нем ищете строку:
'text' => nl2br($result['text']),
и сразу после нее вставляете:
"last_name" => nl2br($result["last_name"]),
Здесь же найдите строки:
if ((utf8_strlen($this->request->post['name']) < 3) || (utf8_strlen($this->request->post['name']) > 25)) {
$json['error'] = $this->language->get('error_name');
}
и сразу после них вставьте:
if((utf8_strlen($this->request->post["last_name"]) < 1)) {
$json["error"] = $this->language->get("error_last_name");
}
Обратите внимание, что эта правка нужна только в том случае, если создаваемое вами поле будет являться обязательным для заполнения. Логика проверки поля на заполненность как в 4-м шаге.
Файл сохраняете и отправляете обратно на сайт.
8. После чего открываете файл review.php в папке /catalog/model/catalog/. В нем вы находите одно совпадение по коду:
text = '" . $this->db->escape($data['text']) . "',
и сразу после него вставляете:
last_name = '".$this->db->escape($data['last_name'])."',
Здесь же, почти в самом конце, вы находите строку:
$query = $this->db->query("SELECT r.review_id, r.author, r.rating, r.text, p.product_id, pd.name, p.price, p.image, r.date_added FROM " . DB_PREFIX . "review r LEFT JOIN " . DB_PREFIX . "product p ON (r.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id = '" . (int)$product_id . "' AND p.date_available <= NOW() AND p.status = '1' AND r.status = '1' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY r.date_added DESC LIMIT " . (int)$start . "," . (int)$limit);
и меняете ее на:
$query = $this->db->query("SELECT r.review_id, r.author, r.rating, r.text, r.last_name, p.product_id, pd.name, p.price, p.image, r.date_added FROM ".DB_PREFIX."review r LEFT JOIN ".DB_PREFIX."product p ON (r.product_id = p.product_id) LEFT JOIN ".DB_PREFIX."product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id = '".(int)$product_id."' AND p.date_available <= NOW() AND p.status = '1' AND r.status = '1' AND pd.language_id = '".(int)$this->config->get('config_language_id')."' ORDER BY r.date_added DESC LIMIT ".(int)$start.",".(int)$limit);
По этому файлу все. Сохраняете и отправляете обратно на сайт.
9. Далее открываете файл product.php в папке /catalog/language/ru-ru/product/. Здесь вы увидите блоки Entry и Error, в каждый из которых вы вставляете:
$_["entry_last_name"] = "Ваша фамилия:";
и
$_["error_last_name"] = "Фамилия обязательна к заполнению!";
соответственно. Сохраняете изменения и здесь, отправляете файл обратно на сайт и переходите к завершающему шагу.
10. Вам нужно подключиться к вашей базе данных через phpMyAdmin. В ней (базе) вы находите таблицу «oc_review»:
и после перехода в нее вы нажимаете на вкладку «Структура»:
Внизу вы выбираете «Добавить 1 поле после text» и жмете «Вперед».
На открывшейся странице с формой вы вводите данные по аналогии со скриншотом:
и жмете «Сохранить».
На этом, собственно, и все. Если вы посмотрите товары на своем сайте, то в форме добавления отзыва появится поле, которое вы можете заполнить и отправить. В админке оно также появится.
Вывод пользовательского поля в отзывах в OpenCart
Вывод ваших полей, в отличие от их создания, куда проще и состоит всего из одного шага.
В вашем FTP откройте файл review.tpl в папке /catalog/view/theme/default/template/product/и в нужное место вставьте:
<?php
echo $review["last_name"];
?>
Сохраните изменения и отправьте файл обратно на сайт. После публикации новых отзывов и заполнения созданных полей – они появятся на вашем сайте. Старые же отзывы будут без этих полей, так как информация о них в базе данных будет отсутствовать.