Fosuserbundle показывают роли группы в редактировании

StackOverflow https://stackoverflow.com//questions/20007002

Вопрос

Я пытаюсь переопределить контроллер и formtype, чтобы показать роли из выбранной группы на мой взгляд, но я не нахожу правильно. Я последовал за шагами, чтобы переопределить все, что работает, но проблема приходит, когда я пытаюсь сказать услугу, что я передаю конструктору объекта объекта.

Поскольку formtype должен быть переопределен, как пройти через сервис, который вам нужно реализовать, мою группу entity?

У кого-нибудь есть идея того, как достичь этого?

Вот что я сделал:

  1. Переопределите контроллер, а при создании формы пройдите объект $group

    $formFactory = $this->container->get('fos_user.group.form.factory');
    $form = $formFactory->createForm($group);  //Here
    
  2. переопределяют форму и используйте пользовательский метод __Construct, где я могу пройти мою сущность (может быть, здесь моя ошибка, и это должно быть сделано в лучшем или ином способе)

    public function __construct(Container $container, Groups $group)
    {
        $this->container = $container;
        $this->roles = array_keys($this->container->getParameter('security.role_hierarchy.roles'));
    
        $this->group = $group; #How? 
    }
    
  3. Контейнер для получения ключей для ролей передается без ошибок, это работает.

    1. Создайте службу, поскольку документация говорит (здесь приходит реальная проблема и исключения)

       x_s_cosmos.group.form.type:
          class: X\S\CosmosBundle\Form\Type\GroupFormType
          arguments: [@service_container, here_should_be_my_entity?]
          tags:
              - { name: form.type, alias: kosmos_group_form }
      
    2. Я действительно сложен с этим и не имею никакого представления о том, как продолжать.

Это было полезно?

Решение

Наконец, после переопределения GroupController.php и добавление типа поля выбора в мою форму, я мог бы достичь моей цели.

    $form->add('roles', 'choice', array(
                'choices' => $this->getExistingRoles(),
                'data' => $group->getRoles(),
                'label' => 'Roles',
                'expanded' => true,
                'multiple' => true,
                'mapped' => true,
            ));
.

Где getexistrationroles ():

    $roleHierarchy = $this->container->getParameter('security.role_hierarchy.roles');
    $roles = array_keys($roleHierarchy); 

    foreach ($roles as $role) {
        $theRoles[$role] = $role;
    }
    return $theRoles;
.

Я просто пошел неправильно, было не так сложно получить роли группы и показать их в интерфейсе администратора, чтобы вы могли выбрать одну из ваших системных ролей и дать ее группе.Не нужно переопределить FormType, просто контроллер, чтобы добавить свои собственные поля в форму.

Надеюсь, это поможет, как это дало мне большую головную боль.

Другие советы

Вы не должны передавать сущность к конструктору.Если вам нужно получить доступ к объекту внутри формы, вы должны добавить слушатель события в форм-строитель, как это:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $form   = $event->getForm();
        $entity = $event->getData(); 

        // This is your Group entity, now do something with it...
        if ($entity instanceof Group) {
            // $form->add ...
        }
    });
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top