<?php
namespace App\Controllers;
use \App\Model\MenuModel;
use \App\Mse;
class Controller1
{
public static $instance;
public $menu;
public $seoTags = [];
public $breadcrumbs = [];
public $error;
public $results;
public $MSE;
public function __construct ()
{
$this->MSE = Mse::getInstance();
$this->loadMenu();
}
# Загрузка шаблона для текущего контроллера и отрисовка страницы
public function loadViews ($data = NULL, $template_name = NULL)
{
$data['menu'] = $this->menu;
$data['breadcrumbs'] = $this->getBreadcrumbs();
$data['seo'] = $this->seoTags;
$this->MSE->loadTemplate($this->MSE->smarty, mb_strtolower($template_name ?? $this->MSE->controller), $data);
}
/**
* Получение списка хлебных крошек для вывода на страницу
*
* @return array
*/
public function getBreadcrumbs ()
{
$main_crumb[] = [
'link' => '/',
'title' => 'Главная'
];
return count($this->breadcrumbs) ? array_merge($main_crumb, $this->breadcrumbs) : false;
}
/**
* Добавление элемента хлебных крошек
*
* @param array $crumb - Массив с данными о элементе
*/
public function addBreadcrumbs (array $crumb)
{
$this->breadcrumbs[] = $crumb;
}
public function addSeoTags ($name, $value)
{
$this->seoTags[$name] = $value;
}
# Генерация ошибки
# Ввод: Идентификатор ошибки из конфига config_errors.php
# Вывод: Ошибка и остановка скрипта
# -----------------------------
public function createError($errorName)
{
$this->error = $this->MSE->setError($errorName);
# Кастомный header для текущей ошибки
if (isset($this->error['header']))
header($this->error['header']);
$data['ERROR'] = $this->error;
$this->addSeoTags('title', $this->error['title']);
$this->addSeoTags('description', $this->error['title']);
$this->addSeoTags('heading', $this->error['title']);
$this->loadViews($data, 'error');
exit;
}
# Генерация списка ключевых слов из результата парсинга
# Ввод: Результат парсинга
# Вывод: Список ключей, отсортированых по релевантности
# -----------------------------
public function getRandKeys ($data)
{
if (isset($data['tracks']) && is_array($data['tracks'])) {
# Наполнить массив $trackKeyArray исполнителями и названиями треков
$trackKeyArray = array();
foreach ($data['tracks'] as $trackItem) {
# Исполнитель и трек не должны быть больше 70 символов
if (strlen($trackItem['artist']['name'] . $trackItem['name']) < 70) {
$trackKeyArray[] = $trackItem['artist']['name'];
$trackKeyArray[] = $trackItem['name'];
}
}
return $this->createKeyWords($trackKeyArray);
}
}
# Генерация ключей для meta-keywords
# Из страницы выбираются все ключевые слова, очищаются, сортируются по вхождению на странице
#--------------------------------------
public function createKeyWords ($trackKeyArray)
{
$wordArray = array();
if (!$trackKeyArray)
return null;
# Делим ключи на отдельные слова
foreach ($trackKeyArray as $trackKey) {
$keyWords[] = explode(' ', $trackKey);
}
# Перебираем полученные ключи, очищаем от мусора
for ($i=0; $i < count($keyWords); $i++) {
foreach ($keyWords[$i] as $keyWord) {
if (strlen($keyWord) > 4) {
$keyWord = trim(htmlspecialchars($keyWord));
$wordArray[] = preg_replace('#\.|,|\(|\)#', '', $keyWord);
}
}
}
# Сортируем ключи по релевантности
$randKeyword = '';
$keyWordsCount = array_count_values($wordArray);
array_multisort($keyWordsCount, SORT_DESC);
$keyWords = array_keys($keyWordsCount);
for ($i = 0; $i < 10; $i++) {
if (isset($keyWords[$i])) {
$randKeyword .= $keyWords[$i] . ", ";
}
if (isset($keyWords[$i])) {
$randKeyword .= $keyWords[$i] . ", ";
}
return (substr($randKeyword, 0, strrpos($randKeyword, ', ')));
}
}
# Преобразование BB-codes в теги
# Ввод: Строка, содержащая BB-codes
# Вывод: Строка, содержащая валидные теги
public function convertBBcodes ($text)
{
return preg_replace($this->MSE->config_bbcodes['search'], $this->MSE->config_bbcodes['replace'], $text);
}
public function saveImage ($url)
{
# Проверка URL на корретность протокола
if (!preg_match('#(http|https)#', $url)) {
$url = "https:{$url}";
}
# Определение каталога и путей для будушего файла
$newName = md5($url);
$relativeDir = '/uploads/images/' . substr($newName, 0, 2);
$absoluteDir = dirname(__DIR__, 2) .$relativeDir;
# Определение mime-типа файла
$mime = image_type_to_mime_type(exif_imagetype($url));
if ($mime === 'image/jpeg') {
$absolutePatch = $absoluteDir . '/' . $newName . '.jpg';
$relativePatch = $relativeDir. '/' . $newName . '.jpg';
# Проверка на дубликат файла
if (file_exists($absolutePatch)) {
return $relativePatch;
}
# Проверка прав на запись и создание каталога для файла
if (!is_dir($absoluteDir))
{
mkdir($absoluteDir, 0777, true);
}
# Сжатие и сохранение изображения на сервер
$image = imagecreatefromjpeg($url);
imagejpeg($image, $absolutePatch, $this->MSE->config_system['poster_quality']);
imagedestroy($image);
return $relativePatch;
} else {
return $url;
}
}
public function loadMenu ()
{
$model = new MenuModel();
$this->menu = $model->getAll();
}
}