0

フォームのコレクション フィールドに問題があります。私はSymfonyが初めてなので、それが問題かもしれません。あなたが私を助けてくれることを願っています。

「TrOrder」という名前のエンティティがあります。

/**
* @ORM\Entity(repositoryClass="projectName\TrOrderBundle\Entity\TrOrderRepository")
*/
class TrOrder
{
    /**
     *  @ORM\Id
     *  @ORM\Column(type="integer")
     *  @ORM\GeneratedValue
     *  @Assert\NotBlank()
    */
    protected $id;

    /**
     *  @ORM\ManyToOne(targetEntity="projectName\UserBundle\Entity\Client", inversedBy="trOrders")
     *  @ORM\JoinColumn(name="client_id", referencedColumnName="id", nullable=false)        
     *  @Assert\NotBlank(message = "Por favor, selecciona el cliente tramitador.")
    */
    protected $client;

    /**
     * @ORM\OneToMany(targetEntity="projectName\TrOrderBundle\Entity\TrOrderAttachment", mappedBy="trOrder")
     */
    protected $attachments;

    ...

}

ご覧のとおり、「添付ファイル」フィールドには、「TrOrderAttachment」という別のエンティティとの OneToMany 関係があります。

/**
* @ORM\Entity(repositoryClass="projectName\TrOrderBundle\Entity\TrOrderAttachmentRepository")
* @ORM\HasLifecycleCallbacks
*/
class TrOrderAttachment
{
    /**
     *  @ORM\Id
     *  @ORM\Column(type="integer")
     *  @ORM\GeneratedValue
    */
    protected $id;

    /**
     *  @ORM\ManyToOne(targetEntity="projectName\TrOrderBundle\Entity\TrOrder", inversedBy="attachments")
     *  @ORM\JoinColumn(name="trorder_id", referencedColumnName="id")
    */
    protected $trOrder;

    /**
     *  @ORM\ManyToOne(targetEntity="projectName\TrOrderBundle\Entity\AttachmentType")
     *  @ORM\JoinColumn(name="attachmenttype_id", referencedColumnName="id")
    */
    protected $attachmentType;

    /** @ORM\Column(type="string", length=255) */
    protected $fileName;

    public $file;  

    ...
}   

Collection フィールドを作成した TrOrder のフォームを作成しました。

class TrOrderType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {   
        // Crea un array con los subordinados del cliente registrado
        $subordinates = $this->subordinates;        
        $sub = array();        
        foreach ($subordinates as &$subord)
            $sub[$subord->getId()] = $subord->getAdminName() . " (" . $subord->getId() . ")";

        // Crea los campos del formulario
        $builder    
            ...
            ->add('attachments', 'collection', array(
                                                   'required' => false,
                                                    'type'           => new               TrOrderAttachmentType(),
                                                    /*'allow_delete'   => true,*/
                                                    'allow_add' => true,
                                                    'prototype' => true,
                                                    'by_reference' => false,
                                                    ))
            ...
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'projectName\TrOrderBundle\Entity\TrOrder'/*,
            'csrf_protection' => false*/
        ));
    }

    public function getName()
    {
        return 'nencargo';
    }
}

TrOrderAttachment の形式は次のとおりです。

class TrOrderAttachmentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('attachmentType', 'entity', array( 'label' => 'Tipo de adjunto',
                                                     'class' => 'TrOrderBundle:AttachmentType'))
            ->add('file', 'file', array('label' => 'Archivo', 'required' => false))
            ;
    }
    public function setDefaultOptions(OptionsResolverInterface $resolve)
    {
        $resolve->setDefaults(array(
            'data_class' => 'projectName\TrOrderBundle\Entity\TrOrderAttachment'
        ));
    }
    public function getName()
    {
        return 'attachment';
    }
}

TrOrder の html.twig に、次のような添付フィールドを含めました。

{{ form_widget(formulario.attachments) }}
<input class="jslink" type="submit" value="Add new file" />

そして、いくつかの js コード:

function add() {
            var collectionHolder = $('#nencargo_attachments');
            var prototype = collectionHolder.attr('data-prototype');
            // Sustituye __name__ con el número de hijos que tiene el div #nencargo_attachments, es decir, la cantidad de archivos adjuntos que hay.
            var form = prototype.replace(/__name__/g, collectionHolder.children().length);
            $(form).filter('div').first().html($(form).html() +'<a class="delete_link" href="#">Remove</a>');
            collectionHolder.append(form);
        }

        $('input.jslink').click(function(event){
            event.preventDefault();
            add();
        });

        $(document).on('click', 'a.delete_link',function(event){
            $(event.currentTarget).parent().remove();
        });

私の質問は、添付ファイルを TrOrder のフィールド添付ファイルに保存するにはどうすればよいですか? また、TrOrderAttachment にも保存する必要があります。それがどのように行われるのかわかりません。

良い回答をいただければ幸いです。

4

1 に答える 1

1

trorder エンティティの attachments プロパティで永続化をカスケードする必要があります。詳細はこちら

フォームが送信されたら、getData メソッドを使用してエンティティを取得します。次に、単にそれを永続化します。

短い回答で申し訳ありませんが、私は自分の電話にいます。

于 2013-09-18T06:30:17.987 に答える