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

koris

Проверенные
Сообщения
113
Реакции
82
Баллы
5,525
Вывод последних тем и сообщений с форума на ДЛЕ
Решил запостить отдельную тему поскольку информации много.
За основу вывода на сайте 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'];
?>
и сохранить его на своем сервере в корневой папке где установлен ваш форум и запускаем в строке браузера:

или (если форум в папке)


Получаем искомый абсолютный путь от корня например такого вида:
/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'], 0, strlen(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'], 0, strlen(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 KB · Просмотры: 15
Если я правильно понял,то выводятся темы которые создались на ксене?
 
Конечно.
Это вывод последних тем и сообщений с форума xenforo на сайте DLE
Вот скрин... только я таблицу под себя переделывал...
111-1.jpg
В самом архиве не модифицированные исходники...
Только внесенные изменения как описано выше.
 
Последнее редактирование:
  • Мне нравится
Реакции: Hope
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу