2013-11-22 90 views
1

我希望用我的控制器内的一种形式,但我得到每次出现以下错误:未能加载类型“局部性”

Could not load type "locality" 

,这里是LY窗体类:

class LocationType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $factory = $builder->getFormFactory(); 

    $builder->add('province','entity',array(
        'class' => 'Acme\DemoBundle\Entity\Province', 
        'property' => 'name')); 

    $refreshLocality = function ($form, $province) use ($factory) { 
     $form->add($factory->createNamed('entity','locality',null, array(
      'class'   => 'Acme\DemoBundle\Entity\Locality', 
      'property'  => 'name', 
      'label'   => 'Locality', 
      'query_builder' => function (EntityRepository $repository) use ($province) { 
            $qb = $repository->createQueryBuilder('locality') 
                ->innerJoin('locality.province', 'province'); 

            if($province instanceof Province) { 
             $qb = $qb->where('locality.province = :province') 
               ->setParameter('province', $province); 
            } elseif(is_numeric($province)) { 
             $qb = $qb->where('province.id = :province_id') 
               ->setParameter('province_id', $province); 
            } else { 
             $qb = $qb->where('province.id = 1'); 
            } 

            return $qb; 
           } 
      ))); 
    }; 

    $builder->add('address','text',array(
        'required' => false)); 

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($refreshLocality) { 
     $form = $event->getForm(); 
     $data = $event->getData(); 

     if($data == null) 
      $refreshLocality($form, null); //As of beta2, when a form is created setData(null) is called first 

     if($data instanceof Location) { 
      $refreshLocality($form, $data->getLocality()->getProvince()); 
      } 
    }); 

    $builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) use ($refreshLocality) { 
     $form = $event->getForm(); 
     $data = $event->getData(); 

     if(array_key_exists('province', $data)) { 
      $refreshLocality($form, $data['province']); 
     } 
    }); 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Acme\DemoBundle\Entity\Location' 
    )); 
} 

public function getName() 
{ 
    return 'acme_demobundle_locationtype'; 
} 

} 

然后我叫这个类在我的控制器:

public function indexAction() 
{ 
    $form = $this->get('form.factory')->create(new \Acme\DemoBundle\Form\LocationType()); 

    $request = $this->get('request'); 
    if ($request->isMethod('POST')) { 
     $form->bind($request); 
     if ($form->isValid()) { 

     } 
    } 

    return array('form' => $form->createView());; 
} 

,在这里我的树枝:

<form action="{{ path('_demo') }}" method="POST" id="contact_form"> 
    {{ form_errors(form) }} 


    {{ form_rest(form) }} 
    <input type="submit" value="Send" class="symfony-button-grey" /> 
</form> 

,当我有上面我试图注册表单中的部分服务在service.xml中的错误:

<service id="form.type.acme_demobundle_locationtype" class="Acme\DemoBundle\Form\LocationType"> 
    <tag name="form.type" alias="acme_demobundle_locationtype" /> 
    </service> 

,但我得到了同样的错误,任何想法?

+0

我的天堂之前没有使用'FormFactory',但是你可能需要在'createNamed'调用中交换''entity'',''locality''参数吗? –

回答

0

您需要交换,你传递给createNamed()的参数:

$form->add($factory->createNamed('entity','locality',null, array(

应该

$form->add($factory->createNamed('locality', 'entity', null, array(

事实上,你甚至可以简化您的代码

$form->add('locality', 'entity', array(
相关问题