2012-10-02 71 views
0

我對Symfony2中的服務和表單有疑問,所以我創建了我的表格,我希望添加一個城市的多選列表,然後我想從另一個班級「城市」中獲取城市列表。 ,所以我怎樣才能在我的表單中使用「服務」來調用我的班級「城市」以獲得一個函數「getcities」來返回一個城市列表? (我這裏不使用Doctrine)...呼叫班表使用服務

編輯

namespace Acme\DemoBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class CityType extends AbstractType 
{ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'choices' => array(/** 
        * Here I will call function getcities(return list of cities) 
         */ 

     ) 
    )); 
} 

public function getParent() 
{ 
    return 'choice'; 
} 

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

類City.php:

Class City { 

    /** 
    * here i will get list of cities 
    */ 


    public function getcities() 
    { 
    ..... 
    return $Listcities; 
    } 

    } 

所以我想用 「服務」 來調用函數「getcities 「 通知?

+0

我們可以看到,到目前爲止,你已經嘗試了什麼? – RobMasters

+0

您可以在我的第一條消息中看到我的編輯 – Nll

回答

2

表單對象不是容器感知的......至少,它們並不意味着。也就是說,你的控制器應該使用服務來獲取城市,然後它應該通過構造函數或方法將該列表傳遞給表單對象。

控制器:

class SomethingController 
{ 
    public function someAction() 
    { 
     ... 
     $cities = $this->get("citiesService")->getCities(); 
     $form = $this->createForm(new SomeType($cities), $someEntity); 
     ... 
    } 
} 

形式:

class SomeType extends AbstractType 
{ 
    private $cities; 

    public function __construct($cities) 
    { 
     $this->cities = $cities; 
    } 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     // Now you have access to $this->cities, so you can use it to build the form 
    } 
} 
+0

好的,我明白了,但這是使用服務調用函數的唯一方法,因爲在需要城市列表時,我將以其他幾種形式使用此表單。 – Nll

+0

以及我如何在我的表單中的多選列表中調用我的函數? – Nll

+0

是的:您需要爲需要城市列表的每個表單實施此操作。要實現多選,請按照以下文檔進行操作:http://symfony.com/doc/2.0/reference/forms/types/choice.html 具體來說,您需要使用「choice」類型,並且你會確保'multiple'選項被設置爲'true'。 –

0

你可以設置城市對象作爲表單數據的對象?

因此它可以看起來像......

$form = $this->createForm(new SomeType(), new City());

class SomeType extends AbstractType 
{ 
    public buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $formFactory = $builder->getFormFactory(); 

     $builder->addEventListener(
      FormsEvents::PRE_SET_DATA, 
      function (FormEvent $event) use ($formFactory) { 
       $event->getForm()->add(
        $formFactory->createNamed(
         'gender', 
         'choice', 
         null, 
         array(
          'choices' => $event->getData()->getCites() 
         ) 
        ) 
       ); 
      } 
     ); 
    } 
} 
+0

這似乎工作,但我想與我的代碼整合... – Nll