Добавление комментариев гостем.

Добавление комментариев гостями.
После определенных манипуляций, гость имеет возможность оставлять комментарии.
Ему доступны поля: login, email, captcha:)
Новые комментарии выводятся как от пользователя «Имя (гость)».



Спонсором нашего сегодняшнего топика является skpnm!!! Спасибо ему:)
Выглядит так:


Для реализации данной функциональности мы добавляем в базу данных комментариев 2 поля: guest_name и guest_email и пользователя «guest» с id = 0:

1. Выполняем mysql-скрипт:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
INSERT INTO `prefix_user` (user_id,user_login) values (0,"guest");

ALTER TABLE `prefix_topic_comment` 
	ADD  `guest_name` VARCHAR( 150 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
	ADD  `guest_email` VARCHAR( 150 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL

2. Далее мы вставляем по 2 метода set и get в /classes/modules/comment/entity/TopicComment.entity.php.
Сразу после метода «isBad»:

public function getGuestName() {
        return $this->_aData['guest_name'];
}
public function getGuestEmail() {
        return $this->_aData['guest_email'];
}

Затем в конце файла вставляем

public function setGuestName($data) {
	$this->_aData['guest_name']=$data;
}
public function setGuestEmail($data) {
        $this->_aData['guest_email']=$data;
}

3. После этого правим /classes/modules/comment/mapper/TopicComment.mapper.php.
Находим метод AddComment.
В sql-запросе после поля comment_text_hash вставляем 2 наши поля. В итоге кусок выглядит так:
...
	comment_user_ip,
	comment_text_hash,
	guest_name,
	guest_email
...

Затем, там где идут знаки вопросов вставляем еще 2. Итого получилось:

VALUES(?, ?d, ?d, ?, ?, ?, ?, ?, ?)

Теперь опускаемся чуть ниже и в этом же методе находим длинную строчку. Добавляем в ее конец наши «геттеры»:

if ($iId=$this->oDb->query($sql,$oComment->getPid(),$oComment->getTopicId(),$oComment->getUserId(),$oComment->getText(),$oComment->getDate(),$oComment->getUserIp(),$oComment->getTextHash(),$oComment->getGuestName(),$oComment->getGuestEmail()))


4.Переходим к шаблонам.
Открываем /templates/skin/habra/actions/ActionBlog/comment.tpl и удаляем строчку 15, которая у нас теперь будет чуть выше.
после 3й строчки вставляем:

 	<form action="" method="POST">
 	{if !$oUserCurrent}
	 	<div style="margin:5px;padding:5px;border:1px solid #DDDDDD;">
	 		<label style="display:block;float:left;width:80px;">Ваше имя:</label> <input type="text" name="guest_name" value="{$_aRequest.guest_name}"/>
	 	</div>
 		<div style="margin:5px;padding:5px;border:1px solid #DDDDDD;">
 			<label style="display:block;float:left;width:80px;">Ваш e-mail:</label> <input type="text" name="guest_email" value="{$_aRequest.guest_email}"/> 
 			(мыло будет скрыто и используется только для отправки ответов на ваш коментарий)
 		</div> 	
 		<p><label for="captcha"><span class="form">Нам нужны эти цифры и буквы:</span></label>
	 	<img src="{$DIR_WEB_ROOT}/classes/lib/external/kcaptcha/index.php?{$_sPhpSessionName}={$_sPhpSessionId}">

	 	<input type="text" style="text-align: center;" name="captcha" value="" maxlength=3 size=9>

	 	</p>
	 	
 	{/if}

Находим строчку
<a href="{$DIR_WEB_ROOT}/profile/{$oComment->getUserLogin()}/" class="comments_nickname">{$oComment->getUserLogin()}</a>

и заменяем на

   					{if $oComment->getUserId()!=0}
   						<a href="{$DIR_WEB_ROOT}/profile/{$oComment->getUserLogin()}/" class="comments_nickname">{$oComment->getUserLogin()}</a>
   					{else}
   						{$oComment->getGuestName()} (гость)
   					{/if} 

Далее находим div, в котором располагается надпись «Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.»
Заменяем весь div class=text на

			<div class="WriteCommentHolder">
  	<img src="{$DIR_STATIC_SKIN}/img/comment.gif"> <a name="comment" href="javascript:showCommentForm(0);" class="news_page_comments_title">написать комментарий</a>
  	<br />
	<div style="display: none;" id="reply_0"></div>
			</div>


Открываем /templates/skin/habra/actions/ActionBlog/topic.tpl и после system_message вставляем этот код:

{if isset($_aRequest.comment_pid)}
		<a href="#" onClick="showCommentForm('{$_aRequest.comment_pid}');return false" >Перейти к комментарию</a>
{/if}


5. Правим экшн.
Открываем /classes/actions/ActionBlog.class.php. Находим метод
protected function SubmitComment($oTopic) {

заменяем блок


			if (!$this->oUserCurrent) {
	$this->Message_AddErrorSingle('Для того чтобы что то написать, сначало нужно войти под своим аккаунтом.','Нет доступа');
	return Router::Action('error');
			}

на


$_REQUEST["comment_text"] = getRequest("comment_text");
$sParentId=getRequest('reply',0);
$_REQUEST["comment_pid"] = $sParentId;
			
if (!$this->oUserCurrent) {
	$this->oUserCurrent = $this->User_GetUserById(0);
	$_REQUEST["guest_name"] = getRequest("guest_name");
	$_REQUEST["guest_email"] = getRequest("guest_email");			
	
	if (!func_check(getRequest("guest_name"),"text",2,20)){
		$this->Message_AddError('Необходимо указать Ваше имя (от 2х до 20 символов)','Ошибка');
		return false;		
	}
	
	if (!func_check(getRequest("guest_email"),"mail")){
		$this->Message_AddError('Email указан неверно.','Ошибка');
		return false;		
	}

	if (!isset($_SESSION['captcha_keystring']) or $_SESSION['captcha_keystring']!=strtolower(getRequest('captcha'))) {
		$this->Message_AddError('Неверный код','Ошибка');
		return false;
	}
	
			}

Далее после строки
$oCommentNew->setTextHash(md5($sText));

вставляем

if ($this->oUserCurrent->getId()==0){				
	$oCommentNew->setGuestName(getRequest("guest_name"));				
	$oCommentNew->setGuestEmail (getRequest("guest_email"));				
	unset($_SESSION['captcha_keystring']);
}

20 комментариев

avatar
спасибо! всё ok
avatar
Пригодится) Спасибо)
avatar
ВОт если еще и измененные файлы выложишь, цены тее не будет )
штука полезная особенно для начинающихся проектов.
+
avatar
live.leontevhost.ru здесь можно посмотреть
avatar
avatar
интересно) а гайд, как миниатюры изображений делать напишите?
avatar
Еще бы опцией в конфиг внести )
avatar
Установил, гость добавляет коммент без проблем, но вот при добавлении комментария уже зарегистрированным пользователем, выскакивает ошибка вида:
<code>Notice: Undefined index: guest_name in /var/www/tpLVTg/tp.ks.ua/classes/modules/comment/entity/TopicComment.entity.class.php on line 118

Notice: Undefined index: guest_email in /var/www/tpLVTg/tp.ks.ua/classes/modules/comment/entity/TopicComment.entity.class.php on line 121

Warning: Cannot modify header information - headers already sent by (output started at /var/www/tpLVTg/tp.ks.ua/classes/modules/comment/entity/TopicComment.entity.class.php:118) in /var/www/tpLVTg/tp.ks.ua/include/function.php on line 335</code>
avatar
Отключите вывод нотисов в файле TopicComment.entity.class.php
avatar
Пробую по всякому прикрутить данный модуль (очень полезный, кстати) к new шаблону (точнее к моему шаблону, заверстанную на основе new), но пока что глухо.

Кто-то прикручивал на new? Можете подсказать по 4-му пункту и постоянно вываливающемся попапе о необходимости авторизоваться?
avatar
Также ищу решение данной проблемы прикрутки к новому шаблону. Если удатся, пожалуйста — сообщи.
avatar
Рискну еще разок спросить про адаптацию к новым шаблонам
avatar
да очень хочется, но что то никак :(
Автор — спасай… :)
avatar
Товарисчи, а для 0.3.1 кто-нить приспособил?
avatar
Аууу? Кто-то на новой версии ЛС дал гостям возможность комментировать?! ;-)
avatar
Видимо нет. А без знания основ программирования ох как сложно будет со всей этой самодеятельностью :)
avatar
Знающие — подскажите плз. Как в 0.3.1 обойти проверку на авторизацию? Или хотя бы где копать? Судя по всему вышераспложенного описания не достаточно. Постоянно система выдает еррор о необходимости авторизоваться.
avatar
if(!$this->Session_Get('user_id')){}

За православность сия метода не отвечаю.
avatar
Все оказалось запутаннее, чем я надеялся. Но тем не менее спасибо за подсказку
avatar
Товарищи! А для меня кто-нибудь специально (за разумное небольшое рублёвое вознаграждение) может сие сделать для 0.3.1? Напишите, пож., в личку, если «да». Спасибо.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.