Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Добрый день! Имеем: 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 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.