2013-01-24 36 views
2

我試圖在Symfony 2.1中顯示帶optgroup的選擇框。 我的實體樹是:客戶有項目,項目有部分(Part->getProject()->getClient()Symfony2:在實體字段中使用group_by選項

我想顯示我的選擇框是這樣的:

<select> 
    <optgroup>Client name 
     <option>Part name</option> 
     <!-- ... --> 
    </optgroup> 
    <!-- ... --> 
</select> 

symfony的文檔並不有很大的幫助。 我工作表單生成器(無GROUP_BY選項)給了我一個簡單的選擇:

$this->createFormBuilder() 
->add('part','entity',array(
    'class'   => 'SGLFLTSPartBundle:Part', 
    'property'  => 'name', 
    'query_builder' => function (\SGL\FLTS\PartBundle\Entity\PartRepository $er) { 
     return $er->createQueryBuilder('p'); 
    })) 
->getForm(); 

如何添加GROUP_BY選項顯示客戶的名字嗎?到目前爲止,我已經試過

'group_by'  => 'project.client.name' 
'group_by'  => 'project.client' 
'group_by'  => 'ppc.name' // the DQL table alias 

這一切都使PHP錯誤

我還試圖以顯示項目名稱只是作爲OPTGROUP,沒有運氣:

'group_by'  => 'project' 
'group_by'  => 'project.name' 
'group_by'  => 'project.id' // throws no error, giving me <optgroup label="1"> ... 

,並試圖將項目/客戶端加入到createQueryBuilder中

$er->createQueryBuilder('p')->select('p, pp')->leftJoin('p.project','pp'); 
$er->createQueryBuilder('p')->select('p, pp.name')->leftJoin('p.project','pp') 
// wrong 

謝謝!

回答

6

今天我有類似的問題。

我想你已經看到很多PHP錯誤與對象的不正確使用作爲數組鍵有關嗎?這是由Symfony嘗試將整個相關對象用作分組結果數組中的數組鍵所引起的。

我需要進一步研究它一個更好的解決方案,但對於其間,這是我使用的是什麼...

添加一個新方法到Part實體,稱爲getClientName,看起來像這樣:

public function getClientName() 
{ 
    // safety measure in-case a part hasn't been assigned to a project 
    if (null === $this->getProject()) { 
     return null; 
    } 
    // safety measure in-case a project hasn't been assigned to a client 
    if (null === $this->getProject()->getClient()) { 
     return null; 
    } 
    return $this->getProject()->getClient()->getName(); 
} 

設置group_by選項clientName在表單字段生成器:

$this->createFormBuilder() 
->add('part','entity',array(
    'class'   => 'SGLFLTSPartBundle:Part', 
    // this property will be processed by Symfony as `$part->getClientName()` 
    'property'  => 'clientName', 
->getForm(); 

使用此額外方法背後的想法是給Symfony一個類方法,它可以調用以獲取字符串值來執行分組。

如果其他人有一個更優雅的解決方案,我很想看到它。

+0

太好了,謝謝。我通過添加'group_by'選項(您編寫'property')進行了更新。另外我有一個錯誤「實體沒有找到。」在查詢內部沒有內部聯接。 – sglessard

+0

''group_by'=>'clientName''選項背後的想法是這樣的:第120行的ObjectChoiceList將使用此對象屬性(或類方法)對對象進行分組。由於我無法直接從DQL中的連接中獲得客戶端的標題,因此我需要'getClientName'方法來爲我返回這個值。在DQL中加入相關對象應確保相關對象已經被初始化,並且不需要對集合中的每個實體調用DB。 'property'選項仍然應該是'group_by'。我的例子需要改變以適應你的環境。 – Iain

+1

是的,我明白了。儘管如此,'createFormBuilder'例如陣列需要編輯和我一樣以前:'「屬性」 =>「名」,「GROUP_BY」 =>「CLIENTNAME」,' – sglessard

相關問題