PHP - Predefinir campo en formulario

 
Vista:
sin imagen de perfil
Val: 9
Ha aumentado su posición en 14 puestos en PHP (en relación al último mes)
Gráfica de PHP

Predefinir campo en formulario

Publicado por gonzo__ (13 intervenciones) el 04/05/2021 16:25:55
Buenas tardes, tengo un problema a la hora de predefinir la eleccion de un campo en un formulario.

Este es el form: ElectronicaType.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
 
namespace App\Form;
 
//Todos los Type son los tipos de campo que tenemos en el formulario, si añadimos un tipo de campo texto en area deberemos añadir su extension para poder usarla
use App\Entity\Electronica;
use App\Entity\ElectronicaEstados;
use PhpParser\Node\Stmt\Label;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
 
class ElectronicaType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('num_pedido', NumberType::class, ['label' => 'Número de pedido SEALED'])
            ->add('delegacion')
            ->add('cliente')
            ->add('vehiculo', TextType::class, ['label' => 'Vehículo'])
            ->add('km', TextType::class, ['label' => 'Kilometros'])
            ->add('matricula', TextType::class, ['label' => 'Matrícula'])
            ->add('motor', TextType::class, ['label' => 'Motor'])
            ->add('potencia', TextType::class, ['label' => 'Potencia'])
            ->add('unidad', TextType::class, ['label' => 'Unidad'])
            ->add('ref', TextType::class, ['label' => 'Referencia'])
            ->add('cantidad', NumberType::class, ['label' => 'Cantidad'])
            ->add('sintomas', TextareaType::class)
            ->add('alquiler')
            ->add('reparacion')
            ->add('presupuesto')
            ->add('garantia')
            ->add('fecha', DateType::class, array(
                'data' => new \DateTime()))
            ->add('usuario')
            ->add('estado', HiddenType::class, array(
            ));
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Electronica::class,
        ]);
    }
}


Este es el Controller: ElectronicaController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
 * @Route("/new", name="electronica_new", methods={"GET","POST"})
 */
public function new(MailerInterface $mailer, Request $request): Response
{
    $electronica = new Electronica();
    $form = $this->createForm(ElectronicaType::class, $electronica);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($electronica);
        $session = $request->getSession();
        $electronica->setDelegacion($session->getId);
        $electronica->setEstado($em->getRepository(ElectronicaEstados::class)
            ->find(1));
 
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($electronica);
        $entityManager->flush();
        $this->addFlash(
            'success',
            "¡Solicitud electrónica {$electronica->getId()} creada correctamente!"
        );
        $email = (new Email())
            ->subject('PORTAL  | ¡Alta solicitud electrónica! ')
            ->from('')
            ->to('')
            ->html("<h2>¡Se ha creado correctamente la solicitud electrónica con número {$electronica->getId()} por el usuario {$electronica->getUsuario()}!.</h2>
    <h1>Datos de la solicitud electrónica</h1>
    ID:{$electronica->getid()}<p>
    Delegación: {$electronica->getdelegacion()}<p>
    Cliente: {$electronica->getcliente()}<p>
    Vehículo: {$electronica->getvehiculo()}<p>
    Kilometros: {$electronica->getkm()}<p>
    Matrícula: {$electronica->getmatricula()}<p>
    Motor: {$electronica->getmotor()}<p>
    Potencia: {$electronica->getpotencia()}<p>
    Unidad: {$electronica->getunidad()}<p>
    Referencia: {$electronica->getref()}<p>
    Cantidad: {$electronica->getcantidad()}<p>
    Síntomas: {$electronica->getsintomas()}<p>
    Alquiler: {$electronica->getalquiler()}<p>
    Reparación: {$electronica->getreparacion()}<p>
    Presupuesto: {$electronica->getpresupuesto()}<p>
    Garantía: {$electronica->getgarantia()}<p>
                ");
 
        $mailer->send($email);
        return $this->redirectToRoute('electronica_index');
    }
 
    return $this->render('electronica/new.html.twig', [
        'electronica' => $electronica,
        'form' => $form->createView(),
    ]);
}

En el controlador defino que el estado quiero que sea el 1 predefinidamente, ya que acceso a la tabla ElectronicaEstados y coge el valor con id=1.

Lo que quiero es que el usuario predefinido cuando cree el formulario sea el usuario que ha iniciado sesion en la web.


Desde html se como se coge esa variable o por lo menos llego a acceder a ella:

1
<span class="user-block-name item-text">Bienvenido {{ app.user.nombre }} {{ app.user.apellidos }} </span>

pero en el controlador no comprendo como deberia ponerlo para que se seleccionara la varible de sesion del usuario.

Saludos y gracias de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Predefinir campo en formulario

Publicado por Mauro (1038 intervenciones) el 05/05/2021 14:36:18
Hola Gonzo!

Por lo que veo parece que estás utilizando el framework Symfony, ¿correcto?

Lo que puedes hacer es agregar un parámetro de inicialización de tu formulario y desde el controlador inyectarle el usuario que buscas.

Algo como:

1
2
3
4
5
6
7
8
9
10
public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefaults([
                'data_class' => Electronica::class,
            ])
            ->setRequired([
                'user'
            ]);
    }

Del lado del método buildForm:

1
2
3
->add('usuario', null, [
   'empty_data' => $options['user']
]);

Y del controller:

1
2
3
4
5
6
public function new(MailerInterface $mailer, UserInterface $user, Request $request): Response
{
...
$form = $this->createForm(ElectronicaType::class, $electronica, ['user' => $this->getUser()]);
...
}

Espero haber sido claro, consúltame si te quedan dudas ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 14 puestos en PHP (en relación al último mes)
Gráfica de PHP

Predefinir campo en formulario

Publicado por gonzo__ (13 intervenciones) el 07/05/2021 10:35:11
Buenos dias Mauro,

Primero que nada, gracias por tu respuesta! Te has explicado muy bien pero la verdad es que soy un poco novato aun con PHP y Symfony jeje!

Estoy utilizando Symfony 4.2 y la version de PHP 7.2. Deberia de haber escrito por el foro de Symfony pero lo creé aqui sin darme cuenta.

Ahora mismo lo tengo de la siguiente manera, tal cual me has indicado:

ElectronicaController.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
 
namespace App\Controller;
 
use App\Controller\UserInterface;
use App\Entity\Electronica;
use App\Entity\ElectronicaEstados;
use App\Entity\ElectronicaObservaciones;
use App\Form\ElectronicaType;
.
.
.
 //En este metodo cuando se crea una incidencia electronica, se manda un correo desde informatica al usuario creador de la solicitud
    /**
     * @Route("/new", name="electronica_new", methods={"GET","POST"})
     */
    public function new(MailerInterface $mailer, UserInterface $user, Request $request): Response
    {
        $electronica = new Electronica();
        $form = $this->createForm(ElectronicaType::class, $electronica, ['user' => $this->getUser()]);
        $form->handleRequest($request);
 
        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($electronica);
            $electronica->setEstado($em->getRepository(ElectronicaEstados::class)
                ->find(1));
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($electronica);
            $entityManager->flush();
            $this->addFlash(
                'success',
                "¡Solicitud electrónica {$electronica->getId()} creada correctamente!"
            );
            $email = (new Email())
                ->subject('PORTAL RS | ¡Alta solicitud electrónica! ')
                ->from('informatica@rsegorbe.com')
                ->to('informatica@rsegorbe.com')
                ->html("<h2>¡Se ha creado correctamente la solicitud electrónica con número {$electronica->getId()} por el usuario {$electronica->getUsuario()}!.</h2>
        <h1>Datos de la solicitud electrónica</h1>
        ID:{$electronica->getid()}<p>
        Delegación: {$electronica->getdelegacion()}<p>
        Cliente: {$electronica->getcliente()}<p>
        Vehículo: {$electronica->getvehiculo()}<p>
        Kilometros: {$electronica->getkm()}<p>
        Matrícula: {$electronica->getmatricula()}<p>
        Motor: {$electronica->getmotor()}<p>
        Potencia: {$electronica->getpotencia()}<p>
        Unidad: {$electronica->getunidad()}<p>
        Referencia: {$electronica->getref()}<p>
        Cantidad: {$electronica->getcantidad()}<p>
        Síntomas: {$electronica->getsintomas()}<p>
        Alquiler: {$electronica->getalquiler()}<p>
        Reparación: {$electronica->getreparacion()}<p>
        Presupuesto: {$electronica->getpresupuesto()}<p>
        Garantía: {$electronica->getgarantia()}<p>
                    ");
 
            $mailer->send($email);
            return $this->redirectToRoute('electronica_index');
        }
 
        return $this->render('electronica/new.html.twig', [
            'electronica' => $electronica,
            'form' => $form->createView(),
        ]);
    }

ElectronucaType.php (es el form):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
 
namespace App\Form;
 
//Todos los Type son los tipos de campo que tenemos en el formulario, si añadimos un tipo de campo texto en area deberemos añadir su extension para poder usarla
use App\Entity\Electronica;
use App\Entity\ElectronicaEstados;
use PhpParser\Node\Stmt\Label;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
 
class ElectronicaType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('num_pedido', NumberType::class, ['label' => 'Número de pedido SEALED'])
            ->add('delegacion')
            ->add('cliente')
            ->add('vehiculo', TextType::class, ['label' => 'Vehículo'])
            ->add('km', TextType::class, ['label' => 'Kilometros'])
            ->add('matricula', TextType::class, ['label' => 'Matrícula'])
            ->add('motor', TextType::class, ['label' => 'Motor'])
            ->add('potencia', TextType::class, ['label' => 'Potencia'])
            ->add('unidad', TextType::class, ['label' => 'Unidad'])
            ->add('ref', TextType::class, ['label' => 'Referencia'])
            ->add('cantidad', NumberType::class, ['label' => 'Cantidad'])
            ->add('sintomas', TextareaType::class)
            ->add('alquiler')
            ->add('reparacion')
            ->add('presupuesto')
            ->add('garantia')
            ->add('fecha', DateType::class, array(
                'data' => new \DateTime()))
            ->add('usuario', null, [
   'empty_data' => $options['user']
])
            ->add('estado', HiddenType::class, array(
            ));
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Electronica::class,
        ])
 
        ->setRequired([
                'user'
            ]);
    }
}

Creo que he añadido correctamente lo que me habias indicado pero me salta un error al cargar la pagina:

"Class App\Controller\UserInterface does not exist"

Lo tengo añadido como veras en el Controller :S

Saludos y gracias de antemano!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Predefinir campo en formulario

Publicado por Mauro (1038 intervenciones) el 07/05/2021 23:31:36
Hola Gonzo:

¿Será que te falta un use?

1
use Symfony\Component\Security\Core\User\UserInterface;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 14 puestos en PHP (en relación al último mes)
Gráfica de PHP

Predefinir campo en formulario

Publicado por gonzo__ (13 intervenciones) el 11/05/2021 16:02:39
Buenas tardes Mauro,

Sigue sin ir, he cambiado el use que utilizaba yo por el que tu me has comentado:
1
2
3
4
//Este es el que tenia yo
use App\Controller\UserInterface;
//Este es el tuyo
use Symfony\Component\Security\Core\User\UserInterface;

Y sigue sin funcionar. No me da ningun error aparente, simplemente no me selecciona el usuario con el que me logue en el formulario..
Actualmente lo tengo asi el codigo:
ElectronicaController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use Symfony\Component\Security\Core\User\UserInterface;
 
   //En este metodo cuando se crea una incidencia electronica, se manda un correo desde informatica al usuario creador de la solicitud
    /**
     * @Route("/new", name="electronica_new", methods={"GET","POST"})
     */
    public function new(MailerInterface $mailer, UserInterface $user, Request $request): Response
    {
        $electronica = new Electronica();
        $form = $this->createForm(ElectronicaType::class, $electronica, ['user' => $this->getUser()]);
        $form->handleRequest($request);
 
        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($electronica);
            $electronica->setEstado($em->getRepository(ElectronicaEstados::class)
                ->find(1));
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($electronica);
            $entityManager->flush();
            $this->addFlash(
                'success',
                "¡Solicitud electrónica {$electronica->getId()} creada correctamente!"
            );
            $email = (new Email())
                ->subject('PORTAL RS | ¡Alta solicitud electrónica! ')
                ->from('informatica@rsegorbe.com')
                ->to('informatica@rsegorbe.com')
                ->html("<h2>¡Se ha creado correctamente la solicitud electrónica con número {$electronica->getId()} por el usuario {$electronica->getUsuario()}!.</h2>
        <h1>Datos de la solicitud electrónica</h1>
        ID:{$electronica->getid()}<p>
        Delegación: {$electronica->getdelegacion()}<p>
        Cliente: {$electronica->getcliente()}<p>
        Vehículo: {$electronica->getvehiculo()}<p>
        Kilometros: {$electronica->getkm()}<p>
        Matrícula: {$electronica->getmatricula()}<p>
        Motor: {$electronica->getmotor()}<p>
        Potencia: {$electronica->getpotencia()}<p>
        Unidad: {$electronica->getunidad()}<p>
        Referencia: {$electronica->getref()}<p>
        Cantidad: {$electronica->getcantidad()}<p>
        Síntomas: {$electronica->getsintomas()}<p>
        Alquiler: {$electronica->getalquiler()}<p>
        Reparación: {$electronica->getreparacion()}<p>
        Presupuesto: {$electronica->getpresupuesto()}<p>
        Garantía: {$electronica->getgarantia()}<p>
                    ");
 
            $mailer->send($email);
            return $this->redirectToRoute('electronica_index');
        }
 
        return $this->render('electronica/new.html.twig', [
            'electronica' => $electronica,
            'form' => $form->createView(),
        ]);
    }

ElectronicaType.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
 
namespace App\Form;
 
//Todos los Type son los tipos de campo que tenemos en el formulario, si añadimos un tipo de campo texto en area deberemos añadir su extension para poder usarla
use App\Entity\Electronica;
use App\Entity\ElectronicaEstados;
use PhpParser\Node\Stmt\Label;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
 
class ElectronicaType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('num_pedido', NumberType::class, ['label' => 'Número de pedido SEALED'])
            ->add('delegacion')
            ->add('cliente')
            ->add('vehiculo', TextType::class, ['label' => 'Vehículo'])
            ->add('km', TextType::class, ['label' => 'Kilometros'])
            ->add('matricula', TextType::class, ['label' => 'Matrícula'])
            ->add('motor', TextType::class, ['label' => 'Motor'])
            ->add('potencia', TextType::class, ['label' => 'Potencia'])
            ->add('unidad', TextType::class, ['label' => 'Unidad'])
            ->add('ref', TextType::class, ['label' => 'Referencia'])
            ->add('cantidad', NumberType::class, ['label' => 'Cantidad'])
            ->add('sintomas', TextareaType::class)
            ->add('alquiler')
            ->add('reparacion')
            ->add('presupuesto')
            ->add('garantia')
            ->add('fecha', DateType::class, array(
                'data' => new \DateTime()))
            ->add('usuario', null, [
   'empty_data' => $options['user']
])
            ->add('estado', HiddenType::class, array(
            ));
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Electronica::class,
        ])
 
        ->setRequired([
                'user'
            ]);
    }
}

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Predefinir campo en formulario

Publicado por Mauro (1038 intervenciones) el 13/05/2021 17:21:41
Qué extraño... habría que ponerse a debuggear el código en detalle...

¿Usas algún debugger?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 14 puestos en PHP (en relación al último mes)
Gráfica de PHP

Predefinir campo en formulario

Publicado por Gonzalo (13 intervenciones) el 26/05/2021 12:03:03
Hola Mauro, lo siento por tardar tanto en contestar.

Sigo con el mismo problema, he probado varias opciones que he ido encontrando por internet pero no consigo que lo coja por defecto.

Ahora mismo no estoy utilizando ningún debugger la verdad :S.

Otra pregunta que tengo, que igual debería crear un tema nuevo, es lo siguiente:

Como puedo hacer que al pulsar un botón, me abra una unidad de red que tenemos en un servidor? Me voy a intentar explicar mejor:

Tengo un servidor con la ip 192.168.4.250 al cual accedemos por ftp o conectamos la unidad de red. Este tiene varias carpetas con informacion a las que los usuarios deben acceder.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div style="margin-bottom: 5px;" class="btn-group">
   <button type="button" data-toggle="dropdown" class="btn btn-info dropdown-toggle">Tablas
      <span class="caret"></span>
   </button>
   <ul role="menu" class="dropdown-menu">
      <li><a href="/garantias/clientes">Clientes</a>
      </li>
      <li><a href="/garantias/proveedores">Proveedores</a>
      </li>
      <li><a href="/garantias/formasenvio">Formas de envío</a>
      </li>
      <li class="divider"></li>
      <li><a href="//192.168.4.250/">PRUEBA</a>
      </li>
   </ul>
</div>

Ahora mismo lo que tengo es eso, un botón desplegable para acceder a varias tablas web y un botón (PRUEBA) en el cual quiero que se abra la carpeta de la unidad de red que tienen mapeada o desde el propio navegador por ftp.

Captura

Cuando intento acceder por el propio navegador, me da esta url: file://192.168.4.250/garantias/ con la cual he probado a introducirlo en el href, pero sin éxito. He probado varias formas de poner la url pero no me funciona con ninguno.

Saludos y gracias! Si debo crear un nuevo tema lo creo para que lo vea todo el mundo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar