AndreyShakhtarin
@AndreyShakhtarin
Один из Землян

Как правильно сохранять картинки в симфони средствами Array Collection?

Всем доброго времени суток! Столкнулся с ситуацией в symfony 2, такой как правильное сохранение картинок в базу данных через средства ArrayCollection.
Что имею:

Есть сущность Product (даные продукта),
App\EducationBundle\Entity\Product:
    type: entity
    table: product
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    fields:
        name:
            type: string
            length: 255
       ......................................
    oneToMany:
        image:
            targetEntity: Image
            cascade:  [persist]
            mappedBy: product

и сущность Image (картинки> к данному продукту):
App\EducationBundle\Entity\Image:
    type: entity
    table: image_product
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    fields:
        image:
            type: string
            length: 255
        .................................................
    manyToOne:
        product:
            targetEntity: Product
            inversedBy: image
            joinColumn:
                name: product_id
                referencedColumnName: id

К ним формы:
class ImageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('image', FileType::class)
                ->add('descimage', TextareaType::class);

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Image::class,
        ));
    }
}

class ProductType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $current_user = $this->getUser();
        $builder
            ->add('name', HiddenType::class)
            ->add('product')
            ->add('price')
            ->add('short_description')
            ->add('description')
            ->add('brochure', FileType::class, array('label' => 'Type File'))
            ->add('company')
            ->add('logo')
            ->add('location')
            ->add('url' , HiddenType::class)
            ->add('user_foto', FileType::class, array('label' => 'Upload File'))
            ->add('save', SubmitType::class);
        $builder->add('image', CollectionType::class, array(
            'entry_type' => ImageType::class,
            'prototype' => true,
            'allow_add' => true,
            'allow_delete' => true,

        ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Product::class,
        ));
    }

Настроены связи между двумя сущностями:
Сущность Product
class Product {
//..................
/**
     * Add image
     *
     * @param \App\EducationBundle\Entity\Image $image
     *
     * @return Product
     */
    public function addImage(\App\EducationBundle\Entity\Image $image)
    {

        $this->image[] = $image;
        $image->setProduct($this);
        $this->image->add($image);
        return $this;
    }
//...............


сущность Image:
class Image {
//...................
/**
     * Set product
     *
     * @param \App\EducationBundle\Entity\Product $product
     *
     * @return Image
     */
    public function setProduct(\App\EducationBundle\Entity\Product $product = null)
    {

        $this->product = $product;
    }
//......................................


subform:twig
<td colspan="8" class="tags" data-prototype=" <span class='label-key '>{{ form_label(form.image.0)|e }} </span><span class='image-label'>{{ form_label(form.image.0.image)|e }}</span><span class='image-widget'>{{ form_widget(form.image.0.image)|e }}</span> <span class='description-label'>Description image</span><span class='description-widget'>{{ form_widget(form.image.0.descimage)|e }}</span>">
 </td>


контроллер:
public function createAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        $product = new Product();
        $img = new Image();

        //$img->setProdimage(null);
        $product->getImage()->add($img);


        $form = $this->createForm(ProductType::class, $product);
        $form->handleRequest($request);

        $product->setName($this->getUser());

        if ($form->isSubmitted() && $form->isValid()) {
            $file = $product->getBrochure();
            $fileName = rand(1111, 9999).md5(uniqid()).'.'.$file->guessExtension();

            $file->move(
                $this->getParameter('brochures_directory'),
                $fileName
            );

            if($img->getImage())
            {
                $imagefile = $img->getImage();
                $imagefileName = md5(uniqid()).'.'.$imagefile->guessExtension();
                $imagefile->move(
                    $this->getParameter('image_directory'),
                    $imagefileName
                );
                $img->setImage($this->getParameter('image_directory').$imagefileName);
                $em->persist($img);
            }

            $img->setProduct($product);

            $product->setBrochure($this->getParameter('brochures_directory').$fileName);


            //print_r($images);

            $em->persist($product);
            //$em->flush();
            //return $this->redirectToRoute('product_show', array('id' => $product->getId()));
        }

        $data['form'] = $form->createView();
        return $this->render('AppEducationBundle:Products:create.html.twig', $data);
    }

В чем собственно основная загвоздка?!
сущность Image сохраняется следующим образом:
Первый объект: сохраняется как положено есть путь до картинки абсолютный, описание к картинке, id продукта который сохраняется как положено.
второй объект данной сущности и последущии объекты:
путь не верный, сгенерированный UploadedFile (tmp/....) приходит объект не данные типа string, id записалось null, описание к картинке сохранилось как положено (то что заполнено в форме то и записалось ), после не долгих исканий и изучения того как и что и куда приходит понял, что возможная причина связана с данными местом $product->getImage()->add($img); точнее нужно его реализовать так или из сущности или контролера, что б последущии объекты динамически добавляли связь данной сущности. Помогите добрые люди!!!))))
  • Вопрос задан
  • 583 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы