View file visavi-rotorcms-63832fa/app/classes/App.php

File size: 13.41Kb
<?php
class App
{
	/**
	 * Данные роутов
	 * @return object данные роутов
	 */
	public static function router($key)
	{
		if (Registry::has('router')) {
			return Registry::get('router')[$key];
		}
	}

	/**
	 * Получает текущую страницу
	 * @return string текущая страница
	 */
	public static function returnUrl($url = null)
	{
		//if (Request::path() == '/') return $page;

		$query = Request::has('return') ? Request::input('return') : Request::path();
		return 'return='.urlencode(is_null($url) ? $query : $url);
	}

	/**
	 * Метод подключения шаблонов
	 * @param  string  $view   имя шаблона
	 * @param  array   $params массив параметров
	 * @param  boolean $return выводить или возвращать код
	 * @return string          сформированный код
	 */
	public static function view($view, $params = [], $return = false)
	{
		$blade = new Blade(APP.'/views', STORAGE.'/cache');

		if ($return) {
			return $blade->view()->make($view, $params)->render();
		} else {
			echo $blade->view()->make($view, $params)->render();
		}
	}

	/**
	 * Метод вывода страницы с ошибками
	 * @param  integer $code    код ошибки
	 * @param  string  $message текст ошибки
	 * @return string  сформированная страница с ошибкой
	 */
	public static function abort($code, $message = '')
	{
		if ($code == 403) {
			header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden');
		}

		if ($code == 404) {
			header($_SERVER["SERVER_PROTOCOL"].' 404 Not Found');
		}

		exit(App::view('errors.'.$code, compact('message')));
	}

	/**
	 * Постраничная навигация
	 * @param  array $page массив данных
	 * @return string  сформированный блок с кнопками страниц
	 */
	public static function pagination($page)
	{
		if ($page['total'] > 0) {

			if (empty($page['crumbs'])) $page['crumbs'] = 3;

			$url = array_except($_GET, 'page');
			$request = $url ? '&'.http_build_query($url) : null;

			$pages = [];
			$pg_cnt = ceil($page['total'] / $page['limit']);
			$idx_fst = max($page['current'] - $page['crumbs'], 1);
			$idx_lst = min($page['current'] + $page['crumbs'], $pg_cnt);

			if ($page['current'] != 1) {
				$pages[] = [
					'page' => $page['current'] - 1,
					'title' => 'Предыдущая',
					'name' => '«',
				];
			}

			if ($page['current'] > $page['crumbs'] + 1) {
				$pages[] = [
					'page' => 1,
					'title' => '1 страница',
					'name' => 1,
				];
				if ($page['current'] != $page['crumbs'] + 2) {
					$pages[] = [
						'separator' => true,
						'name' => ' ... ',
					];
				}
			}

			for ($i = $idx_fst; $i <= $idx_lst; $i++) {
				if ($i == $page['current']) {
					$pages[] = [
						'current' => true,
						'name' => $i,
					];
				} else {
					$pages[] = [
						'page' => $i,
						'title' => $i.' страница',
						'name' => $i,
					];
				}
			}

			if ($page['current'] < $pg_cnt - $page['crumbs']) {
				if ($page['current'] != $pg_cnt - $page['crumbs'] - 1) {
					$pages[] = [
						'separator' => true,
						'name' => ' ... ',
					];
				}
				$pages[] = [
					'page' => $pg_cnt,
					'title' => $pg_cnt . ' страница',
					'name' => $pg_cnt,
				];
			}

			if ($page['current'] != $pg_cnt) {
				$pages[] = [
					'page' => $page['current'] + 1,
					'title' => 'Следующая',
					'name' => '»',
				];
			}

			self::view('app._pagination', compact('pages', 'request'));
		}
	}

	// ----------------------- Вывод страниц в форуме ------------------------//
	public static function forumPagination($topic) {

		if ($topic->postCount()) {

			$pages = [];
			$link = '/topic/'.$topic->id;

			$pg_cnt = ceil($topic->postCount() / Setting::get('posts_per_page'));

			for ($i = 1; $i <= 5; $i++) {
				if ($i <= $pg_cnt) {
					$pages[] = [
						'page' => $i,
						'title' => $i.' страница',
						'name' => $i,
					];
				}
			}

			if (5 < $pg_cnt) {

				if (6 < $pg_cnt) {
					$pages[] = array(
						'separator' => true,
						'name' => ' ... ',
					);
				}

				$pages[] = array(
					'page' => $pg_cnt,
					'title' => $pg_cnt.' страница',
					'name' => $pg_cnt,
				);
			}

			self::view('forums._pagination', compact('pages', 'link'));
		}
	}

	/**
	 * Обработчик постраничной навигации
	 * @param  integer $limit элементов на страницу
	 * @param  integer $total всего элементов
	 * @return array          массив подготовленных данных
	 */
	public static function paginate($limit, $total)
	{
		$current = Request::input('page');
		if ($current < 1) $current = 1;

		if ($total && $current * $limit >= $total) {
			$current = ceil($total / $limit);
		}

		$offset = intval(($current * $limit) - $limit);

		return compact('current', 'offset', 'limit', 'total');
	}

	/**
	 * Навигация
	 * @param  array   $crumbs массив ссылок
	 * @param  boolean $return возвращать или выводить
	 * @return string          сформированный код
	 */
	public static function breadcrumbs($crumbs)
	{
		return self::view('app._breadcrumbs', compact('crumbs'), true);
	}

	/**
	 * Метод переадресации
	 * @param  string  $url адрес переадресации
	 * @param  boolean $permanent постоянное перенаправление
	 */
	public static function redirect($url, $permanent = false)
	{
		if ($permanent){
			header('HTTP/1.1 301 Moved Permanently');
		}
		if (isset($_SESSION['captcha'])) $_SESSION['captcha'] = null;

		exit(header('Location: '.$url));
	}

	/**
	 * Запись flash уведомления
	 * @param string $status статус уведомления
	 * @param array $message массив с уведомлениями
	 */
	public static function setFlash($status, $message)
	{
		$_SESSION['flash'][$status] = $message;
	}

	/**
	 * Вывод flash уведомления
	 * @param  array $errors массив уведомлений
	 * @return string сформированный блок с уведомлениями
	 */
	public static function getFlash()
	{
		self::view('app._flash');
	}

	/**
	 * Запись POST данных введенных пользователем
	 * @param array $data массив полей
	 */
	public static function setInput($data)
	{
		$_SESSION['input'] = $data;
	}

	/**
	 * Вывод значения из POST данных
	 * @param string $name имя поля
	 * @return string сохраненный текст
	 */
	public static function getInput($name, $default = '')
	{
		return isset($_SESSION['input'][$name]) ? $_SESSION['input'][$name] : $default;
	}

	/**
	 * Подсветка блока с полем для ввода сообщения
	 * @param string $field имя поля
	 * @return string CSS класс ошибки
	 */
	public static function hasError($field)
	{
		return isset($_SESSION['flash']['danger'][$field]) ? ' has-error' : '';
	}

	/**
	 * Выводит блок с текстом ошибки
	 * @param  string $field имя поля
	 * @return string блоки ошибки
	 */
	public static function textError($field)
	{
		if (isset($_SESSION['flash']['danger'][$field])) {
			$error = $_SESSION['flash']['danger'][$field];
			return '<div class="text-danger">'.$error.'</div>';
		}
	}

	/**
	 * Проверяет является ли email валидным
	 * @param  string  $email адрес email
	 * @return boolean результат проверки
	 */
	public static function isMail($email)
	{
		return preg_match('#^([a-z0-9_\-\.])+\@([a-z0-9_\-\.])+(\.([a-z0-9])+)+$#', $email);
	}

	/**
	 * Отправка уведомления на email
	 * @param  mixed   $to      Получатель
	 * @param  string  $subject Тема письма
	 * @param  string  $body    Текст сообщения
	 * @param  array   $headers Дополнительные параметры
	 * @return boolean  Результат отправки
	 */
	public static function sendMail($to, $subject, $body, $headers = [])
	{
		if (empty($headers['from'])) $headers['from'] = [env('SITE_EMAIL') => env('SITE_ADMIN')];

		$message = Swift_Message::newInstance()
			->setTo($to)
			->setSubject($subject)
			->setBody($body, 'text/html')
			->setFrom($headers['from'])
			->setReturnPath(env('SITE_EMAIL'));

		if (env('MAIL_DRIVER') == 'smtp') {
			$transport = Swift_SmtpTransport::newInstance(env('MAIL_HOST'), env('MAIL_PORT'), 'ssl')
				->setUsername(env('MAIL_USERNAME'))
				->setPassword(env('MAIL_PASSWORD'));
		} else {
			$transport = new Swift_MailTransport();
		}

		$mailer = new Swift_Mailer($transport);
		return $mailer->send($message);
	}

	/**
	 * Форматирование даты
	 * @param string $format отформатированная дата
	 * @param mixed  $date временная метки или дата
	 * @return string отформатированная дата
	 */
	public static function date($format, $date = null)
	{
		$date = (is_null($date)) ? time() : strtotime($date);

		$eng = array('January','February','March','April','May','June','July','August','September','October','November','December');
		$rus = array('января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря');
		return str_replace($eng, $rus, date($format, $date));
	}

	/**
	 * Получение расширения файла
	 * @param  string $filename имя файла
	 * @return string расширение
	 */
	public static function getExtension($filename)
	{
		return pathinfo($filename, PATHINFO_EXTENSION);
	}

	/**
	 * Красивый вывод размера файла
	 * @param  string  $filename путь к файлу
	 * @param  integer $decimals кол. чисел после запятой
	 * @return string            форматированный вывод размера
	 */
	public static function filesize($filename, $decimals = 1)
	{
		if (!file_exists($filename)) return 0;

		$bytes = filesize($filename);
		$size = array('B','kB','MB','GB','TB');
		$factor = floor((strlen($bytes) - 1) / 3);
		return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$size[$factor];
	}

	/**
	 * Склонение чисел
	 * @param  integer $num  число
	 * @param  array   $forms массив склоняемых слов (один, два, много)
	 * @return string  форматированная строка
	 */
	public static function plural($num, array $forms)
	{
		if ($num % 100 > 10 &&  $num % 100 < 15) return $num.' '.$forms[2];
		if ($num % 10 == 1) return $num.' '.$forms[0];
		if ($num % 10 > 1 && $num %10 < 5) return $num.' '.$forms[1];
		return $num.' '.$forms[2];
	}

	/**
	 * Метод валидации дат
	 * @param  string $date   дата
	 * @param  string $format формат даты
	 * @return boolean        результат валидации
	 */
	public static function validateDate($date, $format = 'Y-m-d H:i:s')
	{
		$d = DateTime::createFromFormat($format, $date);
		return $d && $d->format($format) == $date;
	}

	/**
	 * Обработка BB-кодов
	 * @param  string  $text  Необработанный текст
	 * @param  boolean $parse Обрабатывать или вырезать код
	 * @return string         Обработанный текст
	 */
	public static function bbCode($text, $parse = true)
	{
		$bbcode = new BBCodeParser;

		if ( ! $parse) return $bbcode->clear($text);

		$text = $bbcode->parse($text);
		$text = $bbcode->parseSmiles($text);

		return $text;
	}

	/**
	 * Определение браузера
	 * @return string браузер и версия браузера
	 */
	public static function getUserAgent($userAgent = null)
	{
		$browser = new Browser();
		if ($userAgent) $browser->setUserAgent($userAgent);

		$brow = $browser->getBrowser();
		$version = implode('.', array_slice(explode('.', $browser->getVersion()), 0, 2));
		return $version == 'unknown' ? $brow : $brow.' '.$version;
	}

	/**
	 * Определение IP пользователя
	 * @return string IP пользователя
	 */
	public static function getClientIp()
	{
		$ip = Request::ip();
		return $ip == '::1' ? '127.0.0.1' : $ip;
	}

	/**
	 * Метод обработки массивов
	 * @param  array $array необработанный массив
	 * @return array обработанный массив
	 */
	public static function arrayPrepare($array)
	{
		$array_prepare = array();
		if ( is_array($array) )
		{
			foreach($array as $property => $keys) {
				if (is_array($keys)) {
					foreach($keys as $key => $value) {
						$array_prepare[$key][$property] = $value;
					}
				} else {
					$array_prepare[$property] = $keys;
				}
			}
		}
		return $array_prepare;
	}

	/**
	 * Собирает из коллекции составной массив ключ->значение
	 * @param  object|array $enumerable  массив массивов или объектов
	 * @param  string $key ключ
	 * @param  string $val значение
	 * @return array составной массив
	 */
	public static function arrayAssoc($enumerable, $key, $val)
	{
		$ret = array();
		foreach ($enumerable as $value)
		{
			if (is_array($value))
				$ret[$value[$key]] = $value[$val];
			else
				$ret[$value->$key] = $value->$val;
		}
		return $ret;
	}
}