WSCHUDO
Постоялец
- Регистрация
- 17 Окт 2016
- Сообщения
- 83
- Реакции
- 77
- Автор темы
- #1
Модуль Расширенные комментарии
Добавляем необходимые столбцы в БД.
Правим файл api/Comments.php
Везде дополняем перечень полей:
Добавляем фильтр по parent id:
Добавляем генерацию дерева комментариев:
Правим файл api/Managers.php
Добавляем разрешения на новые функции (добавление и редактирование комментариев в админке)
Правим файл api/Notify.php
Добавляем функцию отправки уведомления пользователю при ответе на комментарий:
Правим файл simpla/IndexAdmin.php
Правим файл simpla/design/html/manager.tpl
Правим файл view/View.php
Правим файл design/default/html/product.tpl и design/default/html/post.tpl
Вместо комментариев и формы вставляем:
Настраиваем работу AJAX. Но это уже другая тема.
Все нужные файлы лежат в архиве. Идея в том, что форма комментариев и свежедобавленный комментарий запрашиваются аяксом у php-скриптов из директории /ajax/...
В ответ к нам приходит фетч темплейтов, которые лежат в папке с выбранной темой, например design/-theme-/html/view/ajax/...
Добавляем необходимые столбцы в БД.
Код:
ALTER TABLE s_comments
ADD COLUMN `parent` INT(11) NOT NULL AFTER `id`,
ADD COLUMN `email` VARCHAR(255) NOT NULL AFTER `name`,
ADD COLUMN `admin` bool NOT NULL,
ADD COLUMN `rate_up` INT(11) NOT NULL,
ADD COLUMN `rate_down` INT(11) NOT NULL;
Правим файл api/Comments.php
Везде дополняем перечень полей:
Код:
$query = $this->db->placehold("SELECT c.id, c.parent, c.object_id, c.name, c.email, c.ip, c.type, c.text, c.date, c.approved, c.admin, c.rate_up, c.rate_down .... ");
Добавляем фильтр по parent id:
Код:
//В блоке "Возвращает комментарии, удовлетворяющие фильтру", после строчки
$approved_filter = '';
//добавляем
$parent_filter = '';
if(isset($filter['parent']))
$parent_filter = $this->db->placehold("AND c.parent=?", intval($filter['parent']));
// В блоке "Количество комментариев, удовлетворяющих фильтру", после строчек
$approved_filter = '';
$keyword_filter = '';
//еще раз добавляем
if(isset($filter['parent']))
$parent_filter = $this->db->placehold('AND c.parent=?', intval($filter['parent']));
//далее, дополняем фильтр:
$query = $this->db->placehold("SELECT count(distinct c.id) as count FROM __comments c WHERE 1 $object_id_filter $type_filter $keyword_filter $approved_filter $parent_filter", $this->settings->date_format);
Добавляем генерацию дерева комментариев:
Код:
//В блоке "Возвращает комментарии, удовлетворяющие фильтру", вместо строчки
return $this->db->results();
//пишем
$comments = $this->db->results();
return $this->buildTree($comments);
//далее, сразу после
public function get_comment($id){}
//добавляем функцию
private function buildTree(array &$elements, $parentId = 0) {
$comments_tree = array();
foreach ($elements as $element) {
if ($element->parent == $parentId) {
$children = $this->buildTree($elements, $element->id);
if ($children) {
$element->children = $children;
}
$comments_tree[$element->id] = $element;
unset($elements[$element->id]);
}
}
return $comments_tree;
}
Правим файл api/Managers.php
Добавляем разрешения на новые функции (добавление и редактирование комментариев в админке)
Код:
public $permissions_list = array(... 'comment', 'comment_edit', ...);
Правим файл api/Notify.php
Добавляем функцию отправки уведомления пользователю при ответе на комментарий:
Код:
public function email_comment_user($comment_id)
{
if(!($comment = $this->comments->get_comment(intval($comment_id))))
return false;
if($comment->type == 'product')
$comment->product = $this->products->get_product(intval($comment->object_id));
if($comment->type == 'blog')
$comment->post = $this->blog->get_post(intval($comment->object_id));
$user_comment = $this->comments->get_comment(intval($comment->parent));
$this->design->assign('comment', $comment);
$this->design->assign('user_comment', $user_comment);
$this->design->assign('name', $user_name);
// Отправляем письмо
$email_template = $this->design->fetch($this->config->root_dir.'design/'.$this->settings->theme.'/html/comments/email_comment_user.tpl');
$subject = $this->design->get_var('subject');
$this->email($user_comment->email, $subject, $email_template, $this->settings->notify_from_email);
}
Правим файл simpla/IndexAdmin.php
Код:
private $modules_permissions = array(
...
'CommentAdmin' => 'comment',
'CommentEditAdmin' => 'comment_edit',
...
);
Правим файл simpla/design/html/manager.tpl
Код:
$perms = [...
'comment' => 'Ответ на комментарии',
'comment_edit' => 'Редактирование комментариев',
...];
Правим файл view/View.php
Код:
//добавляем новый плагин (место очевидно)
$this->design->smarty->registerPlugin("function", "get_comments", array($this, 'get_comments_plugin'));
//код плагина
public function get_comments_plugin($params, &$smarty)
{
if(!isset($params['approved']))
$params['approved'] = 1;
if(!empty($params['var']))
$smarty->assign($params['var'], $this->comments->get_comments($params));
}
Правим файл design/default/html/product.tpl и design/default/html/post.tpl
Вместо комментариев и формы вставляем:
Код:
<div class="ajax-content" data-url="ajax/comment.form.php?parent=0&type=product&object_id={$product->id}"></div>
{include file="comments/comments.tpl"}
Настраиваем работу AJAX. Но это уже другая тема.
Все нужные файлы лежат в архиве. Идея в том, что форма комментариев и свежедобавленный комментарий запрашиваются аяксом у php-скриптов из директории /ajax/...
В ответ к нам приходит фетч темплейтов, которые лежат в папке с выбранной темой, например design/-theme-/html/view/ajax/...