2

Symfony2.1でoptgroupsを含む選択ボックスを表示しようとしています。私のエンティティツリーは次のとおりです。クライアントにはプロジェクトがあり、プロジェクトにはパーツがあります(Part->getProject()->getClient()

選択ボックスをこのように表示したい:

<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

ありがとう!

4

1 に答える 1

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 に、グループ化を実行するための文字列値を取得するために呼び出すことができるクラス メソッドを与えることです。

他の誰かがよりエレガントなソリューションを持っているなら、私はそれを見たいと思っています。

于 2013-01-25T05:04:33.407 に答える