src/Admin/AbstractAdmin.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Admin;
  3. use App\Entity\User;
  4. use App\Utils\DateUtils;
  5. use DateTime;
  6. use Sonata\AdminBundle\Datagrid\DatagridInterface;
  7. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  8. use Sonata\AdminBundle\Admin\AbstractAdmin as BaseAbstractAdmin;
  9. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  10. use Sonata\AdminBundle\Filter\Model\FilterData;
  11. use Sonata\AdminBundle\Form\FormMapper;
  12. use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
  13. use Sonata\DoctrineORMAdminBundle\Filter\ChoiceFilter;
  14. use Sonata\DoctrineORMAdminBundle\Filter\DateRangeFilter;
  15. use Sonata\Form\Type\DateRangePickerType;
  16. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  17. use Symfony\Component\Security\Core\Security;
  18. use Symfony\Component\Security\Core\User\UserInterface;
  19. class AbstractAdmin extends BaseAbstractAdmin
  20. {
  21.     private Security $security;
  22.     public function __construct(?string $code null, ?string $class null, ?string $baseControllerName nullSecurity $security null)
  23.     {
  24.         parent::__construct($code$class$baseControllerName);
  25.         $this->security $security;
  26.     }
  27.     /**
  28.      * {@inheritdoc}
  29.      */
  30.     protected function configure(): void
  31.     {
  32.         if (is_object($this->getUser()) && $this->getUser()->hasRole(User::ROLE_ADMIN)) {
  33.             // disable softdeleted filter for admin
  34.             $filters $this->getModelManager()->getEntityManager($this->getClass())->getFilters();
  35.             if (array_key_exists('softdeleteable'$filters->getEnabledFilters())) {
  36.                 $filters->disable('softdeleteable');
  37.             }
  38.         }
  39.     }
  40.     /**
  41.      * {@inheritdoc}
  42.      */
  43.     protected function configureFormFields(FormMapper $form): void
  44.     {
  45.         if (is_null($this->getSubject()) || is_null($this->getSubject()->getId())) {
  46.             $this->configureFormFieldsCreation($form);
  47.         } else {
  48.             $this->configureFormFieldsEdition($form);
  49.         }
  50.     }
  51.     protected function getUser(): ?UserInterface
  52.     {
  53.         $token $this->getSecurity()->getToken();
  54.         if ($token) {
  55.             return $token->getUser();
  56.         }
  57.         return null;
  58.     }
  59.     protected function getRepository()
  60.     {
  61.         return $this->getModelManager()->getEntityManager($this->getClass())->getRepository($this->getClass());
  62.     }
  63.     /**
  64.      * Add a filter on a time range
  65.      * @param DatagridMapper $filter
  66.      * @param string $fieldName // name of the entity field
  67.      */
  68.     protected function addTimeRangeFilterOnField(DatagridMapper $filterstring $fieldName)
  69.     {
  70.         $filter->add($fieldNameDateRangeFilter::class, [
  71.             'advanced_filter' => false,
  72.             'show_filter' => true,
  73.             'field_type' => DateRangePickerType::class,
  74.         ]);
  75.     }
  76.     /**
  77.      * Add a filter on a period for a given field
  78.      * @param DatagridMapper $filter
  79.      * @param string $fieldName // name of the entity field
  80.      * @param null $fullFieldName
  81.      */
  82.     protected function addPeriodFilterOnField(DatagridMapper $filterstring $fieldName$fullFieldName nullstring $label=null)
  83.     {
  84.         //filter on a period
  85.         $filter
  86.             ->add('period'CallbackFilter::class, array(
  87.                 'show_filter' => true,
  88.                 'advanced_filter' => false,
  89.                 'label' => !is_null($label)?$label:'Période',
  90.                 'callback' => function (ProxyQueryInterface $querystring $aliasstring $fieldFilterData $data) use ($fieldName$fullFieldName) {
  91.                     if (!$data->hasValue()) {
  92.                         return false;
  93.                     }
  94.                     $startAndEndDates DateUtils::getFirstAndLastDayOfPeriod($data->getValue());
  95.                     $startDate $startAndEndDates[0];
  96.                     $endDate $startAndEndDates[1];
  97.                     // $queryBuilder->join($alias . '.prospectsOnStore', 'pos');
  98.                     if (is_null($fullFieldName)) {
  99.                         $fullFieldName $alias '.' $fieldName;
  100.                     }
  101.                     $query->andWhere($fullFieldName ' >= :startDate and ' $fullFieldName ' <= :endDate');
  102.                     $query->setParameter('startDate'$startDate);
  103.                     $query->setParameter('endDate'$endDate);
  104.                     return true;
  105.                 },
  106.                 'field_type' => ChoiceType::class,
  107.                 'field_options' => array(
  108.                     'choices' => [
  109.                         'Aujourd\'hui' => DateUtils::PERIOD_TODAY,
  110.                         'Semaine en cours' => DateUtils::PERIOD_THIS_WEEK,
  111.                         'Mois en cours' => DateUtils::PERIOD_THIS_MONTH,
  112.                         'Année en cours' => DateUtils::PERIOD_THIS_YEAR,
  113.                         'Semaine dernière' => DateUtils::PERIOD_LAST_WEEK,
  114.                         'Mois dernier' => DateUtils::PERIOD_LAST_MONTH,
  115.                         'Année dernière' => DateUtils::PERIOD_LAST_YEAR,
  116.                     ],
  117.                 ),
  118.             ));
  119.     }
  120.     /**
  121.      * Add a filter on a period for a given field
  122.      * @param DatagridMapper $filter
  123.      * @param string $fieldName // name of the entity field
  124.      * @param null $label
  125.      * @param null $fullFieldName
  126.      */
  127.     protected function addPreviousMonthsFilterOnField(
  128.         DatagridMapper $filter,
  129.         string $fieldName,
  130.         $label=null,
  131.         $fullFieldName=null
  132.     ) {
  133.             $now = new DateTime();
  134.             $choices = [];
  135.             for ($m 0$m 24$m++) {
  136.                 $choices[$now->format('m/y')] = $now->format('Y-m-01');
  137.                 $now->modify('-1 months');
  138.             }
  139.             $filter
  140.                 ->add('month'CallbackFilter::class, array(
  141.                     'show_filter' => true,
  142.                     'advanced_filter' => false,
  143.                     'label' => is_null($label) ? 'Mois' $label,
  144.                     'callback' => function (ProxyQueryInterface $querystring $aliasstring $fieldFilterData $data) use ($fieldName$fullFieldName) {
  145.                         if (!$data->hasValue()) {
  146.                             return false;
  147.                         }
  148.                         $now DateUtils::getFirstDayOfMonthMidnightFromString($data->getValue());
  149.                         $startDate = clone $now;
  150.                         //$startDate->modify('-'.$data->getValue().' months');
  151.                         $endDate = clone $startDate;
  152.                         $endDate DateUtils::getLastDayOfMonthMidnight($endDate);
  153.                         // $queryBuilder->join($alias . '.prospectsOnStore', 'pos');
  154.                         if (is_null($fullFieldName)) {
  155.                             $fullFieldName $alias '.' $fieldName;
  156.                         }
  157.                         $query->andWhere($fullFieldName ' >= :startDate and ' $fullFieldName ' <= :endDate');
  158.                         $query->setParameter('startDate'$startDate);
  159.                         $query->setParameter('endDate'$endDate);
  160.                         return true;
  161.                     },
  162.                     'field_type' => ChoiceType::class,
  163.                     'field_options' => array(
  164.                         'choices' => $choices,
  165.                     ),
  166.                 ));
  167.     }
  168.     /**
  169.      * Add a filter on acquisitionMode
  170.      * @param DatagridMapper $filter
  171.      * @param string $fieldName // name of the entity field
  172.      */
  173.     protected function addAcquisitionModeFilterOnField(DatagridMapper $filterstring $fieldName)
  174.     {
  175.         $choices = [];
  176.         $modes = ['SMS''Emailing''Facebook''google''GoogleAds''bing''TELEMARKETING''Webpush''TLMKT''Blog''4366-1''1429-1',
  177.             '3219-19''taboola''Annuaire-ORL''659-1''5052-1''emailing'];
  178.         foreach ($modes as $m) {
  179.             $m strtolower($m);
  180.             $choices[$m] = $m;
  181.         }
  182.         asort($choices);
  183.         $filter
  184.             ->add($fieldNameChoiceFilter::class, array(
  185.                 'show_filter' => true,
  186.                 'advanced_filter' => false,
  187.                 'label' => 'Mode d\'acquisition',
  188.                 'field_type' => ChoiceType::class,
  189.                 'field_options' => array(
  190.                     'choices' => $choices,
  191.                 ),
  192.             ));
  193.     }
  194.     /**
  195.      * Add a filter on acquisitionBase
  196.      * @param DatagridMapper $filter
  197.      * @param $fieldName // name of the entity field
  198.      */
  199.     protected function addAcquisitionBaseFilterOnField(DatagridMapper $filter$fieldName)
  200.     {
  201.         $filter
  202.             ->add($fieldNamenull, array(
  203.                 'show_filter' => true,
  204.                 'advanced_filter' => false,
  205.                 'label' => 'Base d\'acquisition',
  206.             ));
  207.     }
  208.     /**
  209.      * Add a filter on admin type (partner or customer)
  210.      * @param DatagridMapper $filter
  211.      * @param $fieldName // name of the entity field
  212.      */
  213.     protected function addAdminTypeFilterOnField(DatagridMapper $filter$fieldName)
  214.     {
  215.         $choices = [
  216.             'Indépendants' => 'freelancer',
  217.             'Partenaire' => 'partner',
  218.         ];
  219.         $filter
  220.             ->add($fieldNameChoiceFilter::class, array(
  221.                 'show_filter' => true,
  222.                 'advanced_filter' => false,
  223.                 'label' => 'Type de client',
  224.                 'field_type' => ChoiceType::class,
  225.                 'field_options' => array(
  226.                     'choices' => $choices,
  227.                 ),
  228.             ));
  229.     }
  230.     public function setSecurity($security)
  231.     {
  232.         $this->security $security;
  233.     }
  234.     public function getSecurity(): Security
  235.     {
  236.         return $this->security;
  237.     }
  238.     protected function configureDefaultSortValues(array &$sortValues): void
  239.     {
  240.         // reverse order (default = 'ASC')
  241.         $sortValues[DatagridInterface::SORT_ORDER] = 'DESC';
  242.         // name of the ordered field (default = the model's id field, if any)
  243.         $sortValues[DatagridInterface::SORT_BY] = 'id';
  244.     }
  245. }