Добавление комментариев гостями.
После определенных манипуляций, гость имеет возможность оставлять комментарии.
Ему доступны поля: 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 наши поля. В итоге кусок выглядит так:
Затем, там где идут знаки вопросов вставляем еще 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}
Далее находим div, в котором располагается надпись «Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.»
Заменяем весь div class=text на
Открываем /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']);
}
Установил, гость добавляет коммент без проблем, но вот при добавлении комментария уже зарегистрированным пользователем, выскакивает ошибка вида:
<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>
Пробую по всякому прикрутить данный модуль (очень полезный, кстати) к new шаблону (точнее к моему шаблону, заверстанную на основе new), но пока что глухо.
Кто-то прикручивал на new? Можете подсказать по 4-му пункту и постоянно вываливающемся попапе о необходимости авторизоваться?
Знающие — подскажите плз. Как в 0.3.1 обойти проверку на авторизацию? Или хотя бы где копать? Судя по всему вышераспложенного описания не достаточно. Постоянно система выдает еррор о необходимости авторизоваться.
Товарищи! А для меня кто-нибудь специально (за разумное небольшое рублёвое вознаграждение) может сие сделать для 0.3.1? Напишите, пож., в личку, если «да». Спасибо.
20 комментариев
штука полезная особенно для начинающихся проектов.
+
Кто-то прикручивал на new? Можете подсказать по 4-му пункту и постоянно вываливающемся попапе о необходимости авторизоваться?
Автор — спасай… :)
За православность сия метода не отвечаю.