フォームのコレクション フィールドに問題があります。私は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 にも保存する必要があります。それがどのように行われるのかわかりません。
良い回答をいただければ幸いです。