Перейти к содержанию
Официальный форум поддержки Simpla

Просьба помочь с модулем отзывы


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

ДД! Пытаюсь сделать "модуль" отзывы на отдельной странице. Делаю под версию 2.1.5

 

Прошу помощи в реализации! Пока, сделано так указано ниже и вроде все работает, отзывы добавляются.

 

Но считаю это сделано "топорно" и не красиво. Просьба указать на явные косяки, а лучше допилить по нормальному и доделать все по "полочкам", если кто изъявит желанием

 

Sql:

CREATE TABLE IF NOT EXISTS `s_reviews` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ip` varchar(20) NOT NULL,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=72 ;

--
-- Дамп данных таблицы `s_reviews`
--

INSERT INTO `s_reviews` (`id`, `date`, `ip`, `name`, `email`, `text`) VALUES
(70, '2014-02-25 16:43:37', '192.168.0.114', 'Иван', 'admin@yandex.ru', 'Админ яндекс'),
(71, '2014-02-25 16:43:56', '192.168.0.114', 'Гугл', 'admin@google.ru', 'Админ гугл');

Далее, добавляю строчку в .htaccess

# review
RewriteRule ^review/?$	index.php?module=ReviewView  [L,QSA]

Далее создаем, в api/Reviews.php

<?php

require_once('Simpla.php');

class Reviews extends Simpla
{

	// Возвращает отзыв по id
	public function get_review($id)
	{
		$query = $this->db->placehold("SELECT c.id, c.name, c.email, c.ip, c.text, c.date FROM __reviews c WHERE id=? LIMIT 1", intval($id));

		if($this->db->query($query))
			return $this->db->result();
		else
			return false; 
	}
	
	// Возвращает отзыв, удовлетворяющие фильтру
	public function get_reviews($filter = array())
	{	
		// По умолчанию
		$limit = 0;
		$page = 1;
		$type_filter = '';
		$keyword_filter = '';

		if(isset($filter['limit']))
			$limit = max(1, intval($filter['limit']));

		if(isset($filter['page']))
			$page = max(1, intval($filter['page']));

		if(isset($filter['ip']))
			$ip = $this->db->placehold("OR c.ip=?", $filter['ip']);
			
		if($limit)
			$sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
		else
			$sql_limit = '';

		if(!empty($filter['keyword']))
		{
			$keywords = explode(' ', $filter['keyword']);
			foreach($keywords as $keyword)
		$keyword_filter .= $this->db->placehold('AND c.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.text LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.email LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" '); 
		}

			
		$sort='DESC';
		
		$query = $this->db->placehold("SELECT c.id, c.ip, c.name, c.email, c.date, c.text
										FROM __reviews c WHERE 1 $keyword_filter ORDER BY id $sort $sql_limit");
	
		$this->db->query($query);
		return $this->db->results();
	}
	
	// Количество отзывов, удовлетворяющих фильтру
	public function count_reviews($filter = array())
	{	
		$keyword_filter = '';

		if(!empty($filter['keyword']))
		{
			$keywords = explode(' ', $filter['keyword']);
			foreach($keywords as $keyword)
		$keyword_filter .= $this->db->placehold('AND c.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.text LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.email LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" '); 
		}

		$query = $this->db->placehold("SELECT count(distinct c.id) as count
										FROM __reviews c WHERE 1 $keyword_filter", $this->settings->date_format);
	
		$this->db->query($query);	
		return $this->db->result('count');

	}
	
	// Добавление отзыва
	public function add_review($review)
	{	
		$query = $this->db->placehold('INSERT INTO __reviews
		SET ?%,
		date = NOW()',
		$review);

		if(!$this->db->query($query))
			return false;

		$id = $this->db->insert_id();
		return $id;
	}
	

	// Удаление отзыва
	public function delete_review($id)
	{
		if(!empty($id))
		{
			$query = $this->db->placehold("DELETE FROM __reviews WHERE id=? LIMIT 1", intval($id));
			$this->db->query($query);
		}
	}	
}

Далее, в api/Simpla.php добавить:

'reviews'  	 => 'Reviews'

Далее создаем, в view/ReviewView.php

<?PHP

require_once('View.php');

class ReviewView extends View
{
	function fetch()
	{		
		// Принимаем отзыв
		if ($this->request->method('post') && $this->request->post('review'))
		{
			$review->name = $this->request->post('name');
			$review->email = $this->request->post('email'); 
			$review->text = $this->request->post('text');
			
			// Передадим отзыв обратно в шаблон - при ошибке нужно будет заполнить форму
			$this->design->assign('review_text', $review->text);
			$this->design->assign('review_name', $review->name);
			$this->design->assign('review_email', $review->email); 
			
			// Проверяем заполнение формы
			if (empty($review->name))
			{
				$this->design->assign('error', 'empty_name');
			}
			elseif(empty($review->email))
			{
				$this->design->assign('error', 'empty_email');
			}
			elseif (empty($review->text))
			{
				$this->design->assign('error', 'empty_text');
			}
			else
			{
				// Создаем отзыв
				$review->ip        = $_SERVER['REMOTE_ADDR'];
								
				// Добавляем отзыв в базу
				$review_id = $this->reviews->add_review($review);
				
				// Отправляем email
				$this->notify->email_review_admin($review_id);				
				
				// Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую
				header('location: '.$_SERVER['REQUEST_URI'].'#review_'.$review_id);
			}			
		}
		
		// Отзыв к товару
		$reviews = $this->reviews->get_reviews(array('ip'=>$_SERVER['REMOTE_ADDR']));
		$this->design->assign('reviews', $reviews);
		
				

		$body = $this->design->fetch('review.tpl');
		
		return $body;

	}
}

Далее, в шаблоне вашего дизайна добавить: review.tpl

<!-- Комментарии -->
{if $reviews}
<!-- Список с комментариями -->
<ul class="review_list">
{foreach $reviews as $review}
<a name="review_{$review->id}"></a>
<li>
<!-- Имя и дата комментария-->
<div class="review_header">
<hr />
<img src="design/default_1/images/noavatar.gif" id="profile" alt="Отзыв о товаре {$product->name|escape} оставил(а) {$review->name|escape}" title="Отзыв о товаре {$product->name|escape} оставил(а) {$review->name|escape}" />
<div id="comentput">{$review->name|escape} <i>{$review->date|date}, {$review->date|time}</i></div>
</div>
<!-- Имя и дата комментария (The End)-->
<!-- Комментарий -->
<br />
<div id="commtxt">{$review->text|escape|nl2br}</div>
<br />
<!-- Комментарий (The End)-->
</li>
{/foreach}
</ul>
<!-- Список с комментариями (The End)-->
{else}
<p>
Оставьте свой отзыв первым!
</p>
{/if}
<!--Форма отправления комментария-->	
<form class="review_form" method="post">
{if $error}
<div class="message_error">	
{if $error=='empty_name'}
Введите имя
{elseif $error=='empty_email'}
Введите E-mail 
{elseif $error=='empty_review'}
Введите комментарий
{/if}   
</div>
{/if}
<input class="quest" type="text" name="name" value="{$review_name}" data-format=".+" data-notice="Введите имя" placeholder="Ваше имя"/>
<input class="quest" type="text" name="email" value="{$review_email}" data-format="email" data-notice="Введите email" placeholder="E-mail" /> 
<textarea class="quest2" name="text" data-format=".+" data-notice="Введите ваш отзыв" placeholder="Ваш отзыв">{$review_text}</textarea><br />
<div>
<input class="button" type="submit" name="review" value="Отправить" />
</div>
</form>
<!--Форма отправления комментария (The End)-->
<!-- Комментарии (The End) -->

Далее, в simpla/ReviewsAdmin.php

<?PHP 

require_once('api/Simpla.php');

########################################
class ReviewsAdmin extends Simpla
{
  function fetch()
  {
   	$filter = array();
  	$filter['page'] = max(1, $this->request->get('page', 'integer'));
  	$filter['limit'] = 40;
 
    // Поиск
  	$keyword = $this->request->get('keyword', 'string');
  	if(!empty($keyword))
  	{
	  	$filter['keyword'] = $keyword;
 		$this->design->assign('keyword', $keyword);
	}
 
  	// Обработка действий 	
  	if($this->request->method('post'))
  	{
		
		// Действия с выбранными
		$ids = $this->request->post('check');
		if(!empty($ids) && is_array($ids))
		switch($this->request->post('action'))
		{
		    case 'delete':
		    {
				foreach($ids as $id)
					$this->reviews->delete_review($id);    
		        break;
		    }
		}		
		
 	}

	// Отображение
  	$reviews_count = $this->reviews->count_reviews($filter);
	// Показать все страницы сразу
	if($this->request->get('page') == 'all')
		$filter['limit'] = $reviews_count;	
  	$reviews = $this->reviews->get_reviews($filter, true);
  	 		
  	
 	$this->design->assign('pages_count', ceil($reviews_count/$filter['limit']));
 	$this->design->assign('current_page', $filter['page']);

 	$this->design->assign('reviews', $reviews);
 	$this->design->assign('reviews_count', $reviews_count);

	return $this->design->fetch('reviews.tpl');
  }
}

?>

Далее в simpla/design/html/reviews.tpl

{* Вкладки *}
{capture name=tabs}
		<li><a href="index.php?module=CommentsAdmin">Комментарии</a></li>
		<li><a href="index.php?module=FeedbacksAdmin">Обратная связь</a></li>
		<li class="active"><a href="index.php?module=ReviewsAdmin">Отзывы</a></li>
{/capture}


{* Title *}
{$meta_title='Отзывы о магазине' scope=parent}

{* Поиск *}
{if $reviews || $keyword}
<form method="get">
<div id="search">
	<input type="hidden" name="module" value='ReviewsAdmin'>
	<input class="search" type="text" name="keyword" value="{$keyword|escape}" />
	<input class="search_button" type="submit" value=""/>
</div>
</form>
{/if}


{if $reviews}
<div id="main_list">
	
	<!-- Листалка страниц -->
	{include file='pagination.tpl'}	
	<!-- Листалка страниц (The End) -->
	
	<form id="list_form" method="post">
	<input type="hidden" name="session_id" value="{$smarty.session.id}">
	
		<div id="list" class="sortable">
			{foreach $reviews as $review}
			<div class="{if !$review->approved}unapproved{/if} row">
		 		<div class="checkbox cell">
					<input type="checkbox" name="check[]" value="{$review->id}"/>				
				</div>
				<div class="name cell">
					<div class="review_name">
					{if $review->email}<a href="mailto:{$review->email|escape}">{$review->name|escape}</a>{else}{$review->name|escape}{/if}
					</div>
					<div class="review_text">
					{$review->text|escape|nl2br}
					</div>
					<div class="review_info">
					Комментарий оставлен {$review->date|date} в {$review->date|time}
					</div>
				</div>
				<div class="icons cell">
				    <a class="edit" title="Редактировать" href="{url module=reviewAdmin id=$review->id return=$smarty.server.REQUEST_URI}"></a>
					<a class="delete" title="Удалить" href="#"></a>
				</div>
				<div class="clear"></div>
			</div>
			{/foreach}
		</div>
	
		<div id="action">
		
		<span id="select">
		<select name="action">
			<option value="delete">Удалить</option>
		</select>
		</span>
	
		<input id="apply_action" class="button_green" type="submit" value="Применить">

	</div>
	</form>
	
	<!-- Листалка страниц -->
	{include file='pagination.tpl'}	
	<!-- Листалка страниц (The End) -->
		
</div>
{else}
Нет отзывов
{/if}


{literal}
<script>
$(function() {

	// Удалить 
	$("a.delete").click(function() {
		$('#list input[type="checkbox"][name*="check"]').attr('checked', false);
		$(this).closest(".row").find('input[type="checkbox"][name*="check"]').attr('checked', true);
		$(this).closest("form").find('select[name="action"] option[value=delete]').attr('selected', true);
		$(this).closest("form").submit();
	});
	
	$("form#list_form").submit(function() {
		if($('#list_form select[name="action"]').val()=='delete' && !confirm('Подтвердите удаление'))
			return false;	
	});	
 	
});

</script>
{/literal}

В принципе все. Однако, в поля имени и email не подставляются данные пользователя. Убрана капча, и функция "одобрить" отзыв. И нет возможность редактировать и отвечать на коментарии + не сделано уведомление пользователя о коменте.

 

Как то так, надеюсь кто то дополнит этот говнокод или выложит лучший вариант))

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

Да и забыл, неообходимо создать страницу отзывов с названием - review. + что то текст не выводится на этой стронице

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...