Комментарии (модуль phpFOX 3)

Форум поддержки движка социальной сети phpFOX.
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Комментарии (модуль phpFOX 3)

Сообщение Slash » Чт окт 15, 2015 1:16 pm

В 3.8.0 версии (у меня такая) и в более ранних версиях есть модификация комментирования всего подряд (фото, видео, статусов и так далее). У меня изначально иерархия комментариев шла в один столбик, коммент за комментом, да вроде все правильно. Но если надо ответить на комментарий, после которого уже не один десяток комментов? Может получиться непонятный разговор.
Что бы непонятных разговоров не могло быть, разве, что по чьей то глупости, разработчики движка phpFOX добавили к комменту кнопку Ответить, то есть можно комментировать комментарий (тафтология какая та...) и ответ на комментарий будет находится под тем комментарием, на который был дан ответ.

Включается это чудо в администраторском разделе, в настройках комментариев, эти настройки находятся по адресу: site/index.php?do=/admincp/setting/edit/module-id_comment/, опция Thread Display:
If set to True comments will be displayed in a thread format allowing users to reply to specific comments instead of the general item they are commenting on.

Переводим опцию Thread Display в True, сохраняем и после этого дерево комментариев будет выглядеть примерно так:

Комментарии модуль phpFOX 3  - Комментарии.jpg
Комментарии модуль phpFOX 3 - Комментарии.jpg (34.03 КБ) 622 просмотра

Спасибо за внимание.
Надеюсь пост был для Вас полезным.
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Комментарии (модуль phpFOX 3)

Сообщение Slash » Чт дек 24, 2015 6:14 pm

Увеличить количество символов в комментариях
Изначально в движке phpFOX 3 комментарии на стене имеющие более 300 символов, отображаются не полностью. Отображается 300 символов, что бы увидеть остальные символы необходимо нажать на кнопку развернуть. Мне показалось, что 300 символов маловато и увеличил. Делал так:
Открываем: module/comment/template/default/block/mini.html.php, находим строку (у меня она под номером 46):

Код: Выделить всё

            {$aComment|user:'':'':30}<div id="js_comment_text_{$aComment.comment_id}class="comment_mini_text {if $aComment.view_id == '1'}row_moderate{/if}">{$aComment.text|feed_strip|shorten:'300':'comment.view_more':true|split:30|max_line}</div

и здесь shorten:'300' меняем число 300, на то, сколько Вам угодно. Я заменил на 500.
После внесенных правок, необходимо почистить кеш движка.
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Комментарии (модуль phpFOX 3)

Сообщение Slash » Сб янв 02, 2016 10:11 am

Перенос новой строки в комментариях
Если установить опцию Allow HTML на false (настройки core: admincp/setting/edit/module-id_core/), то перенос на новую строку не будет учтен, там, где он был добавлен при наборе текста. Пользователи говорят, что это не хорошо, там где должен быть перенос, там получается два слова слитно...
Я решил эту проблему таким образом:
Открываем: module/comment/include/service/comment.class.php, находим:

Код: Выделить всё

        list($iCnt$aRows) = $this->get('cmt.*', array('AND cmt.comment_id = ' $iId), 'cmt.time_stamp DESC'011); 

Ниже строчкой добавляем:

Код: Выделить всё

        $aRows[0]['text'] = nl2br($aRows[0]['text']); 

Далее находим:

Код: Выделить всё

                    $aFeedComments[$iFeedCommentKey]['children'] = $this->_getChildren($aFeedComment['comment_id'], $sType$iItemId$iCommentId); 

Ниже строчкой добавляем:

Код: Выделить всё

                    $aFeedComments[$iFeedCommentKey]['text'] = nl2br($aFeedComments[$iFeedCommentKey]['text']);  

Готово. Возможно потребуется очистить кэш.
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Комментарии (модуль phpFOX 3)

Сообщение Slash » Вс фев 21, 2016 9:15 am

Вчера опять копался с комментами. У комментов четыре таблицы phpfox_comment, phpfox_comment_hash, phpfox_comment_rating и phpfox_comment_text. Таблицы phpfox_comment и phpfox_comment_text должны иметь одинаковое количество записей, при добавлении коммента, добавляется запись в две эти таблицы, в phpfox_comment - какому каналу принадлежит коммент, кем написан и когда, количество лайков и так далее, в phpfox_comment_text - сам текст коммента. Таблицы связаны по id (comment_id), идентификатор таблиц должен идти синхронно. Я обнаружил, что в таблице phpfox_comment_text на несколько записей больше, чем в таблице phpfox_comment, что не правильно ( возможно я придираюсь, но не нравится мне мусор в системе ). Искать лишние записи среди тысячи записей в ручную - проблематично, к тому же легко ошибиться и удалить не то, что нужно было. Я написал небольшой инструмент, который находит id лишних записей.
Вот код:

Код: Выделить всё

<?php 
$dbhost    
= '';
$dbuser    = '';
$dbpasswd  = '';
$dbname    = '';

$connect = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname);
if (!$connect)
{
    exit(mysqli_connect_error($connect));
}

$q = 'SELECT comment_id
    FROM phpfox_comment'
;
$comment = mysqli_query($connect, $q);

$q = 'SELECT comment_id
    FROM phpfox_comment_text'
;
$comment_text = mysqli_query($connect, $q);

$t_comment = array();
while(
$row = mysqli_fetch_assoc($comment))
{
    $t_comment[] = $row['comment_id'];
}

$t_comment_text = array();
while(
$row = mysqli_fetch_assoc($comment_text))
{
    $t_comment_text[] = $row['comment_id'];
}

$diff = array_diff($t_comment, $t_comment_text);
echo 'Всего записей: ' . count($diff);
foreach ($diff as $record)
{
    echo '<br />' . $record;
}

Сохранить код в файле, например в inspection.php, залить его в корень сайт и перейти по адресу: site.ru/inspection.php. Скрипт выводит количество лишних записей и их id.
После первой проверки, следует заменить строку:

Код: Выделить всё

$diff = array_diff($t_comment, $t_comment_text);

На:

Код: Выделить всё

$diff = array_diff($t_comment_text, $t_comment);

И запустить скрипт ещё раз. ID записей, которых отобразит скрипт, можно удалить.

Ещё написал класс inspection, который делает, тоже самое, что код выше, но заменять уже ни чего не надо. Код класса:

Код: Выделить всё

class inspection
{
    private $db = null;    
    private $dbhost
;
    private $dbuser;
    private $dbpasswd;
    private $dbname;
    
    public function __construct
($dbhost, $dbuser, $dbpasswd, $dbname)
    {
        $this->dbhost   = $dbhost;
        $this->dbuser   = $dbuser;
        $this->dbpasswd = $dbpasswd;
        $this->dbname   = $dbname;

        $this->request();        
    
}

    private function connect($dbhost, $dbuser, $dbpasswd, $dbname)
    {
        $this->db = new mysqli($dbhost, $dbuser, $dbpasswd, $dbname);    

        if 
($this->db->connect_errno)
        {
            echo $this->db->connect_error;
            exit;
        }
        
        $this
->db->set_charset('utf8');    

        return $this
->db;        
    
}
    
    private function request
()
    {
        $link = $this->connect($this->dbhost, $this->dbuser, $this->dbpasswd, $this->dbname);
        $r1   = $link->query('SELECT comment_id FROM phpfox_comment');        
        $r2   
= $link->query('SELECT comment_id FROM phpfox_comment_text');
        
        if 
(!$r1 or !$r2)
        {
            echo 'The request failed.';
            exit;
        }

        $this->pull($r1, $r2);        
    
}

    private function pull($a, $b)
    {
        $t1 = array();
        while($row = $a->fetch_assoc())
        {
            $t1[] = $row['comment_id'];
        }

        $t2 = array();
        while($row = $b->fetch_assoc())
        {
            $t2[] = $row['comment_id'];
        }

        $this->compare($t1, $t2);        
    
}
    
    private function compare
($a, $b)
    {
        $diff1 = array_diff($a, $b);
        $diff2 = array_diff($b, $a);
        
        echo 
'Всего записей в первой таблицы: ' . count($a) . '<br />Всего записей во второй таблицы: ' . count($b);

        if ($diff1)
        {
            echo '<br />В таблице <strong>comment</strong> лишние записи под ID:';
            
            foreach 
($diff1 as $record)
            {
                echo '<br />' . $record;
            }
        }

        if ($diff2)
        {
            echo '<br />В таблице <strong>comment_text</strong> лишние записи под ID:';
            
            foreach 
($diff2 as $record)
            {
                echo '<br />' . $record;
            }
        }

        if (!$diff1 and !$diff2)
        {
            echo '<br />Лишних записей не найдено.';
        }            
    
}        
}

Вызвать класс так:

Код: Выделить всё

define('PHPFOX', true);
include(
'include/setting/server.sett.php');
$obj = new inspection($_CONF['db']['host'], $_CONF['db']['user'], $_CONF['db']['pass'], $_CONF['db']['name']);
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Комментарии (модуль phpFOX 3)

Сообщение Slash » Чт мар 03, 2016 5:20 pm

Если удаляем, какой то отдельный комментарий, который имеет ответы и лайки к ним, то будет удален только то коммент, на который была нажата кнопка удаления, все его ответы и лайки к ним остаются в базе, как мусор. Я пока, что исправил это так:
Открываю файл: module/comment/include/service/process.class.php, нахожу:

Код: Выделить всё

    public function delete($iId
    {        
        
// delete the feed as well
        
$sType $this->database()->select('type_id')
            ->
from(Phpfox::getT('comment'))
            ->
where('comment_id = ' . (int)$iId)
            ->
execute('getSlaveField');
        
        (
Phpfox::isModule('feed') ? Phpfox::getService('feed.process')->delete($sType, (int) $iId) : null);
        
        
$this->database()->delete(Phpfox::getT('comment'), "comment_id = " . (int) $iId);
        
$this->database()->delete(Phpfox::getT('comment_text'), "comment_id = " . (int) $iId);
        
$this->database()->delete(Phpfox::getT('comment_rating'), 'comment_id = ' . (int) $iId);
        ((
$sPlugin Phpfox_Plugin::get('comment.service_process_delete')) ? eval($sPlugin) : false);
    } 

И меняю на:

Код: Выделить всё

    public function delete($iId)
    {        
        
# delete the feed as well
        
$sType $this->database()->select('type_id')
            ->
from(Phpfox::getT('comment'))
            ->
where('comment_id = ' . (int) $iId)
            ->
execute('getSlaveField');
        
        (
Phpfox::isModule('feed') ? Phpfox::getService('feed.process')->delete($sType, (int) $iId) : null);

        
$this->database()->delete(Phpfox::getT('like'), 'type_id = \'feed_mini\' AND item_id = ' . (int) $iId);
        
$this->database()->delete(Phpfox::getT('comment'), 'comment_id = ' . (int) $iId);
        
$this->database()->delete(Phpfox::getT('comment_text'), 'comment_id = ' . (int) $iId);
        
$this->database()->delete(Phpfox::getT('comment_rating'), 'comment_id = ' . (int) $iId);
        
        ((
$sPlugin Phpfox_Plugin::get('comment.service_process_delete')) ? eval($sPlugin) : false);

        
$iCommentsLimb $this->database()->select('*')
            ->
from(Phpfox::getT('comment'))
            ->
where('parent_id = ' . (int) $iId)
            ->
execute('getRows');
        
        if (
$iCommentsLimb)
        {
            
$this->deletelimb($iCommentsLimb);
        }    
    }

    
# Удаление дерево комментов    
    
private function deletelimb($limb)
    {
        foreach (
$limb as $value)
        {
            
# Обновление счетчика комментов
            
Phpfox::getService('user.activity')->update($value['user_id'], 'comment''-');            
            
            if (
$value['total_like'])
            {
                
$this->database()->delete(Phpfox::getT('like'), 'type_id = \'feed_mini\' AND item_id = ' . (int) $value['comment_id']);
            }
                
            
$this->database()->delete(Phpfox::getT('comment'), 'comment_id = ' . (int) $value['comment_id']);
            
$this->database()->delete(Phpfox::getT('comment_text'), 'comment_id = ' . (int) $value['comment_id']);
            
$this->database()->delete(Phpfox::getT('comment_rating'), 'comment_id = ' . (int) $value['comment_id']);
            
            
$rows $this->database()->select('*')
                ->
from(Phpfox::getT('comment'))
                ->
where('parent_id = ' . (int) $value['comment_id'])
                ->
execute('getRows');            

            if (
$rows)
            {
                
$this->deletelimb($rows);
            }            
        }    
    }   

То есть "родную" функцию немного подправил и дописал ещё одну. Теперь функция delete() удаляет комментарий и его лайки, функция deletelimb() все ответы удаляемого комментария и их лайки, так же функция удалит ответы на ответы, в общем все дочерные комменты. Согласен с тем, что сильно "громоздка", получается много запросов, но как смог, возможно потом вернусь и допилю этот код.
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Комментарии (модуль phpFOX 3)

Сообщение Slash » Вт мар 22, 2016 11:49 am

Инструмент для синхронизации статистики количества написанных комментариев пользователем:

Код: Выделить всё

<?php
define
('PHPFOX'true); 
include(
'include/setting/server.sett.php');
$connect mysqli_connect($_CONF['db']['host'], $_CONF['db']['user'], $_CONF['db']['pass'], $_CONF['db']['name']);

$sql 'SELECT * FROM phpfox_user_activity';
$q mysqli_query($connect$sql);
while (
$record mysqli_fetch_assoc($q))
{
    
$sql 'UPDATE phpfox_user_activity 
        SET 
            activity_comment = 
            (
                SELECT COUNT(*)
                FROM phpfox_comment
                WHERE user_id = "' 
$record['user_id'] . '"
            )
        WHERE user_id = "' 
$record['user_id'] . '"';
    
$result mysqli_query($connect$sql);
    if (!
$result)
    {
        exit(
'Error.');
    }
    else
    {
        echo 
$record['user_id'] . ' Ok!<br />';
    }        

Сохранить код в файле tool.php, залить в корень сайта и запустить. После выполненной операции файл следует удалить.

Многие каналы, например: видео можно полностью удалить только с раздела видео, со стены можно удалить только его канал, но при этом недоработано так, что канал удаляется вместе с лайками канала - это не правильно. Немного подправил, заодно сделал удаление комментов для удаляемого канала, который удаляется полностью сразу со стены. !Необходим допил самих модулей.
Открыть: module/feed/include/service/process.class.php, найти:

Код: Выделить всё

            // Delete likes that belonged to this feed
            
$this->database()->delete(Phpfox::getT('like'), 'type_id = "'$aFeed['type_id'] .'" AND item_id = ' $aFeed['item_id']); 

Заменить на:

Код: Выделить всё

            # * * * * * * * * * * * * * * *
            # Разрешить удалять комментарии и лайки
            
$permit  true;

            
# Удаление ссылки
            
if ($aFeed['type_id'] == 'link')
            {
                
$aLinkFeed $this->database()->select('*')
                    ->
from(Phpfox::getT('link'))
                    ->
where('link_id = ' . (int) $aFeed['item_id'])
                    ->
execute('getRow');
                
                if (!
$aLinkFeed['module_id'] || $aLinkFeed['module_id'] == 'pages' && $aCallback['module'] == 'pages')
                {
                    
$type_id $aFeed['type_id'];
                    
$this->database()->delete(Phpfox::getT('link'), 'link_id = ' . (int) $aFeed['item_id']);
                }
                else
                {
                    
$permit false;
                }
            }
            
# END Удаление ссылки

            # Удаление комментария на странице (Таблица: pages_feed_comment)
            
else if ($aFeed['type_id'] == 'pages_comment')
            {
                if (
$aCallback['module'] == 'pages')
                {
                    
$type_id $aCallback['module'];
                    
$this->database()->delete(Phpfox::getT('pages_feed_comment'), 'feed_comment_id = ' . (int) $aFeed['item_id']);                    
                }
                else
                {
                    
$permit false;                    
                }
            }
            
# END Удаление комментария на странице (Таблица: pages_feed_comment)    

            # Удаление статуса пользователя (Таблица: user_status)
            
else if ($aFeed['type_id'] == 'user_status')
            {
                
$type_id $aFeed['type_id'];
                
$this->database()->delete(Phpfox::getT('user_status'), 'status_id = ' . (int) $aFeed['item_id']);            
            }
            
# End Удаление статуса пользователя (Таблица: user_status)            

            # Удаление Блог | Видео | Музыки | Сообщение форума | Фото
            
else if ($aFeed['type_id'] == 'blog'
                
|| $aFeed['type_id'] == 'music_song'            
                
|| $aFeed['type_id'] == 'forum_post'
                
|| $aFeed['type_id'] == 'photo'
                
|| $aFeed['type_id'] == 'video')
            {
                
$permit false;
            }
            
# Удаление Блог | Видео | Музыки | Сообщение форума | Фото            

            # Удаление комментариев и лайков (Таблицы: comment, comment_text, comment_rating, like)
            
if ($permit)
            {
                
# Тип канала
                
$type_id = isset($type_id) ? $type_id $aFeed['type_id'];

                
$this->database()->delete(Phpfox::getT('like'), 'type_id = \'' $aFeed['type_id'] . '\' AND item_id = ' . (int) $aFeed['item_id']);
                
                (
Phpfox::isModule('comment') ? Phpfox::getService('comment.process')->deleteForItem(null$aFeed['item_id'], $type_id) : null);
            }
            
# End Удаление комментариев и лайков (Таблицы: comment, comment_text, comment_rating, like)
            # * * * * * * * * * * * * * * * 

Вернуться в «phpFOX»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость