5

SonataAdmin の ImageAdmin クラスに関連する実際のオブジェクトを取得して操作しようとしています (Symfony 2.3 を使用)。ImageAdmin クラスが使用されている唯一のクラスである場合、これは正常に機能します。しかし、ImageAdmin が別の管理者に組み込まれていると、ひどくうまくいきません。

管理者が埋め込まれていない場合の動作は次のとおりです。

class ImageAdmin extends Admin {
    protected $baseRoutePattern = 'image';

    protected function configureFormFields(FormMapper $formMapper) {
        $subject = $this->getSubject();
    }
}

ただし、これを使用して ImageAdmin を ParentAdmin に埋め込む場合:

class PageAdmin extends Admin {
    protected function configureFormFields(FormMapper $formMapper) {
        $formMapper->add('image1', 'sonata_type_admin');
    }
}

次に、ID 10 の親アイテムを編集し、ImageAdmin で getSubject() を呼び出すと、ID 10 の画像が取得されます。

$this->getModelManager()->find($this->getClass(), $id);つまり、getSubject() は URL から id を抽出し、Parent id と Image id を相互参照する を呼び出します。おっとっと!


だから...私がしたいのは、現在のImageAdminインスタンスでレンダリング/編集されている実際のオブジェクトを、直接編集されているか、埋め込みフォームを介して編集されているかに関係なく、取得できるようにすることです。それ。

多分 getSubject() は吠えるには間違ったツリーですが、$this->getCurrentChild()ImageAdmin::configureFormFields() から呼び出された場合、その ImageAdmin が sonata_type_admin フィールド タイプを使用して埋め込まれている場合でも、false を返すことに注意してください。私はかなり混乱しています...

とにかく、私が見落としていた明らかな方法でオブジェクトを手に入れることが可能であり、誰かが私を啓発するのを助けることができることを願っています!

4

5 に答える 5

13

いくつかのアイデアを提供してくれた Tautrimas に感謝しますが、これに対する答えを見つけることができました。

ImageAdmin で次のように設定します。

protected function configureFormFields(FormMapper $formMapper)
{
    if($this->hasParentFieldDescription()) { // this Admin is embedded
        $getter = 'get' . $this->getParentFieldDescription()->getFieldName();
        $parent = $this->getParentFieldDescription()->getAdmin()->getSubject();
        if ($parent) {
          $image = $parent->$getter();
        } else {
          $image = null;
        }
    } else { // this Admin is not embedded
        $image = $this->getSubject();
    }

    // You can then do things with the $image, like show a thumbnail in the help:
    $fileFieldOptions = array('required' => false);
    if ($image && ($webPath = $image->getWebPath())) {
        $fileFieldOptions['help'] = '<img src="'.$webPath.'" class="admin-preview" />';
    }

    $formMapper
        ->add('file', 'file', $fileFieldOptions)
    ;
}

これは近日中に公開される SonataAdmin クックブックに投稿します!

https://github.com/sonata-project/SonataAdminBundle/issues/1546

于 2013-08-09T12:29:09.590 に答える
2

caponica のソリューションは oneToOne の関係でのみ機能します。私の oneToMany ケースでは、 $parent->$getter() はコレクションを返しますが、現在のサブジェクトを特定する方法がわかりません。このバグレポートを見つけました: https://github.com/sonata-project/SonataAdminBundle/issues/1568、これには修正が含まれていますが、まだ開いているので、すぐにマージされることを願っています:(

編集

いくつかの調査では、これに対する一時的な修正があります: sonata_type_collection で間違った件名を取得するのを修正しました

要するに:

クラスを作成し、このファイルの内容をコピーペーストします: AdminType 次に、これを services.yml に追加し、クラスの名前空間を新しいクラスの名前空間に変更します。

services:
sonata.admin.form.type.admin:
    class: ACME\AdminBundle\Form\Type\AdminType
    tags:
        - { name: form.type, alias: sonata_type_admin }

ただし、まだバグがあります。

また、親ドキュメントで cascade_validation が有効になっており、埋め込みフォームにエラーがある場合、修正が機能しません。

于 2014-04-02T14:54:26.123 に答える
0

私は同じ問題を抱えていました.「カスタムフォームタイプ拡張機能」を介してこれを行うことができます.

それは完璧なソリューションです..

于 2014-07-04T04:03:06.980 に答える