У меня есть CollectionType, который я пытаюсь использовать, чтобы вставить несколько строк в сущность MotorsAdsFile
(сущность изображения) и связать их с текущей сущностью через id
.Я использую Blueimp и каждый раз при загрузке изображения создаю новый виджет, подобный этому
scripts.js
$('.file-uploader').bind('fileuploaddone', function(e, data) {
$.each(data.files, function(index, file) {
$('.file-uploader').addAnotherWidget(file.name);
});
});
// $('.add-another-collection-widget').click(function(e) {
$.fn.addAnotherWidget = function(fileName) {
// var list = $($(this).attr('data-list'));
var list = $(this);
// Try to find the counter of the list
var counter = list.data('widget-counter') | list.children().length;
// If the counter does not exist, use the length of the list
if (!counter) {
counter = list.children().length;
}
// grab the prototype template
var newWidget = list.attr('data-prototype');
// replace the "__name__" used in the id and name of the prototype
// with a number that's unique to your emails
// end name attribute looks like name="contact[emails][2]"
newWidget = newWidget.replace(/__name__/g, counter);
// Increase the counter
counter++;
// And store it, the length cannot be used if deleting widgets is allowed
list.data(' widget-counter', counter);
// create a new list element and add it to the list
var newElem = $(list.attr('data-widget-tags')).html(newWidget);
newElem.appendTo(list);
// $('.file-uploader').find('#listing_images_'+counter).attr('value', 'asdf');
var input = counter-1;
$('#listing_images_'+input).val(fileName);
};
Поэтому я создаю новый виджет и делаю егозначение имени файлаMy CollectionType, который находится в форме ListingType
(основной объект, к которому должны быть прикреплены изображения, выглядит следующим образом
ListingType.php
->add('images', CollectionType::class, [
'label' => 'Drop files here',
// 'existingFiles' => $options['existingFiles'],
// 'editId' => $options['editId'],
'entry_type' => BlueimpType::class,
'prototype' => true,
'allow_add' => true,
'attr' => [
'class' => 'file-uploader',
'data-widget-tags' => '<li></li>',
],
'allow_delete' => true,
'entry_options' => [
'attr' => ['class' => ''],
],
])
И Blueimp, пользовательский тип, который я создал, является
BlueimpType.php
<?php
namespace DirectoryPlatform\FrontBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use AdamQuaile\Bundle\FieldsetBundle\Form\FieldsetType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
class BlueimpType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
// default form options
'existingFiles' => '',
'listing_id' => '',
'editId' => '',
'data_class' => 'DirectoryPlatform\AppBundle\Entity\MotorsAdsFile',
));
}
/**
* {@inheritdoc}
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars['existingFiles'] = $options['existingFiles'] ?? [];
$view->vars['editId'] = $options['editId'] ?? [];
}
public function getParent()
{
return TextType::class;
}
}
OneToMany
и соответствующие методы находятся в сущности Listing.php
Listing.php
/**
* @ORM\OneToMany(targetEntity="MotorsAdsFile", mappedBy="listing", cascade={"persist"}, orphanRemoval=true)
*/
private $images;
/**
* @param mixed $images
*/
public function setImages($images)
{
$this->images = $images;
}
/**
* @return mixed
*/
public function getImages()
{
return $this->images;
}
И в MotorsAdsFile.php
(объект изображения) у меня есть ManyToOne
для изображения
MotorsAdsFile.php (Image entity)
<?php
namespace DirectoryPlatform\AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="DirectoryPlatform\AppBundle\Repository\MotorsAdsFileRepository")
* @ORM\Table(name="motorsadsfile")
*/
class MotorsAdsFile
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORM\ManyToOne(targetEntity="Listing", inversedBy="images")
* @ORM\JoinColumn(name="listing_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $listing;
/**
* @ORM\Column(type="string", length=255, name="images")
*/
protected $image;
/**
* @return mixed
*/
public function getImage()
{
return $this->image;
}
/**
* @param mixed $image
*/
public function setImage($image)
{
$this->image= $image;
}
/**
* @return mixed
*/
public function getListing()
{
return $this->listing;
}
/**
* @param Listing $listing
*/
public function setListing(Listing $listing)
{
$this->listing = $listing;
}
}
Я пробовал такие вещи, как использование класса данных как, не в BlueimpType.php
, а как часть CollectionType
, но я получаю Cannot read index "1" from object of type "Directory Platform\AppBundle\Entity\MotorsAdFile" because it doesn't implement \ArrayAccess.
и использование TextType
безрезультатно. Я не уверен, где именно я должен реализовать data_class
, в CollectionType
или в BlueimpType
. Если я установлю его как параметр по умолчанию в BlueimpType
Я получаю ошибку, которая The object could not be created
, но если я установлю ее в CollectionType
, я получаю вышеуказанную ошибку о ArrayAccess
.