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

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

Привет ребята.


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

 

Вот такой вот результат:

 

 

Для такого результата потребуется несколько манипуляций:

1. Идем в базу и выполняем запрос:

ALTER TABLE `s_comments` MODIFY `type` ENUM('product', 'blog', 'feedback')

Что добавит нам дополнительный тип комментариев - отзывы.

 

 

 

2. Сделаем в админке,

2.1. Чтобы вызывались комментарии нового типа:

В файле /simpla/CommentsAdmin.php

// Выбирает объекты, которые прокомментированы:
$products_ids = array();
$posts_ids = array();
$pages_ids = array();
foreach($comments as $comment)
{
	if($comment->type == 'product')
		$products_ids[] = $comment->object_id;
	if($comment->type == 'blog')
		$posts_ids[] = $comment->object_id;
	if($comment->type == 'feedback')
		$pages_ids[] = $comment->object_id;
}
$products = array();
foreach($this->products->get_products(array('id'=>$products_ids)) as $p)
	$products[$p->id] = $p;

$posts = array();
foreach($this->blog->get_posts(array('id'=>$posts_ids)) as $p)
	$posts[$p->id] = $p;
	
$pages = array();
foreach($pages_ids as $p){
	$pages[$p] = $this->pages->get_page($p);
}

foreach($comments as &$comment)
{
	if($comment->type == 'product' && isset($products[$comment->object_id]))
		$comment->product = $products[$comment->object_id];
	if($comment->type == 'blog' && isset($posts[$comment->object_id]))
		$comment->post = $posts[$comment->object_id];
	if($comment->type == 'feedback' && isset($products[$comment->object_id]))
		$comment->page = $pages[$comment->object_id];	
}

Теперь функционально они вызываются.

 

2.2. Чтобы фильтровались и отображались комментарии нового типа:

В файле /simpla/design/html/comments.tpl

{* Заголовок *}
<div id="header">
	{if $keyword && $comments_count}
	<h1>{$comments_count|plural:'Нашелся':'Нашлось':'Нашлись'} {$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'}</h1> 
	{elseif !$type}
	<h1>{$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'}</h1> 
	{elseif $type=='product'}
	<h1>{$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'} к товарам</h1> 
	{elseif $type=='blog'}
	<h1>{$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'} к записям в блоге</h1> 
	{elseif $type=='feedback'}
	<h1>{$comments_count} {$comments_count|plural:'отзыв':'отзывов':'отзыва'}</h1> 
	{/if}
</div>	

И ниже в том-же файле:

<!-- Категории товаров -->
<ul>
<li {if !$type}class="selected"{/if}><a href="{url type=null}">Все комментарии</a></li>
</ul>
<ul>
	<li {if $type == 'feedback'}class="selected"{/if}><a href='{url keyword=null type=feedback}'>Отзывы</a></li>
	<li {if $type == 'product'}class="selected"{/if}><a href='{url keyword=null type=product}'>К товарам</a></li>
	<li {if $type == 'blog'}class="selected"{/if}><a href='{url keyword=null type=blog}'>К блогу</a></li>
</ul>
<!-- Категории товаров (The End)-->

 

 

3. Теперь на самой странице
3.1. Вызов комментариев и сохранение нового

Файл /view/PageView.php - добавим:

// Принимаем комментарий
if ($this->request->method('post') && $this->request->post('comment'))
{
	$comment->name = $this->request->post('name');
	$comment->text = $this->request->post('text');
	$captcha_code =  $this->request->post('captcha_code', 'string');
	
	// Передадим комментарий обратно в шаблон - при ошибке нужно будет заполнить форму
	$this->design->assign('comment_text', $comment->text);
	$this->design->assign('comment_name', $comment->name);
	
	// Проверяем капчу и заполнение формы
	if ($_SESSION['captcha_code'] != $captcha_code || empty($captcha_code))
	{
		$this->design->assign('error', 'captcha');
	}
	elseif (empty($comment->name))
	{
		$this->design->assign('error', 'empty_name');
	}
	elseif (empty($comment->text))
	{
		$this->design->assign('error', 'empty_comment');
	}
	else
	{
		// Создаем комментарий
		$comment->object_id = $page->id;
		$comment->type      = 'feedback';
		$comment->ip        = $_SERVER['REMOTE_ADDR'];
		
		// Если были одобренные комментарии от текущего ip, одобряем сразу
		$this->db->query("SELECT 1 FROM __comments WHERE approved=1 AND ip=? LIMIT 1", $comment->ip);
		if($this->db->num_rows()>0)
			$comment->approved = 1;
		
		// Добавляем комментарий в базу
		$comment_id = $this->comments->add_comment($comment);
		
		// Отправляем email
		$this->notify->email_comment_admin($comment_id);				
		
		// Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую
		unset($_SESSION['captcha_code']);
		header('location: '.$_SERVER['REQUEST_URI'].'#comment_'.$comment_id);
	}			
}

// Комментарии к странице
$comments = $this->comments->get_comments(array('type'=>'feedback', 'object_id'=>$page->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR']));
$this->design->assign('comments', $comments);

Обязательно до строки:

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

 

Теперь вызываются комментарии при загрузке страницы, а так-же сохраняются новые.

3.2. Теперь прикрутим шаблон и вызов шаблона

Я лично создал файл /design/default/html/otzyvy.tpl с содержанием:

<!-- Комментарии -->
<div id="comments">
	
	{if $comments}
	<!-- Список с комментариями -->
	<ul class="comment_list">
		{foreach $comments as $comment}
		<li>
			<a name="comment_{$comment->id}"></a>
			<!-- Имя и дата комментария-->
			<div class="comment_header">	
				{$comment->name|escape} <i>{$comment->date|date}, {$comment->date|time}</i>
				{if !$comment->approved}ожидает модерации</b>{/if}
			</div>
			<!-- Имя и дата комментария (The End)-->
			
			<!-- Комментарий -->
			{$comment->text|escape|nl2br}
			<!-- Комментарий (The End)-->
		</li>
		{/foreach}
	</ul>
	<!-- Список с комментариями (The End)-->
	{else}
	<p>
		Пока нет отзывов
	</p>
	{/if}
	
	<!--Форма отправления комментария-->

	<!--Подключаем js-проверку формы -->
	<script src="/js/baloon/js/default.js" language="JavaScript" type="text/javascript"></script>
	<script src="/js/baloon/js/validate.js" language="JavaScript" type="text/javascript"></script>
	<script src="/js/baloon/js/baloon.js" language="JavaScript" type="text/javascript"></script>
	<link href="/js/baloon/css/baloon.css" rel="stylesheet" type="text/css" /> 
	
	<form class="comment_form" method="post" action="">
		<h2>Написать отзыв</h2>
		{if $error}
		<div class="message_error">
			{if $error=='captcha'}
			Неверно введена капча
			{elseif $error=='empty_name'}
			Введите имя
			{elseif $error=='empty_comment'}
			Введите комментарий
			{/if}
		</div>
		{/if}
		<textarea class="comment_textarea" id="comment_text" name="text" data-format=".+" data-notice="Введите отзыв">{$comment_text}</textarea><br />
		<div>
		<label for="comment_name">Имя</label>
		<input class="input_name" type="text" id="comment_name" name="name" value="{$comment_name|escape}" data-format=".+" data-notice="Введите имя"/><br />

		<input class="button" type="submit" name="comment" value="Отправить" />
		
		<label for="comment_captcha">Число</label>
		<div class="captcha"><img src="captcha/image.php?{math equation='rand(10,10000)'}"/></div> 
		<input class="input_captcha" id="comment_captcha" type="text" name="captcha_code" value="" data-format="\d\d\d\d" data-notice="Введите капчу"/>
		
		</div>
	</form>
	<!--Форма отправления комментария (The End)-->
	
</div>
<!-- Комментарии (The End) --> 

Это практически копия комментариев из блога.
Ну и вывел их в /design/default/html/index.tpl

<!-- Основная часть --> 
<div id="content">
	
	{$content}
	
	{if $smarty.server.REQUEST_URI == '/otzyvy'} 
		{include file='otzyvy.tpl'}
	{/if}
</div>
<!-- Основная часть (The End) --> 

 


-----------------------------------------------
Вот, готово, остается только создать страницу со ссылкой "/otzyvy", или другую,
какая вам нравится и вы получите на ней модерируемые отзывы. Такие дела.
 

Думаю можно сделать штуку, чтобы в админке страниц галочкой помечалось где выводить такие,
но это делать мне не нужно сейчас, поэтому я не делал.
-----------------------------------------------
Пользуйтесь на здоровье.

 

Вопросы в skype - abashyrov

 

Поставлю за 500 рубликов, если нужно.
Если кому понравилось - можете закинуть мне
спасибо на киви +7 937 304-69-07

-----------------------------------------------

Вроде не забыл ничего.

Изменено пользователем ExtraBash
Ссылка на сообщение
Поделиться на другие сайты

куда лучше было бы если создать отдельно вкладку Отзывы а не вместе с комментариями.

 

{if $smarty.server.REQUEST_URI == '/otzyvy'}
        {include file='otzyvy.tpl'}
    {/if}
 

сырая доработка, не в обиду. 

 

Допустим как вывести последние 5  отзывов на главную страницу?

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

куда лучше было бы если создать отдельно вкладку Отзывы а не вместе с комментариями.

 

{if $smarty.server.REQUEST_URI == '/otzyvy'}
        {include file='otzyvy.tpl'}
    {/if}
 

сырая доработка, не в обиду. 

 

Допустим как вывести последние 5  отзывов на главную страницу?

А я и не говорил, что на главную сунуть можно, и более того указал сразу на некоторые возможные

неудобства в работе, но мне более было не нужно, я более и не занимался.

 

Ну придется обработку сунуть отдельно, и придется шаблон формы сунуть в мейн, а форыч ограничить до 5.

 

Думаю у вас, как у профессионала займет минуты 3.

 

Остальные смогут за 2 сунуть на любую другую страницу.

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

Полезно.

Вопрос. А админ может на эти комментарии как-то отвечать?

И еще самое важное, я как раз недавно сделал страницу /otzyvy и прикрутил туда комментарии от вк

А можно туда вкладкой еще сделать ваши? чтобы у человека был выбор.

Т.е заходит человек на страницу отзывов, а там открыта по умолчанию 1 вкладка допустим с комментариями от вк, и, нажав, на другой таб он переходит к стандартным комментариям.

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

Полезно.

Вопрос. А админ может на эти комментарии как-то отвечать?

И еще самое важное, я как раз недавно сделал страницу /otzyvy и прикрутил туда комментарии от вк

А можно туда вкладкой еще сделать ваши? чтобы у человека был выбор.

Т.е заходит человек на страницу отзывов, а там открыта по умолчанию 1 вкладка допустим с комментариями от вк, и, нажав, на другой таб он переходит к стандартным комментариям.

Первый вопрос - ну я думаю можно в pageView сделать ограничение, дабы какое-то имя аля Админимтратор нельзя было применить, и просто от его имени писать ответ. В целом такой штуки нет - это стандартный модуль комментариев.

 

Второе - конечно можно, почему нет, otzyvy.tpl редактируем под табы http://jqueryui.com/tabs/ 

В одном выводите всё, что написано выше, в другом от вк.

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

Плиз подскажи как решить

Warning: Creating default object from empty value in   view/PageView.php on line 37

Warning: Cannot modify header information - headers already sent by (output started at ........./view/PageView.php:37)

line 37:     $comment->name = $this->request->post('name');

уже и пересохранил в кодировке без вом

 

спасибо

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...
  • 1 год спустя...

а где вы это взяли ?,

<script src="/js/baloon/js/default.js" language="JavaScript" type="text/javascript"></script>
<script src="/js/baloon/js/validate.js" language="JavaScript" type="text/javascript"></script>

 

это не стандартный набор !

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

А как вывести у каждого коммента ссылку на товар к которому он относится? ну как в админке только на странице комментариев?
 

{if $comment->type == 'product'}
<a  href="{$config->root_url}/products/{$comment->product->url}#comment_{$comment->id}">{$comment->product->name}</a>{/if}

эта конструкция не выводит :(
Ссылка на сообщение
Поделиться на другие сайты
  • 2 года спустя...

Над комментариями горит красный кружочек с цифрой 1 и на странице товара он есть. а в самой вкладке пусто. ни одного комментария

Изменено пользователем WIXVW
Ссылка на сообщение
Поделиться на другие сайты

Над комментариями горит красный кружочек с цифрой 1 и на странице товара он есть. а в самой вкладке пусто. ни одного комментария

 

смотрите в базе он записывается?

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

нет

 

Как может комментарий присутствовать в карточке товара, а в базе его не быть? Мы же о MySQL базе говорим я надеюсь?

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

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

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

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

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

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

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

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

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

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