Динамический пользовательский выбор поля сущности easyadmin - PullRequest
0 голосов
/ 03 февраля 2019

Установлен easyadminbundle с Symfony 4, настроен для имени объекта Delivery и имеет поле, связанное с именем другого объекта WeeklyMenu:

easy_amin.yaml:

Delivery:
...
      form:
        fields:
          - { property: 'delivered'}
          - { property: 'weeklyMenu', type: 'choice', type_options: { choices: null }}

Мне нужен объект с динамически фильтрованными результатами из weeklyMenu, чтобы я мог получить список меню на следующие дни и так далее.Сейчас он установлен на null, но здесь нужно получить отфильтрованный результат.

Я читал о переопределении AdminController, которое я придерживался.Я считаю, что мне нужно переопределить построитель запросов easyadmin, который перечисляет результат связанной сущности.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Другим подходом к этому было бы создание нового FormTypeConfigurator и перезапись вариантов и / или меток.И пометьте его как:

App\Form\Type\Configurator\UserTypeConfigurator:
    tags: ['easyadmin.form.type.configurator']

и конфигуратор будет выглядеть так:

<?php
declare(strict_types = 1);

namespace App\Form\Type\Configurator;

use App\Entity\User;
use EasyCorp\Bundle\EasyAdminBundle\Form\Type\Configurator\TypeConfiguratorInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormConfigInterface;

final class UserTypeConfigurator implements TypeConfiguratorInterface
{
    /**
     * {@inheritdoc}
     */
    public function configure($name, array $options, array $metadata, FormConfigInterface $parentConfig)
    {
        if ($parentConfig->getData() instanceof User) {
            $options['choices'] = User::getUserStatusAvailableChoices();
        }

        return $options;
    }

    /**
     * {@inheritdoc}
     */
    public function supports($type, array $options, array $metadata)
    {
        return in_array($type, ['choice', ChoiceType::class], true);
    }
}
0 голосов
/ 03 февраля 2019

Я понял, вот решение, если кто-то ищет:

namespace App\Controller;

use Doctrine\ORM\EntityRepository;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilder;

class AdminController extends EasyAdminController {

  public function createDeliveryEntityFormBuilder($entity, $view) {
    $formBuilder = parent::createEntityFormBuilder($entity, $view);
    $fields = $formBuilder->all();
    /**
     * @var  $fieldId string
     * @var  $field FormBuilder
     */
    foreach ($fields as $fieldId => $field) {
      if ($fieldId == 'weeklyMenu') {
        $options = [
            'attr'     => ['size' => 1,],
            'required' => true,
            'multiple' => false,
            'expanded' => false,
            'class'    => 'App\Entity\WeeklyMenu',
        ];
        $options['query_builder'] = function (EntityRepository $er) {
          $qb = $er->createQueryBuilder('e');

          return $qb->where($qb->expr()->gt('e.date', ':today'))
                    ->setParameter('today', new \DateTime("today"))
                    ->andWhere($qb->expr()->eq('e.delivery', ':true'))
                    ->setParameter('true', 1)
                    ->orderBy('e.date', 'DESC');
        };
        $formBuilder->add($fieldId, EntityType::class, $options);
      }
    }

    return $formBuilder;
  }
}

, поэтому easyAdmin проверяет, существует ли formbuilder с именем сущности, то есть create<ENTITYNAME>FormBuilder();, и вы можете переопределить здесь с помощью своегособственная логика.

...