Get the value from the database and insert it into the Symfony 3 dropdown

Hello I am trying to insert data from a database into a dropdown or ChoiceType. The data comes from two different databases.

Here is mine IndexController

:

public function indexAction(Request $request){
 $em = $this->getDoctrine()->getManager();
    //$city = new Cities();->select("c.id,c.active,c.code,t.text name")
 $query = $em->createQueryBuilder()
      ->select("c")
      ->from("DataBaseBundle:Countries","c")
      ->innerJoin("DataBaseBundle:Translationtext","t","WITH","c.translation=t.translation");
 $country = $query->getQuery()->getResult();
 if (!$country){
      throw $this->createNotFoundException("Country not found");
 }
 $form = $this->createForm(CountriesType::class,$country);

 if ($form->isValid()) {
    $user = $form->getData();
    $em->persist($user);
    $em->flush();
}
 return $this->render('ParametersBundle:Countries:index.html.twig', array(
            'form' => $form->createView(),));
     }
}

      

And my form is called CountriesType

:

<?php

namespace ParametersBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

class CountriesType extends AbstractType
{
    private $fooChoices = [
        0 => 'choice naught',
        1 => 'choice one',
        2 => 'choice deuce',
    ];
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder->add('active',CheckboxType::class)
        ->add('countries',TextType::class)
        ->add('countries',ChoiceType::class,['choices' => $this->fooChoices,])
        ->add('save', SubmitType::class, array('label' => 'Create Post'));
    }
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => array(
                'm' => 'Male',
                'f' => 'Female',
            )
            //'data_class' => 'DataBaseBundle\Entity\Cities'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'country';
    }


}

      

FooChoices outputs data from code, not from the database.

EDIT: And my entity (Traslation is in another Traslations database)

    <?php

namespace DataBaseBundle\Entity;

/**
 * Countries
 */
class Countries
{
    /**
     * @var integer
     */
private $id;

/**
 * @var integer
 */
private $active = '1';

/**
 * @var string
 */
private $code2;

/**
 * @var string
 */
private $code3;

/**
 * @var \DataBaseBundle\Entity\Continents
 */
private $continents;

/**
 * @var \DataBaseBundle\Entity\Translation
 */
private $translation;


/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

/**
 * Set active
 *
 * @param integer $active
 *
 * @return Countries
 */
public function setActive($active)
{
    $this->active = $active;

    return $this;
}

/**
 * Get active
 *
 * @return integer
 */
public function getActive()
{
    return $this->active;
}

/**
 * Set code2
 *
 * @param string $code2
 *
 * @return Countries
 */
public function setCode2($code2)
{
    $this->code2 = $code2;

    return $this;
}

/**
 * Get code2
 *
 * @return string
 */
public function getCode2()
{
    return $this->code2;
}

/**
 * Set code3
 *
 * @param string $code3
 *
 * @return Countries
 */
public function setCode3($code3)
{
    $this->code3 = $code3;

    return $this;
}

/**
 * Get code3
 *
 * @return string
 */
public function getCode3()
{
    return $this->code3;
}

/**
 * Set continents
 *
 * @param \DataBaseBundle\Entity\Continents $continents
 *
 * @return Countries
 */
public function setContinents(\DataBaseBundle\Entity\Continents $continents = null)
{
    $this->continents = $continents;

    return $this;
}

/**
 * Get continents
 *
 * @return \DataBaseBundle\Entity\Continents
 */
public function getContinents()
{
    return $this->continents;
}

/**
 * Set translation
 *
 * @param \DataBaseBundle\Entity\Translation $translation
 *
 * @return Countries
 */
public function setTranslation(\DataBaseBundle\Entity\Translation $translation = null)
{
    $this->translation = $translation;

    return $this;
}

/**
 * Get translation
 *
 * @return \DataBaseBundle\Entity\Translation
 */
public function getTranslation()
{


       return $this->translation;
    }
}

      

+3


source to share


2 answers


First, you need to build an array from the returned query, containing the names of the countries:

//IndexController
$country = $query->getQuery()->getResult();
    $data= array();
     foreach ( $country as $c) {
        array_push($data,$c->getTranslation());

    }
    $form = $this->createForm(CountriesType::class,$data);

      

Then you need to pass the parameter array argument to the appended element.
Just replace this line:



     //CountriesType
   ->add('countries',ChoiceType::class,['choices' => $this->fooChoices,])

      

with this:

 ->add('countries',ChoiceType::class,array('choices' => $options))

      

+2


source


  <?php
    namespace ParametersBundle\Form;       
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

    class CountriesType extends AbstractType
    {

        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options){
            $fooChoices = $options['choices'];

            $builder->add('active',CheckboxType::class)
            ->add('countries',TextType::class)
            ->add('countries',ChoiceType::class,['choices' => $fooChoices,])
            ->add('save', SubmitType::class, array('label' => 'Create Post'));
        }
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'choices' => null,
                )
                //'data_class' => 'DataBaseBundle\Entity\Cities'
            ));
        }

        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'country';
        }


    }

      

And finally, to build the form in the controller:



$form = $this->createForm(CountriesType::class,array('choices' => $country));

      

0


source







All Articles