Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>OK, I finally figured out how to do it properly:</p> <pre class="lang-php prettyprint-override"><code>namespace Test\TestBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; use Doctrine\ORM\EntityRepository; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\Event\DataEvent; use Test\TestBundle\Entity\Country; use Test\TestBundle\Entity\State; use Test\TestBundle\Entity\City; class CityType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder-&gt;add('name'); $factory = $builder-&gt;getFormFactory(); $refreshStates = function ($form, $country) use ($factory) { $form-&gt;add($factory-&gt;createNamed('entity','state', null, array( 'class' =&gt; 'Test\TestBundle\Entity\State', 'property' =&gt; 'name', 'empty_value' =&gt; '-- Select a state --', 'query_builder' =&gt; function (EntityRepository $repository) use ($country) { $qb = $repository-&gt;createQueryBuilder('state') -&gt;innerJoin('state.country', 'country'); if ($country instanceof Country) { $qb-&gt;where('state.country = :country') -&gt;setParameter('country', $country); } elseif (is_numeric($country)) { $qb-&gt;where('country.id = :country') -&gt;setParameter('country', $country); } else { $qb-&gt;where('country.name = :country') -&gt;setParameter('country', null); } return $qb; }) )); }; $setCountry = function ($form, $country) use ($factory) { $form-&gt;add($factory-&gt;createNamed('entity', 'country', null, array( 'class' =&gt; 'TestBundle:Country', 'property' =&gt; 'name', 'property_path' =&gt; false, 'empty_value' =&gt; '-- Select a country --', 'data' =&gt; $country, ))); }; $builder-&gt;addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshStates, $setCountry) { $form = $event-&gt;getForm(); $data = $event-&gt;getData(); if ($data == null) { return; } if ($data instanceof City) { $country = ($data-&gt;getId()) ? $data-&gt;getState()-&gt;getCountry() : null ; $refreshStates($form, $country); $setCountry($form, $country); } }); $builder-&gt;addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($refreshStates) { $form = $event-&gt;getForm(); $data = $event-&gt;getData(); if(array_key_exists('country', $data)) { $refreshStates($form, $data['country']); } }); } public function getName() { return 'city'; } public function getDefaultOptions(array $options) { return array('data_class' =&gt; 'Test\TestBundle\Entity\City'); } } </code></pre> <p>The jQuery AJAX selector</p> <pre class="lang-js prettyprint-override"><code>$(document).ready(function () { $('#city_country').change(function(){ $('#city_state option:gt(0)').remove(); if($(this).val()){ $.ajax({ type: "GET", data: "country_id=" + $(this).val(), url: Routing.generate('state_list'), success: function(data){ $('#city_state').append(data); } }); } }); }); </code></pre> <p>I hope this will be helpful to somebody else facing the same situation.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload