<?php
namespace AdmBundle\Helper;
use Exception;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Yaml\Dumper;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Yaml;
use WebBundle\Entity\ListEmail;
use WebBundle\Entity\StaticPageEntity;
use WebBundle\Entity\TransEntity;
use WebBundle\Entity\User;
use WebBundle\Helper\App;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\PathHelper;
use WebBundle\Helper\RequestHelper;
use WebBundle\Helper\StrHelper;
/**
* class: Adm
* -----------------------------------------------------
* Created by MihailShirnin on 18.10.2016.
* @package AdmBundle\Helper
*/
class Adm
{
/**
* Типы поиска при фильтрации
* @param string $type
* @return mixed
*/
public static function getCompareTypes($type = 'full')
{
$arr = [
'full' => [
'like' => '~',
'not-like' => '!~',
'equals' => '=',
'not-equals' => '!=',
'more' => '>',
'less' => '<',
'bool' => '',
],
'int' => [
'equals' => '=',
'not-equals' => '!=',
'more' => '>',
'less' => '<',
],
'str' => [
'like' => '~',
'equals' => '=',
'not-equals' => '!=',
],
'bool' => [
'true' => '1',
'false' => '0',
],
];
$arr['locale'] = array_merge(['all' => 'all'], LocaleHelper::getListAll());
return $arr[$type];
}
/**
* @param $route
* @param array $parameters
* @param bool|int $referenceType
* @return string
*/
public static function generateUrl($route, $parameters = [], $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)
{
$url = App::getRouter()->generate($route, $parameters, $referenceType);
return urldecode($url);
}
/**
* Получаем список локалей для редактирования. Проверяем сразу по доступности
* @param object|null $object
* @param bool $isConsole
* @return array
*/
public static function getLocalesAdminPanel($object = null, $isConsole = false)
{
$locales = [];
$list = [];
$uId = App::getCurUser() ? App::getCurUser()->getId() : null;
foreach (LocaleHelper::getListAll() as $locale) {
$localeName = strtoupper($locale);
$list[$locale] = $localeName;
}
foreach ($list as $locale => $name) {
$localeUP = strtoupper($locale);
if ($isConsole) {
$locales[$locale] = $name;
} elseif ($locale == 'ru' or $locale == 'en' and static::isGranted('ROLE_ADMIN', $object)) {
$locales[$locale] = $name;
} elseif ($locale != 'ua' and static::isGranted('ROLE_PREVIEW_LC', $object)) {
$locales[$locale] = $name;
} elseif ($locale == 'ru' and static::isGranted('ROLE_BM', $object)) {
$locales[$locale] = $name;
} else {
$access = false;
// доступ на чтение для Оли Горшковой
if ($uId == 561560 and $locale == 'sv') {
$access = true;
}
if (!$access) {
$access = static::isGranted('ROLE_TR_' . $localeUP, $object);
}
// доступ на чтение для Круглова Валеры
if (!$access and $uId == 523776 and $object instanceof StaticPageEntity) {
$access = true;
}
if ($access) {
$locales[$locale] = $name;
}
}
}
return $locales;
}
/**
* Проверяем на возможность редактирования
* @param string $locale
* @param null $object
* @return bool
*/
public static function isEditor(string $locale, $object = null)
{
if ($locale == 'usa') {
$locale = 'en';
}
$role = strtoupper("ROLE_TR_{$locale}");
try {
$curUser = App::getCurUser();
} catch (Exception $e) {
$curUser = null;
}
// Доценко Жене разврешаем редактировать все.
try {
if ($curUser and $curUser->getId() == 442) {
return true;
}
} catch (Exception $e) {
}
try {
$secAuthChecker = App::getContainer()->get('security.authorization_checker');
if ($secAuthChecker->isGranted('ROLE_SUPER_ADMIN', $object)) {
return true;
}
if ($secAuthChecker->isGranted('ROLE_REDACTOR', $object)) {
return true;
}
if ($secAuthChecker->isGranted($role, $object)) {
return true;
}
} catch (Exception $e) {
}
// доступ Омурбеку по просьбе Игоря
if ($object instanceof ListEmail) {
if ($curUser and $curUser->getId() == 600182) {
return true;
}
}
if ($object instanceof ListEmail or $object instanceof TransEntity) {
if (in_array($locale, ['en', 'ru'])) {
if ($curUser and in_array('ROLE_EDITOR_EMAIL', $curUser->getRoles())) {
return true;
}
}
}
return false;
}
/**
* Проверка уровня доступа
* @param $role
* @param null $object
* @return bool
*/
public static function isGranted($role, $object = null)
{
$role = StrHelper::toUpper($role);
$secAuthChecker = App::getContainer()->get('security.authorization_checker');
if ($secAuthChecker->isGranted('ROLE_SUPER_ADMIN', $object)) {
return true;
}
// проверяем сначала роли уровнем выше для переводчиков
if (strripos($role, 'ROLE_TR_') !== false) {
if ($secAuthChecker->isGranted('ROLE_TR_ALL', $object)) {
return true;
}
}
return $secAuthChecker->isGranted($role, $object);
}
/**
* @return mixed | User
*/
public static function getCurUser()
{
return App::getCurUser();
}
/**
* Получение сокращенного имени текущего роута из запроса
* @return array|mixed|null|string
*/
public static function getCurRouteName()
{
$routeName = RequestHelper::get('_route');
$routeName = explode('.', $routeName);
array_pop($routeName);
$routeName[] = 'index';
$routeName = implode('.', $routeName);
return $routeName;
}
/**
* @return Filesystem
*/
public static function getFileSystemNew()
{
return new Filesystem();
}
/**
* @return Dumper
*/
public static function getDumperNew()
{
return new Dumper();
}
/**
* @return Finder
*/
public static function getFinderNew()
{
return new Finder();
}
/**
* Parses YAML into a PHP value.
* Usage:
* <code>
* $array = Yaml::parse(file_get_contents('config.yml'));
* print_r($array);
* </code>
* @param string $input A string containing YAML
* @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
* @param bool $objectSupport True if object support is enabled, false otherwise
* @param bool $objectForMap True if maps should return a stdClass instead of array()
* @return mixed The YAML converted to a PHP value
* @throws ParseException If the YAML is not valid
*/
public static function getYamlParse($input, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false)
{
return Yaml::parse($input, $exceptionOnInvalidType, $objectSupport, $objectForMap);
}
/**
* Формируем ссылку для получения истории изменений
* @param $entityId
* @param $entityName
* @param $fieldDot
* @return array
*/
public static function getLinkHistory($entityId, $entityName, $fieldDot = null)
{
$fieldDot = $fieldDot ? "&entityField[]=val|{$fieldDot}::fileld|entityField::type|equals" : '';
$arr = [
'title' => 'История изменений',
'link' => "/adm/history/list/?entityId[]=val|{$entityId}::fileld|entityId::type|equals{$fieldDot}&entityName[]=val|{$entityName}::fileld|entityName::type|equals",
];
return $arr;
}
/**
* Формируем ссылку для получения оринигала перевода
* @param $route
* @param $id
* @param $fieldDot
* @param $locale
* @return array|string
*/
public static function getLinkTranslater($route, $id, $fieldDot, $locale, bool $useHtmlEditor = false)
{
$arr = [];
if (!$locale or $locale == 'ru') {
return $arr;
}
$fieldDotRu = Adm::getFieldDotSourceForTranslater($fieldDot, $locale);
$arr = [
'title' => 'Перевод с оригиналом',
'link' => Adm::generateUrl($route, ['getField' => ['id' => $id, 'field' => $fieldDotRu]]),
];
// включаем html в переводах только для избранных полей
if (
$useHtmlEditor or
StrHelper::isInStr($fieldDot, 'page.html') or
StrHelper::isInStr($fieldDot, 'body.') or
StrHelper::isInStr($fieldDot, 'text.') or
StrHelper::isInStr($fieldDot, 'answer.') or
$fieldDot == 'body'
) {
$arr['html'] = true;
}
return $arr;
}
public static function getLinkTransExList($entityId, $entityName, $fieldDot, $locale)
{
$arr = [];
if (!$locale or $locale == 'ru') {
return $arr;
}
if (!Adm::isGranted('ROLE_REDACTOR')) {
return $arr;
}
if ($entityId == null) {
return $arr;
}
// /** @var TransExRepository $repoTransEx */
// $repoTransEx = App::getRepository('WebBundle:TransExEntity');
// $cnt = $repoTransEx->getCount($entityId, $entityName, $fieldDot);
$arr = [
'title' => "Переводы выполненные в бюро",
'link' => "/adm/trans-ex/list/?entityId[]=val|{$entityId}::fileld|entityId::type|equals&entityField[]=val|{$fieldDot}::fileld|entityField::type|equals&entityName[]=val|{$entityName}::fileld|entityName::type|equals",
];
return $arr;
}
/**
* @param $id
* @param $entityName
* @param $field
* @param $locale
* @param bool $replace
* @return array
*/
public static function getLinkTransExAdd($id, $entityName, $field, $locale, $replace = true)
{
$arr = [];
if (!$locale or $locale == 'source' or $locale == 'ru') {
return $arr;
}
if (!Adm::isGranted('ROLE_REDACTOR')) {
return $arr;
}
if ($id == null) {
return $arr;
}
$pattern = $field;
if ($replace) {
$langsAll = App::getParameter('langs_all');
$langsAllUc = explode('|', $langsAll);
$langsAllUc = array_map(function ($word) {
return ucwords($word);
}, $langsAllUc);
$langsAllUc = implode('|', $langsAllUc);
if (preg_match("/(.*\.)({$langsAll})$/", $field)) {
$pattern = preg_replace("/(.*\.)({$langsAll})$/", "$1locale", $field);
}
if (preg_match("/(.*)({$langsAllUc})$/", $field)) {
$pattern = preg_replace("/(.*)({$langsAllUc})/", "$1localeUc", $field);
}
}
$arr = [
'title' => 'Отправить заявку в бюро',
'link' => Adm::generateUrl('adm.trans_ex.create', ['entityName' => $entityName, 'entityId' => $id, 'entityFieldPattern' => $pattern, 'lcTarget' => $locale]),
];
return $arr;
}
/**
* Формируем имя поля для получения оринигала перевода
* @param $fieldDot
* @param $locale
* @return array|string
*/
public static function getFieldDotSourceForTranslater($fieldDot, $locale)
{
$fieldDotRu = explode('.', $fieldDot);
$last = array_pop($fieldDotRu);
if ($last == $locale) {
$last = 'ru';
} else if ($last == ucfirst($locale)) {
$last = 'Ru';
} else if (StrHelper::isInStr($last, ucfirst($locale))) {
$last = str_replace(ucfirst($locale), 'Ru', $last);
}
array_push($fieldDotRu, $last);
$fieldDotRu = implode('.', $fieldDotRu);
return $fieldDotRu;
}
/**
* Проверяем валидность ссылки, на существоание и ответ сервера
* @param $url
* @return bool
*/
public static function checkOpenUrl($url)
{
$url_c = parse_url($url);
if (!empty($url_c['host'])) {
$ip = gethostbyname($url_c['host']);
if ($url_c['host'] != $ip) {
return true;
}
}
// App::dumpExit( $url_c['host'], gethostbyname ($url_c['host']), checkdnsrr($url_c['host']) );
// пока убрал проверку на headers, не корректная
// if (!empty($url_c['host']) and checkdnsrr($url_c['host'])) {
// if ($headers=@get_headers($url)){
// $cod = substr($headers[0], 9, 3);
// if ($cod == 200) {
// return true;
// }
// }
// }
return false;
}
public static function linkEdit($route, $id)
{
if (!Adm::isGranted('ROLE_ADMIN')) {
return null;
}
$link = App::isDev() ? '' : 'https://adm.tile.expert';
switch ($route) {
case 'bi_collection_show_check':
$link .= "/import/collection/show/{$id}";
break;
case 'adm.collection.edit':
$link .= "/adm/coll/{$id}/edit/";
break;
case 'adm.static.page.edit':
$link .= "/adm/static-page/{$id}/edit/";
break;
case 'adm.brand.edit':
$link .= "/adm/brand/{$id}/edit/";
break;
case 'adm.filter.edit':
$link .= "/adm/filter/{$id}/edit/";
break;
case 'adm.blog.edit':
$link .= "/adm/blog/{$id}/edit/";
break;
case 'bi.factory.edit':
$link .= "/import/factory/output/show/{$id}";
break;
}
return $link;
}
/**
* Генерация рендомной строки
* @param int $length
* @return string
*/
public static function genUnId($length = 10)
{
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$cLength = strlen($chars);
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= $chars[rand(0, $cLength - 1)];
}
return $str;
}
/**
* Чуть правленный путь для картинок в админке
* @param string $type
* @param $attr
* @return string|null
*/
public static function pathImageIcon(string $type, $attr)
{
$src = PathHelper::pathGenerate($type, $attr);
if ($src) {
$src = str_replace('img.tile.expert', 'img-adm.tile.expert', $src);
$src = preg_replace('/\?(.*)/', '', $src);
if (!preg_match('/.svg$/', $src)) {
$src = "{$src}?r=100x100";
}
}
return $src;
}
}