Столбец доктрины OneToMany с коллекцией FormType - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть 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.

...