Pregunta

Estoy tratando de anular el controlador y el formype, para mostrar los roles del grupo seleccionado en mi opinión, pero no encuentro el camino correcto. He seguido los pasos para anular todo, que funciona, pero el problema viene cuando trato de decir al servicio que estoy pasando al constructor un objeto de entidad.

A medida que el formype tiene que ser anulado, ¿cómo pasar a través del servicio que necesita para implementar, mi entidad de grupo?

¿Alguien tiene una idea de cómo lograr eso?

Aquí está lo que he hecho:

  1. anula el controlador, y al crear el formulario, pase la entidad $group

    $formFactory = $this->container->get('fos_user.group.form.factory');
    $form = $formFactory->createForm($group);  //Here
    
  2. Anular el formulario y use un método personalizado __Construct donde pueda pasar mi entidad (tal vez aquí esté mi error y que se debe hacer de otra manera o de otra manera)

    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. El contenedor para obtener las llaves para los roles se pasa sin errores, que funciona.

    1. Crear el servicio a medida que dice la documentación (aquí viene el problema real y las excepciones)

       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. Estoy realmente apilado con eso y no tengo ninguna idea de cómo continuar.

¿Fue útil?

Solución

Finalmente, después de anular el grupoController.php y agregar un tipo de campo de elección a mi formulario, podría lograr mi objetivo.

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

Donde GetExistingRoles () es:

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

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

Solo iba de manera incorrecta, no fue tan difícil obtener los roles de un grupo y mostrarlos en una interfaz de administración para que pueda elegir uno de los roles de su sistema y darlo al grupo.No es necesario anular el formype, solo el controlador para agregar sus propios campos al formulario.

Espero que ayude, ya que me ha dado un gran dolor de cabeza.

Otros consejos

No debe pasar una entidad al constructor.Si necesita acceder a la entidad dentro del formulario, debe agregar un escuchador de eventos al Formulario Constructor, como este:

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 ...
        }
    });
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top