簡體   English   中英

Symfony表單下拉列表

[英]Symfony form dropdown for entries

我從在Symfony中進行編碼開始,遇到以下問題:

假設我有兩個實體“客戶”和“項目”。 它們與學說一起存儲。

客戶有一個ID,名稱和電子郵件項目有一個ID,client_id,名稱

因此,一個項目基本上屬於一個客戶,一個客戶有很多項目。

我現在的問題是:

在創建項目時,我希望所有可能的客戶都有一個下拉菜單。 當我可能在項目的其他地方使用客戶端的方法時,我在問自己是否有一種聰明的方法來處理這樣的事情:

class ProjectType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');
        $builder->add('client', new ClientListType()); 
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
                    'data_class' => 'AppBundle\Entity\Project'
                    ));
    }


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

class ProjectController extends Controller
{

    public function createAction(Request $request)
    {
        $project = new Project();
        $options = array( ... );
        $form = $this->createForm(new ProjectType(), $project, $options);
        $form->handleRequest($request);
        if($form->isValid()){
            // persist project
            return $this->redirectToRoute('show_projects');
        }
        return $this->render('AppBundle:Client:create.html.twig', array(
                    'form' => $form->createView()
                    ));
    }
}

其中, ClientListType將所有可能的Clients的select語句添加到表單。 $ form-> isValid()檢查客戶端(id)是否有效。

目前,我在ProjectType中具有以下代碼來生成下拉菜單項:

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

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', 'text');
    $builder->add('client', 'choice', array(
                'choices' => $this->buildChoices()
                ));
}

public function buildChoices()
{
    $res = array();
    foreach ($this->clients as $client) {
        $res[$client->getId()] = $client->getName();
    }
    return $res;
}

但是我假設有一種更好的方法來執行此操作,因為這似乎是一個常見問題。

我要做的就是這樣:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', 'text')
            ->add('client', 'entity', array(
            'class'=>'AppBundle\Entity\Client',
            'property'=>'name'
        )); 
}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM