2

Doctrine ORMのクラステーブル継承(CTI)をZF2で使用することについて質問がありZend\Formます。私たちのシステムでは、各ユーザーが複数の役割を持つことができ、これらの役割はクラステーブル継承スキームによって定義されるため、役割固有のプロファイルフィールドを定義できます(つまり、「グレードレベル」は学生アカウントにのみ適用されます)。これを構築するために、(CTI「基本」クラス)AccountへのOneToManyアソシエーションを持つエンティティがあります。Account\Role

<?php
namespace CdliPortal\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="account")
 */
class Account implements AccountInterface
{
    // Other Fields Omitted

    /**
     * @ORM\OneToMany(targetEntity="CdliPortal\Entity\Account\Role", mappedBy="account", cascade={"ALL"})
     */
    protected $roles;
}

エンティティZend\Formをバインドするインスタンスをすでに設定しました(ドキュメントのに従いました)。CTIコレクションを除いて、すべてが正常に機能しているように見えます。Formオブジェクトにメンバーを追加します。AccountDoctrineModuleZend\Form\Element\Collection

$roles = $user->getRoles();
if ( count($roles) > 0 ) {
    $formAccount->add(array(
        'type' => 'Zend\Form\Element\Collection',
        'name' => 'roles',
        'options' => array(
            'count' => count($roles),
            'target_element' => $this->serviceLocator->get('cdliportal_form_account_role'),
        ),
    ));
}

rolesただし、上記のように、フィールド(この場合はフィールドセット)を設定するときtarget_elementは、コレクションレベルで指定されます。つまり、コレクションは均一である必要があります。上記のケースtarget_elementでは、コレクションが表すCTIのメンバーに応じて、コレクションの要素ごとに個別に指定できる必要があります。

Accountオブジェクトをバインドするときに、コレクションの要素が自動的に入力されるようにする方法でこれを実現する方法に関するアイデア/アドバイスはありますか?

4

1 に答える 1

1

私は自分のユースケースで機能するソリューションにハッキングしました。NonuniformCollectionプロトタイプのコレクション(CTIエンティティごとに1つ)が渡され、要素が入力されたときに適切なものを複製するカスタムフォーム要素を構築します。

ここにコードを要点に配置しました:https ://gist.github.com/adamlundrigan/5195646

注意点の1つは、使用するプロトタイプがわからないため、テンプレート機能が機能しなくなることです。

誰かアドバイスがあれば、これを達成するためのよりクリーンな方法が示されることを私はまだ開いています:)

于 2013-03-19T12:25:29.440 に答える