8

そのため、Sonata Adminの編集アクションでは、作成または編集コンテキストに応じて異なるフォームフィールドを表示しようとしています。

たぶん、最初にいくつかの背景。

GalleryエンティティとCoverPhotoエンティティがOneToOneにバインドされています。

ギャラリー:

/**
 * @ORM\OneToOne(targetEntity="CoverImage", mappedBy="gallery", cascade={"all"}, orphanRemoval=true)
 **/
private $cover;

表紙画像:

/**
 * @ORM\OneToOne(targetEntity="Gallery", inversedBy="cover")
 **/
private $gallery; 

対応するGalleryAdminクラスは次のとおりです。

class GalleriesAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
                -> add('name', null, array('label' => 'Nazwa'))
                -> add('category', 'sonata_type_model', array('label' => 'Kategoria'), array('subject' => $this -> getSubject()))
                -> add('cover', 'sonata_type_admin', array('label' => 'Okładka'))
                -> add('images', 'sonata_type_collection', array('by_reference' => false, 'label' => 'Powiązane zdjęcia'), array(
                    'edit' => 'inline',
                    'sortable' => false,
                    'inline' => 'table',
                ))
            ;
    }

    //other stuff 
}

そして、ここでCoverImageAdminを使用します。

class CoverImagesAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
                -> add('path', 'thumbnail', array('label' => 'Miniatura'))
                -> add('file', 'file', array('required' => false, 'label' => 'Plik'))
        ;
    }
}

「サムネイル」は、サムネイル(ショッカー)を表示するカスタムフォームフィールドです。しかし今、私はこのフィールドが「編集」コンテキストでのみ表示されるようにしたい。

これはケーキのはずです

$this -> getSubject()

Adminクラスと条件のメソッド。残念ながら、ネストされたフォームのレンダリングに使用されるCoverImagesAdminクラスでgetSubject()を呼び出すと、常にnullが返されます。getParent();と同じです。

getForm()を呼び出すと、

致命的なエラー:「500」の最大関数ネストレベルに達し、中止しました!/home/flameheart/Projects/KolberPhotography/vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/Options.phpの350行目

フォームのコンテキストを判別するためだけに、AdminとFormMapperのすべてのメソッドを呼び出そうとしましたが、結局何も起こりませんでした。

皆さんはこれをきれいな方法で解決する方法を知っていますか?

4

3 に答える 3

19

私はこの方法でそれを行うことができました:

protected function configureFormFields(FormMapper $formMapper)
{

    if($this -> getRoot() -> getSubject() -> getCover() && $this -> getRoot() -> getSubject() -> getCover() -> getId() )
    {
        $formMapper -> add('path', 'thumbnail', array('label' => 'Miniatura', 'attr' => array('id' => 'gallery_cover_image'), 'label_attr' => array('id' => 'gallery_cover_label')));
    }

    $formMapper -> add('file', 'file', array('required' => false, 'label' => 'Plik'));
}

Imo、このソナタのことは、さらなる開発ではなく、大量のドキュメントとリファクタリングが本当に必要です。

于 2013-01-06T12:58:11.420 に答える
7

それは古い質問ですが、これを行うために私が見つけた最もクリーンな方法は次のとおりです。

$this->id($this->getSubject())

true を返す場合は編集フォーム、false を返す場合は作成フォームです。

于 2014-02-13T18:21:35.787 に答える
0

で admin 内のサブジェクトを取得でき、function で admin 関数$this->subjectExists()のコンテキストを確認できます。true の場合は編集中、そうでない場合は作成中です。configureFormFields()$this->subjectExists()

于 2018-07-09T10:37:48.763 に答える