Написал свой модуль комментариев для Yii, решил поделиться с вами! Пишите ваши предложения или вопросы в комментариях 🙂 Ссылка на модуль в конце записи.
Основные возможности модуля комментариев для Yii
- Поддержка лайков +7 , которые так же могут уходить в «минус»
- Удаление своего комментария (даже без регистрации)
- Редактирование своего комментария (тоже без регистрации)
- Указание времени в течение которого можно отредактировать/удалить свой комментарий
- Указание уровня вложенности
- Указание отступа вложенности в пикселях
- Указание максимальной длины поля «автор» и «комментарий»
- Вкл/выкл возможности накрутки лайков суперпользователем
- Вкл/выкл режима «премодерации» комментариев
- Уведомление пользователя по e-mail о новых комментариях
- Пользователь может отписаться от получения комментариев с определённой страницы, или же со всего сайта
- Уведомление администратора по e-mail о новых комментариях
- Комментарии добавляются по ajax, без перезагрузки страницы
- Каждый комментарий имеет свою хэш-ссылку вида: site.com/your_url/#comment_7 (можно отправить друзьям)
- Для зарегистрированного пользователя показываются «новые комментарии»
- Поддержка микроразметки Schema.org
Yii Commentator предоставляет удобный менеджер управления комментариями
Демонстрация ответа на комментарий
Редактирование комментария
Просмотр комментария
Преимущества для разработчика
- Простая установка! Вам не нужно привязывать модуль к сущностям, вместо этого комментарии привязываются к странице на которой они расположены (как комментарии Вконтакте), это даёт невероятную гибкость и возможность разместить виджет комментариев на любой странице сайта!
- Лёгкое редактирование представлений (все части виджета удобно раскиданы по файликам)
- А также лёгкое редактирование шаблонов писем-уведомлений
Инструкция по установке
Установка производится с помощью Composer, если вы ещё не используете его, то срочно начинайте использовать! Экономит кучу времени и сил 😉
- Выполняем команду Composer’a:
php composer.phar require pendalf89/yii-commentator:dev-master
- В index.php пишем:
require_once('vendor/autoload.php');
Таким образом мы подключили автозагрузчик Composer’а// change the following paths if necessary $yii=dirname(__FILE__).'/framework/yii.php'; $config=dirname(__FILE__).'/protected/config/main.php'; // remove the following lines when in production mode defined('YII_DEBUG') or define('YII_DEBUG',true); // specify how many levels of call stack should be shown in each log message defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3); require_once('vendor/autoload.php'); require_once($yii); Yii::createWebApplication($config)->run();
- main/config.php:
'aliases' => array( 'comments' => realpath(dirname(__FILE__) . '/../..') . '/vendor/pendalf89/yii-commentator/', ), 'modules'=>array( 'comments' => array( 'class' => 'pendalf89\yii_commentator\CommentsModule', 'userModelClass' => '', 'isSuperuser' => '!Yii::app()->user->isGuest', ), ),
Про настройки подробнее будет написано ниже
- Выполните миграции в папке vendor/pendalf89/yii-commentator/migrations
Зависимости
Модуль комментариев Yii commentator зависит от фронтенд фреймворка Twitter Bootstrap не ниже третьей версии и набора иконок FontAwesome.
Настройки
Вы можете использовать настройки класса модуля, или же использовать настройки из базы данных. Приоритет определяется свойством ‘useSettingsFromDB’
Название настройки | Значение по-умолчанию | Описание |
---|---|---|
dateFormat | ‘d.m.Y | H:i:s’ | Формат даты |
margin | 70 | Отступ комментария от левого края |
levels | 6 | Максимальное количество уровней дерева комментариев |
editTime | 60 | Лимит времени в секундах, в течение которого разрешено редактировать/удалять свой комментарий |
maxLengthAuthor | 128 | Максимальная длина поля «автор». Максимум — 128 символов |
maxLengthContent | 1000 | Максимальная длина поля «комментарий» |
likesControl | false | Возможность суперпользователя накручивать лайки |
premoderate | false | Премодерация комментариев (если true, то появляются на сайте только после проверки) |
fromEmail | — | E-mail с которого пользователям приходят сообщения |
adminEmail | — | E-mail, на который администратору приходят уведомления |
notifyAdmin | false | Уведомлять администратора о новых комментариях или нет |
isSuperuser | ‘\Yii::app()->user->checkAccess(«admin»)’ | Выражение или анонимная функция, которая определяет что текущий пользователь является супер пользователем. Анонимная функция должна возвращать true/false |
managePageSize | 50 | Количество комментариев, отображаемых на странице управления комментариями |
useSettingsFromDB | true | Использовать настройки, задаваемые в конфиге, или же брать их из БД |
userIDExpr | ‘\Yii::app()->user->id’ | Выражение или анонимная функция для получения id текущего пользователя |
userModelClass | ‘User’ | Класс моделей пользователей. Если у вас нет модели пользователей, оставьте это значение пустым, модуль будет работать без модели пользователей |
userEmailField | ’email’ | Свойство модели пользователя, в котором хранится email пользователя |
usernameField | ‘username’ | Свойство модели пользователя, в котором хранится имя пользователя |
Использование
Теперь можно подключить виджет комментариев на любую страницу!
$this->widget('pendalf89\yii_commentator\extensions\comments_widget\CommentsWidget', array( // Необязательный параметр, включает поддержку микроразметки, по-умолчанию: false 'enableMicrodata' => true, ));
Этот код выведет форму комментирования и сами комментарии. Вы также можете вывести количество новых комментариев с помощью виджет CommentsCount:
// Новые комментарии в оформленном виде $this->widget('pendalf89\yii_commentator\extensions\count_widget\CountWidget'); // Количество новых комментариев: pendalf89\yii_commentator\helpers\CHelper::getNewCommentsCount(); // Ссылка на последний новый комментарий pendalf89\yii_commentator\helpers\CHelper::getNewCommentsUrl()
Скачать Yii Commentator модуль комментариев для Yii
А как установить без Composer в Yii1?
Без composer никак.
Жаль, не все пока ещё используют Composer и не всегда это удобно.
Теоретически, если поплясать с бубном, то можно завести. Надо скачать модуль и сделать так, чтобы заработала автозагрузка.
Добрый день! Установил модуль на чистый фреймворк Yii1 c базовым приложением (http://yiiframework.ru/doc/guide/ru/quickstart.first-app). В админке при редактировании (?r=comments/admin/update&id=1) комментария выскакивает CException:
Property «pendalf89\yii_commentator\models\Comment.user» is not defined.
вот скрин http://joxi.ru/brRDqkDsLoRL21
Я так понимаю ваш модуль так же зависит от модуля Yii-user? Если да, то почему упоминания об этом нет в статье?
Добрый день! А миграции установили?
Да, миграции все установлены. Все 3 таблицы есть в базе.
В таблице `comment` user_id null — http://joxi.ru/823OGROuabpl2O
Авторизовался под админом, но все данные в форме вводил левые — http://joxi.ru/GrqM8JMhRE0Prz
А что у вас прописано в настройке userModelClass?
Вы имеете ввиду конфиг файл? какой параметр/ключ подскажите. Если то поможет, то я еще не подключал пользователей (авторизацию) через базу (т.е. без этого http://yiiframework.ru/doc/guide/ru/topics.auth), я имею ввиду:
что пока что у меня без этого:
‘authManager’=>array(
‘class’=>’CDbAuthManager’,
‘connectionID’=>’db’,
),
Нет-нет, я имею ввиду конфигурацию модуля комментариев. Какое значение у вас в ключе ‘userModelClass’? Попробуйте поставить пустую строку.
Прописано как и у вас:
‘userModelClass’ => »,
кстати у меня модуль лежит в папке protected\vendor\pendalf89\yii_commentator\
‘userModelClass’ =>»»,
«кстати у меня модуль лежит в папке protected\vendor\pendalf89\yii_commentator\» — это так и должно быть.
Хм.. странно. А попробуйте закомментировать строку, которая вызывает ошибку. 24 строка в файле views\admin\update.php
И ещё: если редактировать комментарий не через админку, ошибка возникает?
Закомментировал строку 24, все гуд.
И ещё: если редактировать комментарий не через админку, ошибка возникает?
—-
например, как еще?
Если вы залогинены как суперпользователь (см. настройку ‘isSuperuser’ в настройках модуля), то тогда можно редактировать комментарий прямо на странице комментария.
А по поводу ошибки, кажется это баг. Потом посмотрю на досуге, благодарю за интерес к модулю)
Да, редактирование доступно http://joxi.ru/RmzXjLXSjngLAO при раскоментированной 24 строчи.
Спаибо, если что, давайте спишемся я смогу рассказать вам свои шаги по воспроизведению бага.
Не за что 🙂
Хорошо, если что, я напишу вам!
Нашел еще пару багов:
1. Авторизованный пользователь может редактировать и удалять чужие комментарии.
2. В настройке «Время в (секундах), в течение которого можно отредактировать комментарий» допустим стоит 5 сек.
А) На сайте оставляем комментарий, и по истечении 5 секунд кнопки «Редактировать» и «Удалить» не исчезают. Хотя было логично чтобы он пропадали, или хотя бы при клике появлялся попап а сообщением.
Б) Даже если в течении 5 секунд мы все таки успели нажать на кнопку «Редактировать» то появляется ниже форма, водим данные, проходит еще 5 сек, нажимаем на «Отправить комментарий» и ничего не случается (пользователь не понимает что происходит, почему комментарий не публикуется), даже нет сообщения.
3. Любой пользователь может лайкать (как в + так и в -) свой комментарий. Вроде как накрутка (хоть и небольшая) получается.
1. Только суперпользователь обладает такими правами (см. настройку ‘isSuperuser’).
2.
а) Это не критичный момент, но можно учесть это для следующих версий.
б) Это логическая ошибка. Можно забить на пункт а) и выводить ошибку типа «время истекло». Наверное так будет лучше. Можно сделать это в следующих версиях.
3. Не считаю это багом, Вконтакте ведь можно лайкать свой комментарий.
Хочу заметить, что для первого Yii я больше не планирую выпускать новых версий этого модуля, если есть желание помочь с фичами и багами, можно воспользоваться гитхабом и прислать пул-реквесты. В будущем я перепишу этот модуль для Yii2.
+ еще один баг:
«File_get_contents(http://baypay.local/index.php?r=projects/browser&id=1) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 500 Internal Server Error»
Скриншот — http://joxi.ru/D2PjNXjFWedjr3
Этот баг возникает когда еще не включены нормальные урлы типа /module/controller/action. Если урл имеет вид index.php?r=comments/admin/index то такая вот ошибка.
Это скорее всего из-за того, что комментарии я привязывал к урлу «жёстко», т.е. просто брал урл из адресной строки и всё. В следующей версии я учту это и буду привязывать к странице другим способом.
А в этой версии почему нельзя пофиксить? ведь народ же пользуется =)
Мне очень приятно что люди пользуются, и там много чего надо фиксить, а у меня совсем нет времени.
Вы можете попробовать пофиксить сами и прислать пул-реквест на гитхаб! 😉
Ещё, если не сложно, при данной ошибке выведет переменную $absoluteUrl, что она содержит? Это может помочь решить проблему.
var_dump($absoluteUrl);
die(‘STOP’);
выводит http://joxi.ru/gmvRM5RF0VqMma или http://joxi.ru/DmBXKMXS6OJQAP
А сам этот урл открывается?
Да, урл открывается
Если ради спортивного интереса где-нибудь в коде его получить с помощью file_get_contents, ошибка произойдёт? Или нормально загрузится?
Да, та же ошибка =( это может быть из-за модуля Right? хотя с правами все норм, ссылка то открывается.
Артём, похоже я догадываюсь в чём проблема. Обратите внимание что пишет ошибка: …browser&id=1
& — html символ. Попробуйте вызвать file_get_contents вот так: file_get_contents(urlencode($absoluteUrl)); и посмотрите исчезнет ошибка или нет. Должно помочь, если это решит проблему, отпишитесь, я внесу изменения в код
А, ёмаё, амперсант в комментариях написался как амперсант, а не html символ 😉 Ну вы поняли меня, попробуйте пропустить $absoluteUrl через urlencode().
еще страшнее стало:
file_get_contents(http%3A%2F%2Fbaypay.local%2Findex.php%3Fr%3Dprojects%2Fbrowser%26id%3D1) ….
А если попробовать по-хардкоду скормить «правильный» урл вместе с амперсантом file_get_contents’у?
Правильный не хочет кушать http://joxi.ru/EA4N03NF0zXJmb
Как-то странно это.
У меня со стандартными урлами работает: http://hostingkartinok.com/show-image.php?id=46b0e1340f020fb6608267ada470a4ab
Попробуйте скачать и установить пример, будут ли с ним проблемы на вашей машине?
Здравствуйте Борис, возникла проблема. При добавление комментария возникает ошибка Error 400 Некорректный запрос и переходит по такому адресу http://sitenew.com/comments/handler/create.
Может ли это быть из-за того, что у меня на станице есть еще формы.
Точно не из-за форм, а что пишет в ошибке?
Спасибо, Борис. Разобралась с подключением модуля. Была ошибка в конфиге — не закрыла предыдущий модуль. Теперь ошибка 400 при create. В консоле:
Uncaught TypeError: jQuery(…).yiiactiveform is not a function
jQuery(‘#comment-form’).yiiactiveform({‘validateOnSubmit’:true,’validateOnChange’:false,’errorCssClass’:’has-error’,’successCssClass’:’has-success’,’attributes’:[{‘id’:’pendalf89_yii_commentator_models_Comment_content’,’inputID’:’pendalf89_yii_commentator_models_Comment_content’,’errorID’:’pendalf89_yii_commentator_models_Comment_content_em_’,’model’:’pendalf89\\yii_commentator\\models\\Comment’,’name’:’content’,’enableAjaxValidation’:true}],’errorCss’:’error’});
Помогите, пожалуйста советом!
Похоже на то, что jQuery не подключился. Или подключился, но после js-файлов модуля.
когда кидаю виджет по такому пути C:\Open server\OpenServer\domains\SiteNew.com\themes\mainThemes\views\site\файл.php, возникает ошибка.
Когда кидаю по C:\Open server\OpenServer\domains\SiteNew.com\protected\views\site\pages они нормально работают.
Возможно не подгружается нужный класс. Что сообщается в ошибке?
Доброго времени суток! Такая же ошибка возникает 400, как исправили?
Попробуйте скачать и посмотреть пример из статьи, там всё должно работать. Затем сравните с вашим проектом, возможно, есть какие-то незначительные на первый взгляд отличия, которые и вызывают ошибку.
На тестовой версии все работает отлично. Когда устанавливал данное расширение были проблемы с адресами, а именно каталог с названием yii-commentator попросту отказывается, пришлось переименовать в yii_commentator. Алиасы пришлось прописывать следующим образом:
‘comments’ => realpath(dirname(__FILE__) . ‘/../..’) . ‘/vendor/pendalf89/yii-commentator/’,
‘pendalf89’ => realpath(dirname(__FILE__) . ‘/../..’) . ‘/vendor/pendalf89/’,
В тестовой версии все стандартно и работает, понять не могу, почему на моей версии не работает с такими настройками.
При нажатии на кнопку отправить на моей версии даже проверка правильности заполнения формы не происходит, кнопка сначала становится неактивной, потом снова активной, а в консоли показывает ошибку 400 на /comments/hendler/create
А скрипты подключены в правильном порядке? Хотя с другой стороны… 400 ошибка — это неправильный запрос к серверу. Т.е. скрипт-то срабатывает, но что-то на стороне сервера не то. Попробуйте продебажить метод actionCreate у контроллера HandlerController. Ещё, чисто ради интереса можно попробовать закомментировать метод filters() у того же контроллера.
Поочередно отключил строки в акшене, нашел строчку, на которую ругается:
if ( !isset($_POST[‘pendalf89_yii_commentator_models_Comment’]) )
return false;
Видимо данные из формы как-то криво передаются у меня, как это можно проверить? кроме самого расширения какие-либо скрипты надо было устанавливать? может чего-то не хватает?
Заметил вот какую вещь! В тестовой версии, когда передаются параметры в запрос, они передается в виде pendalf89_yii_commentator_models_Comment%5Bauthor%5D=%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD
А в моем проекте параметры выглядят вот так: pendalf89%5Cyii_commentator%5Cmodels%5CComment%5Bcontent%5D=%D1%8B%D0%B2%D0%BF%D1%8B%D0%B2%D0%B0%D0%BF
Т.е. получается, что ряд знаков _ заменяется на %5C. С чем это может быть связано и как и справить. Почему так происходит? Хотя все настройки на первый взгляд одинаковы.
Еще вот что заметил! В тестовом варианте название переменных уже на форме генерируется как name=»pendalf89_yii_commentator_models_Comment[content]», в моем проекте почему-то pendalf89\yii_commentator\models\Comment[content]. Все видимо из-за этого, но как это вылечить?
Жесть! Предполагаю, что в новой версии Yii разработчики решили по-другому выводить input’ы моделей, в которых используется namespace.
Как решить проблему быстро: сделать поиск и замену строк в выводе виджета, например, вот так:
echo str_replace(
'pendalf89\yii_commentator\models\Comment',
'pendalf89_yii_commentator_models_Comment',
$this->widget('pendalf89\yii_commentator\extensions\count_widget\CountWidget', [], true)
);
Так текст менять не дает, так как виджет не есть текст, поменял через вывод формы, но результата не дало, имена исправились, а модель не видит эти переменные, так как теперь они выглядят по другому )
Почему так менять нельзя? Ставите «true», чтобы widget не эхался, а возвращался в строку и вперёд.
Не подскажите как тут ‘comments’ => array(
‘class’ => ‘pendalf89\yii_commentator\CommentsModule’,
‘userModelClass’ => »,
‘isSuperuser’ =>’ ‘,
), указать доступ, чтобы коменты мог редактировать только админ. Установлен module-user.
С модулем «module-user» не работал, как там админ определяется не знаю. В ‘isSuperuser’ =>’ ‘ вы можете записать php выражение, которое определяет что текущий пользователя является админом. У меня это так: ‘isSuperuser’ => ‘Yii::app()->user->checkAccess(«admin.comment.*»)’, использую модуль для управления ролями пользователей: https://github.com/crisu83/yii-auth
Не подтягиваетса СSS http://hkar.ru/DvVA
FA и Bootstrap я специально не включал в модуль. Вы можете подключить их отдельно.
Я так понял yiibooster через composer нужно установить?
А для чего вам yiibooster?
Если вы хотите подключить стили Bootstrap и иконки FontAwesome, вы можете сделать это, скачав и подключив соответствующие библиотеки.
Поставил через composer в папку protected, все пункты установки выполнил. Вывожу на странице.
Выдает ошибку: «string(3) «123» Fatal error: Class ‘CommentsWidget’ not found in /var/www/keramo/data/www/xn--80aaigshqkgre1a.xn--p1ai/protected/libs/yii/web/CWidgetFactory.php on line 148 «.
Я понял , что проблема с namespace не подскажите как устранить?
файл «protected/vendor/pendalf89/yii_commentator/extensions/comments_widget/CommentsWidget.php»
<?php
namespace application\vendor\pendalf89\yii_commentator\extensions\comments_widget;
use Yii;
use application\vendor\pendalf89\yii_commentator\models\Comment as Comment;
var_dump('123');
class CommentsWidget extends \CWidget
Игрался с разными путями, но чет не работает. Версия yii 1.1.7, php 5.3.
Поставьте composer не в protected, а на директорию выше (на один уровень с приложением).
«namespace APPLICATION\vendor\pendalf89….» — application — это корень приложения, поэтому и не находит.
Спасибо!
Здравствуйте Борис!
Спасибо за замечательный модуль! Прошу Вашей помощи. Вываливается ошибка:
Call to a member function loadUser() on a non-object in F:\OpenServer\modules\php\PHP-5.4\vendor\pendalf89\yii-commentator\extensions\comments_widget\views\form.php on line 15
Если убираю код на 15 линии:
getModule(‘comments’)->loadUser() ) : ?>
то страница отрисовывается. Но в админку не получается войти:
Не определено свойство «EditModule.comments».
Такое ощущение, что где-то, что-то не подгружается, но не могу понять что не так!
С уважением, Наталья
Здравствуйте Наталья!
Рад, что вам понравился модуль!
Похоже на то, что сам модуль не загрузился. Проверьте ваш конфиг.
Спасибо, что нашли время ответить!
В конфиге:
‘comments’ => array(
‘class’ => ‘pendalf89\yii_commentator\CommentsModule’,
‘userModelClass’ => »,
‘isSuperuser’ => ‘!Yii::app()->user->isGuest’,
),
‘aliases’ => array(
‘comments’ => realpath(dirname(__FILE__) . ‘/../..’) . ‘/vendor/pendalf89/yii-commentator/’,
),
Модуль лежит в папке vendor на одном уровне с protected.
Вот этот блок:
‘comments’ => array(
‘class’ => ‘pendalf89\yii_commentator\CommentsModule’,
‘userModelClass’ => »,
‘isSuperuser’ => ‘!Yii::app()->user->isGuest’,
),
лежит в ‘modules’ ?
А этот:
‘aliases’ => array(
‘comments’ => realpath(dirname(__FILE__) . ‘/../..’) . ‘/vendor/pendalf89/yii-commentator/’,
),
На одном уровне с ‘modules’?
Запуталась!
Значит надо содержимое папки «pendalf89» положить в ‘modules’, и в тоже время ее же в папке vendor положить в «protected»?
Нет-нет! Вы не поняли, папки вы расположили правильно. Просто я хочу убедиться, что вы правильно написали конфиг, можете показать весь конфиг?
Конфиг
// autoloading model and component classes
‘import’=>array(
‘application.models.*’,
‘application.components.*’,
),
‘modules’=>array(
‘comments’ => array(
‘class’ => ‘pendalf89\yii_commentator\CommentsModule’,
‘userModelClass’ => »,
‘isSuperuser’ => ‘!Yii::app()->user->isGuest’,
),
),
‘aliases’ => array(
‘sphinx’ => Yii::getPathOfAlias(«ext.yii-sphinx.sphinx»),
‘comments’ => realpath(dirname(__FILE__) . ‘/../..’) . ‘/vendor/pendalf89/yii-commentator/’,
),
‘log’=>array(
‘class’=>’CLogRouter’,
‘routes’=>array(
array(
‘class’=>’CFileLogRoute’,
‘levels’=>’error, warning’,
),
),
),
),
);
Конфиг в норме.
А 2 и 4 пункты из инструкции выполнил? Если да, то советую поставить модуль на чистую версию yii или скачать пример установленного модуля (см. ссылки в конце статьи) и посмотреть как сделано там.
Спасибо, буду думать!
Борис, здравствуйте!
Уже на последнем этапе подключения модуля! На локальном сервере все прекрасно работает, а на боевом столкнулась с такой проблемой — когда пользователь нажимает на кнопку отправить комментарий запрос улетает create
200 OK,
потом второй create
Request Headers
Provisional headers are shown
Accept:application/json, text/javascript, */*; q=0.01
и через некоторое время второй create становиться
Request Method:POST
Status Code:500 Internal Server Error
Куда копать? Похоже не приходит ответ сервера json
Не появляется модальное окно с информацией, что комментарий улетел. Помогите, пожалуйста!!!
Здравствуйте!
Попробуйте включить дебаг-режим в yii и посмотреть в консоле хрома что приходит в 500 ошибке.
АААА! Победила! Не отправлялось письмо админу и поэтому видимо был притык! Спасибо!!!
Не за что) Рад, что у вас получилось!
Кто подскажет, как вывести первый комментарий реверсом?( задом:) ) в данном виджете
Доброго времени суток! Не приходят оповещения на почту администратору о поступлении новых комментариев, также не приходят оповещения о новых комментариях на странице, куда копать?