0

フォームを生成するために異なるタイプを使用している Web を変更する必要があります。Bundle/Form/ フォルダーに 2 つのファイルがあります。

  • ProductType.php
  • ProductEditType.php

最初のものは新しい製品フォームを生成するために使用され、2 つ目はフォームを編集するために使用されます。

両方のファイルのほぼ 95% が同じであるため、1 つのタイプを使用して複数のフォームを生成するには、何らかの方法で存在する必要があると思います。

フォームイベントを使用してフォームを変更する方法について読んでいますが、それについての一般的な良い習慣が何であるかを明確に見つけていません.

どうもありがとう。

アップデート

次のように Event Subscriber を書きました。

<?php
namespace Project\MyBundle\Form\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Description of ProductTypeOptionsSubscriber
 *
 * @author Javi
 */
class ProductTypeOptionsSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents() {
        return array(FormEvents::PRE_SET_DATA => 'preSetData');
}

public function preSetData(FormEvent $event){

    $data = $event->getData();
    $form = $event->getForm();

    if( !$data || !$data->getId() ){
        // No ID, it's a new product
        //.... some code for other options .....
        $form->add('submit','submit',
            array(
                'label' => 'New Produtc',
                'attr'  => array('class' => 'btn btn-primary')
                ));
    }else{
        // ID exists, generating edit options .....
        $form->add('submit','submit',
            array(
                'label' => 'Update Product',
                'attr'  => array('class' => 'btn btn-primary')
                ));
    }

}
}

ProductType の buildForm 内:

$builder->addEventSubscriber(new ProductTypeOptionsSubscriber());

それだけです。非常に簡単に記述でき、問題なく動作します。

4

1 に答える 1

0

このクックブックイベント サブスクライバーを読むことができます。最初のシナリオで実行できます。

ドキュメントの例に戻ります..

次の方法で変更するフィールドを追加します。

$builder->addEventSubscriber(new AddNameFieldSubscriber());

次に、ロジックを入力してイベント イベント サブスクライバーを作成します。

// src/Acme/DemoBundle/Form/EventListener/AddNameFieldSubscriber.php
namespace Acme\DemoBundle\Form\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class AddNameFieldSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        // Tells the dispatcher that you want to listen on the form.pre_set_data
        // event and that the preSetData method should be called.
        return array(FormEvents::PRE_SET_DATA => 'preSetData');
    }

    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        // check if the product object is "new"
        // If you didn't pass any data to the form, the data is "null".
        // This should be considered a new "Product"
        if (!$data || !$data->getId()) {
            $form->add('name', 'text');
            ....
            ..... // other fields
        }
    }
}
于 2013-10-07T20:01:07.333 に答える