<?php
declare(strict_types=1);
namespace WebBundle\Helper;
use Exception;
use Twig\Error\Error;
use WebBundle\Entity\BuyOrder;
use WebBundle\Entity\Idea;
use WebBundle\Entity\User;
use WebBundle\Enum\BuyOrderStatusEnum;
use WebBundle\Repository\FilterRepository;
/**
* class: TwigTe
* Исключительн хелпер для твига , все его статические функции автоматически доступны в шаблоне
* -----------------------------------------------------
* Created by MihailShirnin on 25.10.2016.
* @package WebBundle\Helper
*/
class TwigTe
{
/**
* Отдаем текущий статический класс. Сделано для твига
* @return TwigTe
*/
public static function that()
{
return new self();
}
/**
* @return UrlHelper
*/
public static function path()
{
return UrlHelper::that();
}
public static function pathGenerate($type, $article)
{
return PathHelper::pathGenerate($type, $article);
}
/**
* @return null|User
* @throws Exception
*/
public static function user()
{
return App::getCurUser();
}
/**
* @return StrHelper
*/
public static function str()
{
return StrHelper::that();
}
/**
* @return LocaleHelper
*/
public static function locale()
{
return LocaleHelper::that();
}
/**
* @param array $params
*/
public function dump(...$params)
{
$params = count($params) == 1 ? $params[0] : $params;
App::dump($params);
}
/**
* Формирование массива ссылок фильтров в футер меню
* Возвращаем массив: название (в текущей локали) => ссылка (catalog/свойство)
*
* @return array
* @throws Exception
*/
public static function getFooterLinks()
{
$lc = in_array(App::getCurLocale(), App::getParameter('locales')) ? App::getCurLocale() : 'en';
/** @var FilterRepository $oRepoFilter */
$oRepoFilter = App::getRepository('WebBundle:FilterEntity');
$list = $oRepoFilter->getForFooterByGroupAlias();
foreach ($list as $id => $item) {
if (!empty($item[$lc])) {
$list[$id] = $item[$lc];
}
}
return $list;
}
/**
* Удаление значения из массива
* @param array $arr
* @param $keys
* @return array
*/
public static function unsetArr(array $arr, $keys)
{
$keys = is_array($keys) ? $keys : explode(',', $keys);
foreach ($keys as $key) {
$key = trim($key);
if (!empty($arr[$key])) {
unset($arr[$key]);
}
}
return $arr;
}
/**
* Формируем LITE меню фильтров
* @param Boolean $withLiteFilters // рендерить ли lite-filters
* @param array $collection //если коллекция уже получена при поиске зачем получать ее еще раз в getDataMenuLite ?
* @param array $calculate //если использовался sphinx, то у нас будут совсем другие количества результатов для фильтров
* @return string
* @throws Exception
*/
public static function buildLeftMenuLite(bool $withLiteFilters = true)
{
$oLeftService = App::getContainer()->get('app.service.leftmenu');
$output = $oLeftService->getDataMenuLite();
$output['withLiteFilters'] = $withLiteFilters;
// App::debugExit($output);
$render = App::getTwig()->render('@Web/Left/_left_menu.html.twig', $output);
return $render;
}
/**
* Получение значения из объекта для составных имен методов класса
* @param $obj
* @param $dop
* @return mixed
*/
public static function runMethodGet($obj, $dop)
{
$aDop = explode('.', $dop);
$res = $obj;
foreach ($aDop as $dop) {
if (strripos($dop, 'get') === false) {
$dop = 'get' . StrHelper::ucFirst($dop);
}
$res = $res->$dop();
}
return $res;
}
/**
* Проверка DEV окружения
* @return bool
* @throws Exception
*/
public static function checkIsDev()
{
return App::isDev();
}
/**
* проверка окружения для вакансий - учетом локали ру
* @param bool $isDev
* @return bool
* @throws Exception
*/
public static function isVacancyTE($isDev = false)
{
return App::isVacancyTE($isDev);
}
public static function checkIsUpdated()
{
return App::getParameter('show_alert_update');
}
public static function getRequest()
{
return RequestHelper::syRequest();
}
public static function replaceStr($search, $replace, $subject, &$count = null)
{
return str_replace($search, $replace, $subject, $count);
}
function valK($val)
{
if ($val > 999) {
$val = LocaleHelper::floatSign($val / 1000, 1) . 'K';
}
return $val;
}
/**
* @param null $route
* @param null|array $params
* @param null|array $hrefFlag
* @return string
* @throws Error
* @throws Exception
*/
static function getSEOLink($route = null, $params = null, $hrefFlag = null): string
{
$params = $params_ = empty($params) ? [] : $params;
$keyBase = ArrHelper::get($params, 'key');
$links = [];
if ($route) {
$lcList = LocaleHelper::getListCodeAvailable();
$countryList = App::getCountryList();
$fs = App::getContainer()->get('app.service.filters');
foreach ($lcList as $loc) {
$loc = strtolower($loc);
if ($loc === 'zh') {
continue;
}
if ($route === 'app_catalog') {
if ($keyBase) {
$key = $fs->getWord(null, $loc);
if (!$key) {
continue;
} else {
$params['key'] = $key;
}
} else {
continue;
}
}
if ($route === 'app_publication_single') {
if (!empty($hrefFlag[$loc])) {
$params['id'] = $hrefFlag[$loc];
} else {
continue;
}
}
if ($route === 'app_collection' && !empty($params['elementId'])) {
$translated = $fs->getWord($params['elementId'], $loc);
if (!$translated) {
continue;
}
$tmpParams = $params;
$tmpParams['elementId'] = $translated;
} else {
$tmpParams = $params;
}
foreach ($countryList as $code => $country) {
$code = strtolower($code);
if (
empty($code) ||
$code == 'ru' ||
$code == 'en' ||
($code != 'en' && !in_array($loc, $country['localesArr'])) ||
($code == 'ru' && $loc != 'ru')
) {
continue;
}
$lf = $loc . '-' . $code;
if ($loc == $code) {
$l = $loc;
} else {
$l = $lf;
}
//для ru нет такой страницы
if (
!empty($tmpParams['url'])
&& $tmpParams['url'] === 'improving-site'
&& $l === 'ru'
) {
continue;
}
$links[] = [
'url' => App::generateUrl(
$route,
array_merge($tmpParams, array_merge(['_locale' => $l], App::getRequest()->query->all())),
0
),
'locale' => $lf,
];
}
}
}
$lcFull = App::getCurLocale(true);
$canonical = false;
if (in_array($lcFull, ['it', 'fi'])) {
$params = array_merge($params_, ['_locale' => $lcFull]);
if ($params != $params_) {
$canonical = App::generateUrl($route, array_merge($params, ['_locale' => $lcFull]), 0);
}
}
return App::getTwig()->render(
'@Web/Common/seo-link.html.twig',
[
'links' => $links,
'canonical' => $canonical,
]
);
}
/**
* @return string
*/
static function getCanonicalTR(): string
{
return '';
}
/**
* Используется как уникальная строка в твиге
* @return string
*/
public static function getUniqId()
{
return uniqid();
}
public static function isArray($val)
{
return is_array($val);
}
/**
* Получить параметр из файла конфига parameters.yml
* Для получения url web socket сервера
* @param string $param Имя параметра в файле конфига parameters.yml
* @return mixed
* @throws Exception
* @todo возможно есть лучшее решение, не нашел
*/
public static function getParameter($param = 'portal_ws_server')
{
if (!$param) {
throw new Exception('Pass empty parameter');
}
return App::getParameter($param);
}
/**
* @param BuyOrder $buyOrder
* @return string
* @throws Exception
*/
public static function headerBO($buyOrder)
{
return App::getTwig()->render('@Web/BuyOrder/header.html.twig', [
'header' => OrderHelper::header($buyOrder),
'noObligation' => $buyOrder->getStatus() < BuyOrderStatusEnum::PARTIALLY_PAID && !$buyOrder->getBankTransferRequested(),
]);
}
/**
* @throws Exception
*/
public static function ideaUrl(Idea $idea): string
{
return App::generateUrl('app_idea', ['url' => $idea->getId()], 0);
}
/**
* Костыль для получения языка на страницах 404 500 b т.д.
*/
public function getLangFromUri(): ?string
{
$localeFromUri = LocaleHelper::getLocaleFromUri(App::getRequest()->getUri());
return $localeFromUri->getLangToUrl();
}
public function getCountryFromUri(): ?string
{
$localeFromUri = LocaleHelper::getLocaleFromUri(App::getRequest()->getUri());
return $localeFromUri->getCountryToUrl();
}
function fakePrice(array $article): array
{
return LocaleHelper::fakePrice($article);
}
/**
* Ссылка на страницу Новинок сайта
* @return mixed
*/
public static function linkTopPage()
{
return FilterHelper::getUrl('recently-added-tiles');
}
public function truncate($string, $length)
{
if (strlen($string) > $length) {
$string = substr($string, 0, $length) . '...';
}
return $string;
}
/**
* @param string $key
* @param $count
* @param $locale
* @param array $params
* @param int $allowKey
* @return string
* Plural on twig
*/
public function transByVariant(string $key, $count, $locale = null, $params = [], int $allowKey = 0)
{
try {
$locale = $locale ?: App::getCurLocale();
return App::getTranslator()->trans(
$key,
['%count%' => App::plural((int) $count, $locale, $allowKey)] + $params,
null,
$locale
);
} catch (Exception $e) {
return '';
}
}
}