1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Вариант вывода последних тем с форума на сайт DLE с модификациями: исключение из показа тем и т.д.

Тема в разделе "Made in XF-Russia.ru", создана пользователем korikus, 20.11.2014.

Загрузка
  1. korikus

    korikus Местный

    Регистрация:
    22.10.14
    Сообщения:
    59
    Симпатии:
    34
    Версия XF:
    1.4.2
    Вывод последних тем и сообщений с форума на ДЛЕ

    Решил запостить отдельную тему поскольку информации много.

    За основу вывода на сайте DLE последних тем с форума взят вот этот модуль

    Основные вопросы по данному модулю касались:
    - кеширования вывода информации
    - отсутствия возможности указания форумов/тем которые не надо выводить в этом блоке
    - нарушение кодировки в блоке вывода

    Скачав архив вы найдете в нем измененный файл run.php
    Остальные файлы я не трогал.
    Копирайты не менял.

    Установка

    1
    Поместить папку xf_topics по адресу: /engine/modules/xf_topics/

    2
    В шаблон main.tpl в нужное место вставьте следующий код:

    {include file="/engine/modules/xf_topics/run.php"}.


    Внесенные в файл модификации:
    - Добавлены параметры для указания форумов и тем, которые должны быть исключены из показа неа сайте в блоке последних тем.
    Эти строки находятся в файле run.php:

    PHP:
     $config['blacklist']['categories'] = array(1,2); // id конкретного ФОРУМА который вы не хотите показывать в блоке на сайте. Дочерняя категория не выводятся также. (Дочерняя дочерней - выводится). Скобки могут быть пустыми
      
    $config['blacklist']['threads'] = array(5,7); // id конкретной ТЕМЫ форума. Скобки могут быть пустыми
    Модификации

    #########
    ### 1 ####
    #########

    Модификация для предотвращения кеширования вывода последних тем и сообщений с форума на сайте.

    #######################################################################################################################

    Проблема:
    Когда пользователь вносит изменения на форуме: создает темы, пишет посты... эта информация не сразу появляется на сайте.
    Может пройти довольно много времени, прежде чем она появится в блоке.

    Решение:

    В одном из сообщений предлагалось просто закоментировать строку:
    PHP:
    if ($config['allow_cache'] != "yes") {$config['allow_cache'] = "yes";$is_change true;}
    Лично мне это не помогло.

    А вот ниже приведенный вариант помог решить проблему:

    ###### 1 #####
    В файле /library/XenForo/ControllerPublic/Thread.php ищем:

    476 строка
    PHP:
       public function actionAddReply()
       {
    После фигурной скобки вставляем:

    PHP:
    //## Обновление последних постов.
    $target glob(__DIR__.'/engine/cache/xf_topics_*.tmp');
    @
    unlink((string)$target[0]);
    //## Конец

    ###### 2 #####

    В файле /library/XenForo/ControllerPublic/Forum.php ищем:

    583 строка
    PHP:
       public function actionAddThread()
       {
    После фигурной скобки вставляем:
    PHP:
    //## Обновление последних постов.
    $target glob(__DIR__.'/engine/cache/xf_topics_*.tmp');
    @
    unlink((string)$target[0]);
    //## Конец
    После этого надо обязательно удалить файл кеша из папки /engine/cache/xf_topics_******.tmp

    #####################################

    ЕСЛИ НЕ ЗАРАБОТАЛО

    #####################################

    Если ваш форум установлен в отдельной папке, на поддомене или выше приведенный вариант вдруг не сработал, то надо прописать абсолютный путь от корня сайта самостоятельно.
    Т.е. вид строки:
    PHP:
    $target glob(__DIR__.'/engine/cache/xf_topics_*.tmp');
    Должен быть такой:
    PHP:
    $target glob('/ПУТЬ_ОТ_КОРНЯ_САЙТА/engine/cache/xf_topics_*.tmp');
    Как узнать ваш абсолютный путь на сайте?
    1
    Спросить у хостера.

    2
    Узнать самому, а именно:
    - надо создать файл php например с именем 1.php (или любым другим) с таким содержимым:

    PHP:
    <?php
    echo $_SERVER['DOCUMENT_ROOT'];
    ?>
    и сохранить его на своем сервере в корневой папке где установлен ваш форум и запускаем в строке браузера:
    www.ваш-сайт.ру/1.php

    или (если форум в папке)
    www.ваш-сайт.ру/forum/1.php

    Получаем искомый абсолютный путь от корня например такого вида:
    /home/kurup/bobyor/moy_sait/public_html

    и эту строку вставляем в наш код.

    И получится что то типа такого:
    PHP:
    $target glob('/home/kurup/bobyor/moy_sait/public_html/engine/cache/xf_topics_*.tmp');
    В этом случае проблема с кешированием будет решена.
    Однако жестко прописанный путь не всегда есть хорошо.
    Сегодня вы на одном хостинге - завтра на другом... что то забудется и в результате файл будет работать некорректно.

    Так что можно подобрать "автоматический вариант" подстановки абсолютного пути...
    Это правда займет больше времени и каждый раз надо будет удалять файл кеша пока идет настройка... но оно того стоит.

    Ниже будет представлено несколько таких вариантов... можете поэксперементировать...

    #########
    ### 2 ####
    #########

    Предотвращение кеширования вывода информации о количестве ответов в теме

    Проблема:
    если пользователи добавляют/удаляют сообщения в теме, то они не отображаются сразу в таблице последних сообщений с форума на сайте.

    Решение:
    ###########################################################
    Открыть файл /librari/XenForo/ModeratorLogHandler/Post.php

    Найти:
    PHP:
       protected function _log(array $logUser, array $content$action, array $actionParams = array(), $parentContent null)
       {
    После поставить:

    PHP:
    //## Обновление последних постов.
    $target glob(__DIR__.'/engine/cache/xf_topics_*.tmp');
    @
    unlink((string)$target[0]);
    //## Конец

    #########
    ### 3 ####
    #########

    Предотвращение кеширования вывода информации об удаленной теме

    То же самое что и выше... только в отношении тем.
    ####################################################

    Открыть файл /librari/XenForo/ModeratorLogHandler/Thread.php

    Найти:
    PHP:
       protected function _log(array $logUser, array $content$action, array $actionParams = array(), $parentContent null)
       {
    После поставить такой же код, что и в примере выше:

    PHP:
    //## Обновление последних постов.
    $target glob(__DIR__.'/engine/cache/xf_topics_*.tmp');
    @
    unlink((string)$target[0]);
    //## Конец
    В случае если не обновление модуля на сайте не заработало, то необходимо прописать абсолютный путь вручную, о чем было сказано выше.


    После внесения всех необходимых изменений в файлы идем на сервере в папку кеша где установлен ваш DLE: /engine/cache/ и удаляем нафиг файл начинающийся с xf_topics_****куча букв***.tmp

    После этого обновляем главную страницу сайта, где установлен блок вывода последних тем с форума и проверяем все еще раз.
    После внесения изменений на форуме и обновлении страницы сайта информация в блоке должна меняться сразу.


    #################################################################
    #################################################################

    Возможная замена кода от корня сайта прописанного вручную на автоматический вариант.
    Их может быть несколько и некоторые из них могут не работать лично у вас.
    Поскольку многое зависит от конкретных настроек у вашего хостера.

    Лично у меня заработал только самый последний "универсальный " вариант кода.
    Ну и жестко прописанный вручную - тоже.

    Итак... жестко прописанный путь от корня сайта:

    1
    PHP:
    //##Обновление последних постов.
    $target glob('/home/kurup/bobyor/moy_sait/public_html/engine/cache/xf_topics_*.tmp');
    @
    unlink((string)$target[0]);
    //##Конец
    можно поменять на:

    2
    PHP:
    //## Обновление последних постов.
    $target glob(__DIR__.'/engine/cache/xf_topics_*.tmp');
    @
    unlink((string)$target[0]);
    //## Конец
    или на

    3
    PHP:
    //##Обновление последних постов.
    $target glob('../engine/xf_topics_*.tmp');
    if(
    sizeof($target)==0$target glob('../WWW/engine/xf_topics_*.tmp');
    if(
    sizeof($target)!=0)
      @
    unlink((string)$target[0]);
    //##Конец
    или на

    4
    PHP:
    //##Обновление последних постов.
    $target glob($_SERVER['DOCUMENT_ROOT'].'/engine/xf_topics_*.tmp');
    if(
    sizeof($target)==0$target glob(substr($_SERVER['DOCUMENT_ROOT'], 0strlen(end(explode("/"$_SERVER['DOCUMENT_ROOT'])))*-1).'/WWW/engine/xf_topics_*.tmp');
    if(
    sizeof($target)!=0)
    @
    unlink((string)$target[0]);
    //##Конец
    или на универсальный вариант
    или на:
    5
    PHP:
    //##Обновление последних постов.
    $target glob($_SERVER['DOCUMENT_ROOT'].'/engine/xf_topics_*.tmp');
    if(
    sizeof($target)==0)
    {
    $clearDom explode("/"$_SERVER['DOCUMENT_ROOT']);
    $target glob(substr($_SERVER['DOCUMENT_ROOT'], 0strlen(end($clearDom))*-1).'/WWW/engine/xf_topics_*.tmp');
    }
    if(
    sizeof($target)!=0)
    @
    unlink((string)$target[0]);
    //##Конец
    Если форум не в корне сайта или на поддомене, то это универсальный вариант.

    Совет:

    Если при создании ответа на вы получаете ошибку типа:
    PHP:
       XenForo_Application::handlePhpError() in XenForo/ControllerPublic/Thread.php at line 484
      XenForo_ControllerPublic_Thread
    ->actionAddReply() in XenForo/FrontController.php at line 347
      XenForo_FrontController
    ->dispatch() in XenForo/FrontController.php at line 134
      XenForo_FrontController
    ->run() in /home/kurup/bobyor/moy_sait/public_html/forum/index.php at line 13
    То попробуйте подобрать вариант кода из выше перечисленных.
    В крайнем случае всегда можно жестко прописать код от корня вручную.



    #################################################################

    У кого проблема с кодировкой UTF и вывод производится в виде ?????????

    #################################################################

    Единственный вариант, который помог лично мне:

    В файле run.php после строки:
    PHP:
    mysql_select_db($config['db']['dbname']);
    вставить:
    PHP:
    mysql_query("SET NAMES 'utf8'"); 
     

    Вложения:

    • xenForo-DLE.zip
      Размер файла:
      5,3 КБ
      Просмотров:
      24
    p4elka, Kolya groza morey и Mirovinger нравится это.
  2. p4elka

    p4elka Новичок

    Регистрация:
    10.06.14
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.3.2
    Подскажите пож. как сделать, чтоб выводимые темы отображались не по центру а по левому краю
     
  3. korikus

    korikus Местный

    Регистрация:
    22.10.14
    Сообщения:
    59
    Симпатии:
    34
    Версия XF:
    1.4.2
    В стилях оформления вывода таблицы смотрите.
    Параметр align
     
  4. p4elka

    p4elka Новичок

    Регистрация:
    10.06.14
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.3.2
    Спасибо! помогло - поменял на left.
    Сопутствующий вопрос - еще бы отступ в пару пикселей сделать от таблицы самого уже текста который щас стал слева в несколько пикселей ?
    И саму табличку расширить по пикселях ато больно уж она маленькая - не красиво смотрится
     
  5. korikus

    korikus Местный

    Регистрация:
    22.10.14
    Сообщения:
    59
    Симпатии:
    34
    Версия XF:
    1.4.2
    Вам надо освежить в памяти свойства HTML

    Смотрите параметры отступов как внешних, так и внутренних:
    HTML:
    padding: 3px;
    margin:  3px;
    Это я для примера привел только... смотрите на результат сами...
     
  6. p4elka

    p4elka Новичок

    Регистрация:
    10.06.14
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.3.2
    Все бы хорошо да я "неук" в этих делах - мне бы на пальцах обьяснить. Огромнейшее спасибо!
    --- добавлено : 2 дек 2014 в 14:38 ---
    С отступами разобрался.

    И еще вопрос может кто подскажет - нужно чтоб при нажатии уже выведенных тем а также разделов на сайте - при переходе они открывались в новой вкладке а не в той же. А то получается пользователь жмет и переходит сразу на форум и сайт закрывается
     
    Последнее редактирование модератором: 10.12.2014
  7. korikus

    korikus Местный

    Регистрация:
    22.10.14
    Сообщения:
    59
    Симпатии:
    34
    Версия XF:
    1.4.2
    В ссылке <a href вставьте атрибут target="_blank"

    PS
    Учите основы HTML

    PS2
    Всегда можно открыть исходный код и посмотреть реализацию... и сделать по аналогии..
     

Поделиться этой страницей