<?php
namespace AdminBundle\Admin;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use CoreBundle\Model\DealerModel;
use DcSiteBundle\Form\Transformer\ArrayToStringTransformer;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelListType;
use Sonata\AdminBundle\Route\RouteCollectionInterface;
use Sonata\MediaBundle\Form\Type\MediaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Security;
class DealerAdmin extends AbstractAdmin
{
protected Security $security;
public function setContainerServices(Security $security)
{
$this->security = $security;
}
/**
* @param RouteCollectionInterface $collection
*/
protected function configureRoutes(RouteCollectionInterface $collection): void
{
$collection->remove('view');
$collection->remove('delete');
$collection->remove('create');
}
public function toString($dealer): string
{
return $dealer->getNameRu().' ('.$dealer->getDomain().')';
}
/**
* @param FormMapper $formMapper
*/
protected function configureFormFields(FormMapper $formMapper): void
{
$formMapper
->with('Контент', ['class' => 'col-lg-4'])
->add('name_ru',null, ['label' => 'Название RU'])
->add('name',null, ['label' => 'Название UA'])
->add('official_name_ru',null, ['label' => 'Офіційна назва підприємстува RU'])
->add('official_name_ua',null, ['label' => 'Офіційна назва підприємстува UA'])
->add('domain',null, ['label' => 'Домен'])
->add('seo_url',null, ['label' => 'SEO Url'])
->add('output_order',null, ['label' => 'Порядок вывода (VIDI.UA)'])
->add('brand',null, ['label' => 'Бренд'])
->add('city', null, ['label' => 'Город'])
->add('city_name_ru',null, ['label' => 'Город RU'])
->add('city_name_ua',null, ['label' => 'Город UA'])
->add('address_ru',null, ['label' => 'Адресс RU'])
->add('address_ua',null, ['label' => 'Адресс UA'])
->add('phone',null, ['label' => 'Телефон'])
->add('phone_service',null, ['label' => 'Телефон сервиса'])
->add('address_service_ru',null, ['label' => 'Адресс сервиса RU'])
->add('address_service_ua',null, ['label' => 'Адресс сервиса UA'])
->add('email_sale',null, ['label' => 'Email Отдела продаж'])
->add('email_service',null, ['label' => 'Email Отдела Сервиса'])
->add('open_time',null, ['label' => 'Время открытия'])
->add('close_time',null, ['label' => 'Время закрытия'])
->add('lng',null, ['label' => 'Долгота'])
->add('lat',null, ['label' => 'Широта'])
->add('lng_service',null, ['label' => 'Долгота сервиса'])
->add('lat_service',null, ['label' => 'Широта сервиса'])
->add('link_service_video', null, ['label' => 'Ссылка на видео "Запис на сервіс"'])
->add('image_service_center', MediaType::class, [
'provider' => 'sonata.media.provider.image',
'context' => 'dc_site',
'label' => 'Изображение "Сервис центра"'
])
->add('gallery', ModelListType::class, [
'label' => 'Галерея изображений',
'btn_list' => false,
'required' => false,
], [
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'position',
'link_parameters' => [
'context' => 'insurance',
'provider' => 'sonata.media.provider.image'
],
'admin_code' => 'sonata.media.admin.gallery',
]
)
->end()
// Закоментовано до моменту перероблення структури часів роботи
// ->with('Часы работы | Пустое поле = выходной', ['class' => 'col-lg-3'])
// ->add('dealerWorkHours',DealerWorkHoursType::class, ['label' => false])
// ->end()
->with('Описание', ['class' => 'col-lg-4'])
->add('description_ua',CKEditorType::class, ['label' => 'Описание UA'])
->add('description_ru',CKEditorType::class, ['label' => 'Описание RU'])
->end()
->with('Параметры', ['class' => 'col-lg-4'])
->add('facilities',ChoiceType::class, [
'choices' => array_flip(DealerModel::getFacilitiesType()),
'label' => 'Услуги',
'expanded' => true,
'multiple' => true,
])
->end()
->with('Другое', ['class' => 'col-lg-4'])
->add('facebook_pixel_code',null, ['label' => 'Facebook Pixel Code'])
->add('tik_tok_pixel_code',null, ['label' => 'Tik Tok Pixel Code'])
->add('gtm_code',null, ['label' => 'GTM Code'])
->add('nova_poshta_api_key', null, ['label' => 'API Ключ Нова пошта'])
->add('iban',null, ['label' => 'IBAN'])
->add('merchant_id', null, ['label' => 'Идентификатор продавца (merchant_id)'])
->add('edrpou',null, ['label' => 'ЕДРПО'])
->add('link_facebook', null, ['label' => 'Ссылка на facebook'])
->add('link_youtube', null, ['label' => 'Ссылка на youtube'])
->add('link_instagram', null, ['label' => 'Ссылка на instagram'])
->end()
;
$formMapper->get('facilities')->addModelTransformer(new ArrayToStringTransformer());
}
/**
* @param string $context
* @return ProxyQueryInterface
*/
public function configureQuery($context = 'list'): ProxyQueryInterface
{
$user = $this->security->getUser();
$query = parent::configureQuery($context);
if($user->hasRole('ROLE_SUPER_ADMIN') || $user->hasRole('ROLE_CONTENT_MANAGER') ) {
return $query;
}
$dealer = $user->getDealer();
if(!$dealer) {
throw new AccessDeniedException();
}
$query->andWhere(
$query->expr()->eq($query->getRootAliases()[0].'.id', ':id')
);
$query->setParameter('id', $dealer->getId());
return $query;
}
/**
* @param ListMapper $listMapper
*/
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper->addIdentifier('id')
->add('name',null, ['label' => 'Название'])
->add('domain',null, ['label' => 'Домен'])
->add('adress',null, ['label' => 'Адрес'])
->add('_action', 'actions', [
'label' => 'Действия',
'actions' => [
'edit' => [],
]
])
;
}
}