Модуль Расширенные комментарии

WSCHUDO

Постоялец
Регистрация
17 Окт 2016
Сообщения
83
Реакции
77
Модуль Расширенные комментарии

Добавляем необходимые столбцы в БД.


Код:
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/...
 

Вложения

  • comments_simpla.zip
    12,1 KB · Просмотры: 28
Назад
Сверху