<?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>