Jump to content

Recommended Posts

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


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

 

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

 

 

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

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

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

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

Edited by ExtraBash
Link to post
Share on other sites

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

 

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

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

 

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

Link to post
Share on other sites

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

 

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

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

 

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

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

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

 

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

 

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

 

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

Link to post
Share on other sites

Полезно.

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

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

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

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

Link to post
Share on other sites

Полезно.

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

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

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

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

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

 

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

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

Link to post
Share on other sites
  • 2 weeks later...

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

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');

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

 

спасибо

Link to post
Share on other sites
  • 1 month later...
  • 1 year later...
  • 1 month later...

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

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

эта конструкция не выводит :(
Link to post
Share on other sites
  • 2 years later...

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

Edited by WIXVW
Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

нет

 

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...