Перейти к содержанию
grechanyuk

Комментирование отзывов. Дублирование записей

Рекомендуемые сообщения

Добрый день! Имеем: OpenCart 2.3 и большое желание прикрутить комментирование отзывов. Вариант с SEO CMS не предлагать, не нравится он мне.

Столкнулся с проблемой дублирования записей, в случае, когда у отзыва более 1 комментария. Т.е. если у одного отзыва два коммента, то выводится этот отзыв два раза (по одному на каждый коммент). На общее оформление не обращайте внимание, как будет функционал работать, все приведу в порядок :) Заранее благодарю всех, кто откликнется

1. Создана таблица с названием *_comments. В ней имеем столбцы:

2. Изменения, внесенные в product.php (контроллер):

public function review() {
		$this->load->language('product/product');
		$this->load->model('catalog/review');
		$data['text_no_reviews'] = $this->language->get('text_no_reviews');
		if (isset($this->request->get['page'])) {
			$page = $this->request->get['page'];
		} else {
			$page = 1;
		}
		$data['reviews'] = array();
		$this->load->model('catalog/vdi_review');		
		$review_total = $this->model_catalog_review->getTotalReviewsByProductId($this->request->get['product_id']);
		$results = $this->model_catalog_review->getReviewsByProductId($this->request->get['product_id'], ($page - 1) * 5, 5);

//СМОТРИ ЗДЕСЬ
		foreach ($results as $result) {
			$data['reviews'][] = array(
				'author'     => $result['author'],
				'text'       => nl2br($result['text']),
				'rating'     => (int)$result['rating'],
				'review_id'  => (int)$result['review_id'],
				'cauthor'	 => $result['cauthor'],
				'comments'	 => $result['comments'],
				'name'		 => $result['name'],
				'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
				'customer_id'=> $result['customer_id'],
				'pointsreview'	 => $this->model_catalog_review->getTotalCustomerPointsReview($result['customer_id']),
				'pointsorder'	 => $this->model_catalog_review->getTotalCustomerPointsOrder($result['customer_id']),
				'product_id'		 => $this->url->link('product/product', 'product_id=' . $result['product_id'])
			);
		}
//		

		$pagination = new Pagination();
		$pagination->total = $review_total;
		$pagination->page = $page;
		$pagination->limit = 5;
		$pagination->url = $this->url->link('product/product/review', 'product_id=' . $this->request->get['product_id'] . '&page={page}');
		$data['pagination'] = $pagination->render();
		$data['results'] = sprintf($this->language->get('text_pagination'), ($review_total) ? (($page - 1) * 5) + 1 : 0, ((($page - 1) * 5) > ($review_total - 5)) ? $review_total : ((($page - 1) * 5) + 5), $review_total, ceil($review_total / 5));
		$this->response->setOutput($this->load->view('product/review', $data));
	}

3. Добавлены строки в модель review.php:

	public function addComment ($review_id, $customer_name, $data) {
		$this->db->query("INSERT INTO " . DB_PREFIX . "comments SET author = '" . $customer_name . "', customer_id = '" . (int)$this->customer->getId() . "', review_id = '" . (int)$review_id . "', comments = '" . $this->db->escape($data['comment']) . "', date_added = NOW()");
	}

4. Изменения в этой же модели:

public function getReviewsByProductId($product_id, $start = 0, $limit = 20) {
		if ($start < 0) {
			$start = 0;
		}

		if ($limit < 1) {
			$limit = 20;
		}
//СМОТРИ ЗДЕСЬ
		$query = $this->db->query("SELECT r.customer_id, r.review_id, c.author as cauthor, c.comments, 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) LEFT JOIN " . DB_PREFIX . "comments c ON (r.review_id = c.review_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);
//
		return $query->rows;
	}

5. Изменения в review.tpl

//ДОБАВЛЕНИЕ КОММЕНТА 

<a style="text-align:right" data-toggle="collapse" data-parent="#accordion" href="#<?php echo $review['review_id']; ?>"><i class="fa fa-pencil"></i>  Ответить</a>
 <div id="<?php echo $review['review_id']; ?>" class="panel-collapse collapse">
	<div class="well comment-helper-<?php echo $review['review_id']; ?>">
		<form class="form-horizontal" id="comment-form-<?php echo $review['review_id']; ?>">
			<div class="form-group required">
				<label class="col-sm-2 control-label" for="input-comment">Комментарий</label>
					<div class="col-sm-10">
						<textarea name="comment" rows="2" id="input-comment" class="form-control"></textarea>
					</div>
			</div>
					<div class="form-group" style="margin-bottom: 0;">
						<div class="col-sm-10 col-sm-offset-2">
							<button type="button" id="button-comment-<?php echo $review['review_id']; ?>" data-loading-text="Отправляем..." class="btn btn-primary">Отправить</button>
						</div>
				</div>		
		</form>
	</div>
</div>								
			</td>
  </tr>
//
//ОТОБРАЖЕНИЕ КОММЕНТОВ
  <tr>
  <td colspan="2">
									<div>Имя: <?php echo $review['cauthor']; ?><br> Комментарий: <?php echo $review['comments']; ?></div>
	</td>
	</tr>
//
</table>
</div>
<?php } ?>
<div class="text-right"><?php echo $pagination; ?></div>
<?php } else { ?>
<p><?php echo $text_no_reviews; ?></p>
<?php } ?>
//СКРИПТ ДЛЯ ОТПРАВКИ КОММЕНТА НА СЕРВ
<script>
$('#button-comment-<?php echo $review['review_id']; ?>').on('click', function() {
	$.ajax({
		url: 'index.php?route=product/product/writeComment&review_id=<?php echo $review['review_id']; ?>',
		type: 'post',
		dataType: 'json',
		data: $('#comment-form-<?php echo $review['review_id']; ?>').serialize(),
		beforeSend: function() {
			$('#button-comment-<?php echo $review['review_id']; ?>').button('loading');
		},
		complete: function() {
			$('#button-comment-<?php echo $review['review_id']; ?>').button('reset');
			$('#captcha').attr('src', 'index.php?route=tool/captcha#'+new Date().getTime());
			$('input[name=\'captcha\']').val('');
		},
		success: function(json) {
			$('.alert-success, .alert-danger').remove();
			
			if (json['error']) {
				$('.comment-helper-<?php echo $review['review_id']; ?>').before('<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button></div>');
			}
			
			if (json['success']) {
				$('.comment-helper-<?php echo $review['review_id']; ?>').before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + '</div>').remove();
				
				$('textarea[name=\'comment\']').val('');
				$('input[name=\'captcha\']').val('');
			}
		}
	});
});</script>
//

 

Изменено пользователем grechanyuk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.