Артём Мáлков

Дополнительное поле для отзывов к товару в OpenCart

13 окт1 комм

По стандарту, в 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»:

Дополнительное поле для отзывов к товару в OpenCart

и после перехода в нее вы нажимаете на вкладку «Структура»:

Дополнительное поле для отзывов к товару в OpenCart

Внизу вы выбираете «Добавить 1 поле после text» и жмете «Вперед».

На открывшейся странице с формой вы вводите данные по аналогии со скриншотом:

Дополнительное поле для отзывов к товару в OpenCart

и жмете «Сохранить».

На этом, собственно, и все. Если вы посмотрите товары на своем сайте, то в форме добавления отзыва появится поле, которое вы можете заполнить и отправить. В админке оно также появится.

Вывод пользовательского поля в отзывах в OpenCart

Вывод ваших полей, в отличие от их создания, куда проще и состоит всего из одного шага.

В вашем FTP откройте файл review.tpl в папке /catalog/view/theme/default/template/product/и в нужное место вставьте:

<?php

	echo $review["last_name"];
	
?>

Сохраните изменения и отправьте файл обратно на сайт. После публикации новых отзывов и заполнения созданных полей – они появятся на вашем сайте. Старые же отзывы будут без этих полей, так как информация о них в базе данных будет отсутствовать.

Рекомендуем к просмотру
Добавляем пользовательское поле в настройки WooCommerce
Хаки
Подгрузка отзывов о товаре вместо стандартной пагинации в OpenCart 2.3.*
Модули и скрипты
10-балльная оценка в отзыве о товаре в OpenCart
Хаки
1
комментарий
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    1
      •  Пользователь
    15 окт в 15:29

    Очень помогла Ваша статья, добавил себе в отзывы 3 дополнительных поля. Спасибо, все работает!

    А не подскажете, как сделать такое поле выпадающим? Чтобы пользователь мог выбрать один из трех вариантов. Заранее спасибо!

Подняться наверх
«Pandoge» - помощник вебмастера