Портал / новостная страница

Freakmeister

Проверенные
Сообщения
9
Реакции
4
Баллы
3,300
Уже есть какие-то плагины портала для XF 2.x.x? Я мог бы сам написать простенький новостной фид, но как прикрутить к интерфейсу XF возможность помечать нужные темы как новостные - понятия не имею.
 
Последнее редактирование:
Вышел из положения. Тут ведь есть теги, а значит можно пометить нужные темы тегом "news" например и вывести их на главную страницу следующим образом. Главная страница, естессна, должна лежать в корне сайта, а форум в папке /forum. И в настройках форума нужно выставить Board URL на .

PHP:
<?php
/**
* Заготовка под портал для XenForo 2.x.x
* @author Freakmeister
*/
class XF_Portal {
    private $db;
    function __construct() {
        ini_set('display_startup_errors',1);
        ini_set('display_errors',1);
        error_reporting(E_ERROR | E_WARNING | E_PARSE);
       
        $this->db = $this->connect_db();
    }
   
    /**
     * Конектимся к БД сами, потому что нафиг XenForo
     * @return mysqli - db link
     */
    private function connect_db() {
        require("forum/src/config.php");
        $db = mysqli_connect($config['db']['host'], $config['db']['username'], $config['db']['password'], $config['db']['dbname']);
        if (mysqli_connect_errno()) {
            die('Не удалось подключиться к базе данных'.mysqli_connect_error());
        }
        if (!mysqli_set_charset($db, "utf8")) {
            die('Ошибка базы данных'.mysqli_error($db));
        }
        $mfunny_db = $db;
        return $db;
    }
   
    /**
     * Обычная mysqli_query с упращённым синтаксисом
     * @param $query - SQL-запрос
     * @return bool|mysqli_result
     */
    private function query($query) {
        return mysqli_query($this->db, $query);
    }
   
    /**
     * Обычное экрнирование с упращённым синтаксисом
     * @param $text - строка
     * @return string
     */
    private function escape($text) {
        return mysqli_real_escape_string($this->db, $text);
    }
   
    /**
     * Конвертор из локального времени в Гринвич
     * @param $date - Дата в формате Y-m-d H:i:s
     * @param string $format - Выходной формат
     * @return string
     */
    private function local_to_utc($date, $format = 'Y-m-d H:i:s') {
        // предохранитель от кривых рук
        if (!substr_count($date, ' ')) {
            $date .= ' 12:00:00';
        }
       
        $date = new DateTime($date, new DateTimeZone('Europe/Moscow'));
        $time_zone = new DateTimeZone('UTC');
       
        $date->setTimezone($time_zone);
        return $date->format($format);
    }
   
    /**
     * Конвертор из Гринвича в локальное время.
     * @param $date - Дата в формате Y-m-d H:i:s
     * @param string $format - Выходной формат
     * @return string
     */
    private function utc_to_local($date, $format = 'Y-m-d H:i:s') {
        // предохранитель от кривых рук
        if (!substr_count($date, ' ')) {
            $date .= ' 12:00:00';
        }
       
        $date = new DateTime($date, new DateTimeZone('UTC'));
        $time_zone = new DateTimeZone('Europe/Moscow');
       
        $date->setTimezone($time_zone);
       
        return $date->format($format);
    }
   
    /**
     * Unixtime в читабельный формат
     * @param $timestamp
     * @param bool $to_local - если нужно конвертнуть в локальное время
     * @return false|string
     */
    private function timestamp_to_date($timestamp, $to_local=false, $format = 'Y-m-d H:i:s') {
        if ($to_local) {
            $date = date('Y-m-d H:i:s', $timestamp);
            $date = $this->utc_to_local($date, $format);
        } else {
            $date = date($format, $timestamp);
        }
        return $date;
    }
   
    /**
     * Вывод дат в читабельный формат
     * @param $date_in - Дата в форматах Y-m-d H:i:s или Y-m-d
     * @param string $format - Выходной формат
     * @param bool $gmt_offset - Нужно ли перевести из Гринвича в локальное время
     * @return string
     */
    private function date_format($date_in, $format = 'full', $gmt_offset = false) {
        // конвертируем из формата XF
        $date_in = $this->timestamp_to_date($date_in, $gmt_offset, 'Y-m-d H:i:s');
       
        $_LANG = array();
        $_LANG['01'] = 'января';
        $_LANG['02'] = 'февраля';
        $_LANG['03'] = 'марта';
        $_LANG['04'] = 'апреля';
        $_LANG['05'] = 'мая';
        $_LANG['06'] = 'июня';
        $_LANG['07'] = 'июля';
        $_LANG['08'] = 'августа';
        $_LANG['09'] = 'сентября';
        $_LANG['10'] = 'октября';
        $_LANG['11'] = 'ноября';
        $_LANG['12'] = 'декабря';
       
        list($date, $time) = explode(' ', $date_in);
        list($year, $month, $day) = explode('-', $date);
        if ($time) {
            list($hour, $minute, $sec) = explode(':', $time);
        } else {
            $hour = $minute = $sec = '00';
        }
       
        switch ($format) {
            case 'full':
                $month = $_LANG[$month];
                $date_in = $day.' '.$month.' '.$year.', '.$hour.':'.$minute;
            break;
            case 'compact':
                $month = $_LANG[$month];
                $date_in = $day.' '.$month.' '.$year.' г.';
            break;
        }
       
        return $date_in;
    }
   
    /**
     * Вытаскиваем из XenForo топики, помеченные тегом news
     * @param page - номер страницы
     * @return string
     */
    function get_last_news($page) {
        $per_page = 10; // количество новостей на страницу
       
        $query = $this->query("SELECT COUNT(`thread_id`) AS `numb` FROM `xf_thread` WHERE CONVERT(`tags` USING utf8) LIKE '%news%'");
        $row = mysqli_fetch_array($query, MYSQLI_ASSOC);
        $num_pages = ceil($row['numb'] / $per_page);
        $limit = $per_page * ($this->escape($page) - 1).', '.$per_page;
        $limit_str = "LIMIT $limit";
       
        $content = '';
        $query = $this->query("SELECT * FROM `xf_thread` WHERE CONVERT(`tags` USING utf8) LIKE '%news%' ORDER BY `post_date` DESC $limit_str");
        while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
            $content .= '<h3>'.$row['title'].'</h3>';
            $query2 = $this->query("SELECT * FROM `xf_post` WHERE `post_id`={$row['first_post_id']}");
            $row2 = mysqli_fetch_array($query2, MYSQLI_ASSOC);
            $content .= '
            <article>'.$row2['message'].'</article>
            <p>Автор: '.$row2['username'].'. Дата: '.$this->date_format($row['post_date']).'</p>
            <hr>';
        }
        return $content;
    }
}
$portal = new XF_Portal();
?><!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta content="width=device-width, initial-scale=1" name="viewport">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Testytest</title>
</head>
<body>
    <?= $portal->get_last_news(1); ?>
</body>
</html>
 
Последнее редактирование:
вот кстати в документации как раз и расказывается как создать простой портал. Там же можно и скачать сам плагин.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу