<?php
namespace AdminBundle\Admin\DCAutoSite;
use CoreBundle\Entity\User;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use AdminBundle\Form\Type\ContentType;
use CoreBundle\Entity\SpecialOffers;
use CoreBundle\Entity\SpecialOffersContent;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Route\RouteCollectionInterface;
use Sonata\Form\Validator\ErrorElement;
use Sonata\MediaBundle\Form\Type\MediaType;
use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\FormError;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Yaml\Yaml;
/**
* Class GoodsAdmin
* @package AdminBundle\Admin\Shop
*/
class SpecialOffersAdmin extends AbstractAdmin
{
/**
* @var string
*/
private $projectDir;
private Security $security;
public function __construct($code, $class, $baseControllerName, string $projectDir, Security $security)
{
parent::__construct($code, $class, $baseControllerName);
$this->projectDir = $projectDir;
$this->security = $security;
}
/**
* @param RouteCollectionInterface $collection
*/
protected function configureRoutes(RouteCollectionInterface $collection): void
{
$collection->remove('delete');
}
/**
* @param object $object
*/
public function prePersist($object): void
{
/** @var User $User */
$User = $this->security->getUser();
if (!$User->getDealer() && !$object->getDealer()) {
throw new AccessDeniedException('User without dealer');
}
/** @var SpecialOffers $object */
$object->setDealer($User->getDealer());
$object->setState((int)$object->getState());
/** @var SpecialOffersContent $content */
foreach ($object->getContent() as $content) {
$content->setSpecialOffers($object);
}
}
/**
* @param FormMapper $formMapper
*/
protected function configureFormFields(FormMapper $formMapper): void
{
$formMapper
->tab('Основная информация')
->with(' ', ['class' => 'col-lg-6 without-box-heder'])
->add('state', CheckboxType::class, ['label' => 'Показывать на сайте', 'required' => false])
->add('title', null, ['label' => 'Название'])
->add('url', null, ['label' => 'URL'])
->add('date_start', DateType::class, ['widget' => 'single_text', 'label' => 'Дата начала'])
->add('date_end', DateType::class, ['widget' => 'single_text', 'label' => 'Дата конца'])
->add('min_pay', null, ['label' => 'Минимальный платеж'])
->add('rate', null, ['label' => 'Процентная ставка'])
->add('period', null, ['label' => 'Период лизингу, мес. (максимальный)'])
->add('image', MediaType::class, [
'label' => 'Иконка',
'provider' => 'sonata.media.provider.image',
'context' => 'dc_site'
])
->add('content', ContentType::class, ['label' => false], [
'edit' => 'inline',
'sortable' => 'position',
])
->end()
->end();
}
/**
* @param string $context
* @return ProxyQueryInterface
*/
public function configureQuery($context = 'list'): ProxyQueryInterface
{
$user = $this->security->getUser();
$query = parent::configureQuery($context);
$dealer = $user->getDealer();
if (!$dealer) {
throw new AccessDeniedException();
}
$query->andWhere($query->getRootAliases()[0] . '.dealer = :dealer');
$query->setParameter('dealer', $dealer->getId());
return $query;
}
/**
* @param ListMapper $listMapper
*/
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper->addIdentifier('id')
->add('title', null, ['label' => 'Название'])
->add('date_start', 'datetime', ['label' => 'Старт предложения', 'format' => 'd.m.Y'])
->add('date_end', 'datetime', ['label' => 'Конец предложения', 'format' => 'd.m.Y'])
->add('state', 'choice', ['label' => 'Показывать на сайте', 'editable' => true, 'choices' => [
1 => 'Да',
0 => 'Нет',
]])
->add('_action', 'actions', [
'label' => 'Действия',
'actions' => [
'edit' => [],
]
]);
}
/**
* @param ErrorElement $errorElement
*/
public function validate(ErrorElement $errorElement, $object)
{
parent::validate($errorElement, $object);
$configPath = $this->projectDir . '/config/packages/sonata_media.yaml';
$config = Yaml::parseFile($configPath);
$allowedMimeTypes = $config['sonata_media']['providers']['image']['allowed_mime_types'];
/** @var SpecialOffersContent $content */
foreach ($object->getContent() as $content) {
$contentType = $content->getImage()->getContentType();
if (!in_array($contentType, $allowedMimeTypes)) {
$this->getForm()->addError(new FormError('Невірний формат зображення в контенті (' . $contentType . ') не підтримується.'));
}
}
$contentType = $object->getImage()->getContentType();
if (!in_array($contentType, $allowedMimeTypes)) {
$this->getForm()->addError(new FormError('Невірний формат зображення в іконці (' . $contentType . ') не підтримується.'));
}
}
}