Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Campo de formulario personalizado

12 de septiembre de 2015

Hola, Tengo una entidad donde voy a almacenar direcciones, existen dos campos, uno address1 y el otro address2 los dos campos son string.

La idea es crear un tipo de campo personalizado para el campo address1, puesto que la direccion debe tener un formato preestablecido, eso ya lo tengo hecho y luce de la siguiente manera.

class AddressFormatType extends AbstractType
{
 
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('cll1', 'choice', array(
                'choices' => array(
                    'CL' => 'Cl',
                    'KR' => 'Kr',
                    'DG' => 'Dg',
                    'TV' => 'Tv',
                    'AC' => 'Av Cl',
                    'AK' => 'Av Kr',
                ),
            ))
            ->add('n1', 'text', array())
            ->add('n1a', 'choice', array(
                'choices' => array(
                    'a' => 'a',
                    'b' => 'b',
                    'c' => 'c',
                    'd' => 'd',
                    'e' => 'e',
                    'f' => 'f',
                ),
            ))
            ->add('bis', 'choice', array(
                'choices' => array(
                    'Bis A' => 'Bis A',
                    'Bis B' => 'Bis B',
                    'Bis C' => 'Bis C',
                    'Bis D' => 'Bis D',
                    'Bis E' => 'Bis E',
                    'Bis F' => 'Bis F',
                )
            ))
            ->add('sur1', 'choice', array(
                'choices' => array(
                    'Sur' => 'S',
                    'Este' => 'E',
                )
            ))
            ->add('n2', 'text', array())
            ->add('n2a', 'choice', array(
                'choices' => array(
                    'a' => 'a',
                    'b' => 'b',
                    'c' => 'c',
                    'd' => 'd',
                    'e' => 'e',
                    'f' => 'f',
                ),
            ))
            ->add('n3', 'text', array())
            ->add('sur2', 'choice', array(
                'choices' => array(
                    'Sur' => 'S',
                    'Este' => 'E',
                )
            ))
            ;
    }
 
    public function getParent()
    {
        return 'form';
    }
 
    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'address_format';
    }
}

y el campo en el formulario se muestra tal cual como quiero, el problema se presenta al momento de hacer submit pues me sale este error.

Expected argument of type "string", "array" given

La pregunta es, Cómo puedo tomar los campos del tipo personalizado y hacerles una clase de implode para que me convierta en un string?

gracias


Respuestas

#1

Buenas, podrías indicarnos en donde y cuando aparece el error que mencionas? ya que no se si es a nivel de entidad, de formulario o en otro lado. Por lo que si puedes mostrarnos un poco más de información que track de errores sería genial.

Por otro lado, los formularios de symfony ofrecen herramientas para convertir la información entre el modelo y el form, precisamente lo que necesitas hacer:

Ya para finalizar, adelantandome un poco y asumiendo que el problema es en la entidad porque el campo está mapeado como string y le llega un arreglo, tambien podrias cambiar el tipo de campo de string a array, con eso te ahorras el uso de un data transformer en el formulario.

Saludos!

@manuel_j555

12 septiembre 2015, 16:18
#2

Hola @manuel_j555,

Realmente no hay mucho q muestre la traza del error, esto es lo que muestra

Expected argument of type "string", "array" given
500 Internal Server Error - UnexpectedTypeException

Y algunas líneas más

Stack Trace
in vendor/symfony/symfony/src/Symfony/Component/Validator/Constraints/LengthValidator.php at line 38   -
        }
        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }
        $stringValue = (string) $value;
at LengthValidator ->validate (array('cll1' => 'CL', 'n1' => '2', 'n1a' => 'a', 'bis' => 'Bis A', 'sur1' => 'Sur', 'n2' => '3', 'n2a' => 'a', 'n3' => '4', 'sur2' => 'Sur'), object(Length)) 
in vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php at line 862   + 
at RecursiveContextualValidator ->validateInGroup (array('cll1' => 'CL', 'n1' => '2', 'n1a' => 'a', 'bis' => 'Bis A', 'sur1' => 'Sur', 'n2' => '3', 'n2a' => 'a', 'n3' => '4', 'sur2' => 'Sur'), '0000000012247d1c000000017d750df7:address1', object(PropertyMetadata), 'Default', object(ExecutionContext)) 
in vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php at line 701   + 
at RecursiveContextualValidator ->validateGenericNode (array('cll1' => 'CL', 'n1' => '2', 'n1a' => 'a', 'bis' => 'Bis A', 'sur1' => 'Sur', 'n2' => '3', 'n2a' => 'a', 'n3' => '4', 'sur2' => 'Sur'), object(Address), '0000000012247d1c000000017d750df7:address1', object(PropertyMetadata), 'data.address1', array('Default'), null, '1', object(ExecutionContext)) 
in vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php at line 599   + 
at RecursiveContextualValidator ->validateClassNode (object(Address), '0000000012247d1c000000017d750df7', object(ClassMetadata), 'data', array('Default'), null, '1', object(ExecutionContext)) 
in vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php at line 355   + 
at RecursiveContextualValidator ->validateObject (object(Address), 'data', array('Default'), '1', object(ExecutionContext)) 
in vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php at line 145   + 
at RecursiveContextualValidator ->validate (object(Address), null, 'Default') 
in vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php at line 54   + 
at FormValidator ->validate (object(Form), object(Form)) 
in vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php at line 862

Voy a tratar de hacer lo que me indicas con el DataTransformer.

Gracias

@miguelplazasr

15 septiembre 2015, 3:05
#3

A modo de comentario me parece válido comentar que también lo que puedes hacer es crear tu componente personalizado directamente en twig y asignarle un name, ya que con éste desde tu controller podrás hacer:

$request->request-get("name_del_componente");

y tratarlo según lo creas más conveniente. pero para ésto te recomiendo también que elimines del FormType el campo para que cuando se ejecute el $form->validate() (Si es que lo usas) no te de false.

De esta manera podes crear tus propios componentes personalizados y trabajar con los mismos desde el controller.

Por otra parte te comparto un video de @javiereguiluz en el que explica un uso avanzado sobre Twig muy interesante.

https://www.youtube.com/watch?v=gywm42aJOBA

@MrXXX0323

17 septiembre 2015, 21:44