0 like 0 dislike

Üdv!

Újabb elég égető problémába ütköztem symfonyval. Adott egy Product és egy Images entity. A kettő közt onetomany relation van. Egy producthoz több kép is tartozhatna, ha lefutna. A gondom az vele, hogy amit a formról kap adatot az addImage függvény az tömb típusú Images helyett.

<?php
namespace AppBundle\Entity;


use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{

   /**
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Images", mappedBy="product", cascade={"persist","remove"}, orphanRemoval=true)
    * @var \Doctrine\Common\Collections\Collection
    */
protected $images;

/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="string", length=100)
 */
private $name;

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

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

/**
 * @ORM\Column(type="text")
 */
private $description;

/**
 * @ORM\Column(type="text")
 */
private $long_description;

/**
 * @ORM\Column(type="integer")
 */
private $date;

/**
 * Constructor.
 */
public function __construct()
{
    $this->images = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

/**
 * Add images
 *
 * @param \AppBundle\Entity\Images $image
 *
 * @return Product
 */
public function addImage(Images $image){
    $this->images[] = $image;
    $image->setProduct($this);

    return $this;
}

 /**
 * Remove images.
 *
 * @param \AppBundle\Entity\Images $images
 */
 public function removeImage(Images $images)
 {
     $this->images->removeElement($images);
 }

 /**
 * Get images.
 *
 * @return \Doctrine\Common\Collections\Collection
 */
 public function getImages()
 {
     return $this->images;
 }

/**
 * Set name
 *
 * @param string $name
 *
 * @return Product
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}

/**
 * Set imgSrc
 *
 * @param string $imgSrc
 *
 * @return Product
 */
public function setImgSrc($imgSrc)
{
    $this->img_src = $imgSrc;

    return $this;
}

/**
 * Get imgSrc
 *
 * @return string
 */
public function getImgSrc()
{
    return $this->img_src;
}

/**
 * Set description
 *
 * @param string $description
 *
 * @return Product
 */
public function setDescription($description)
{
    $this->description = $description;

    return $this;
}

/**
 * Get description
 *
 * @return string
 */
public function getDescription()
{
    return $this->description;
}

/**
 * Set longDescription
 *
 * @param string $longDescription
 *
 * @return Product
 */
public function setLongDescription($longDescription)
{
    $this->long_description = $longDescription;

    return $this;
}

/**
 * Get longDescription
 *
 * @return string
 */
public function getLongDescription()
{
    return $this->long_description;
}

/**
 * Set date
 *
 * @param integer $date
 *
 * @return Product
 */
public function setDate($date)
{
    $this->date = $date;

    return $this;
}

/**
 * Get date
 *
 * @return integer
 */
public function getDate()
{
    return $this->date;
}

/**
 * Set mainImg
 *
 * @param string $mainImg
 *
 * @return Product
 */
public function setMainImg($mainImg)
{
    $this->main_img = $mainImg;

    return $this;
}

   /**
    * Get mainImg
    *
    * @return string
    */
   public function getMainImg()
   {
       return $this->main_img;
   }
}

Images Entity

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * Images
 *
 * @ORM\Table(name="images")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\Images")
 * @Vich\Uploadable
 */
class Images
{
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Product", inversedBy="images")
     * @ORM\JoinColumn(nullable=false, referencedColumnName="id")
     */
    protected $product;

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

    /**
     * @Vich\UploadableField(mapping="product_images", fileNameProperty="file_name")
     * @var File $image
     */
    protected $image;

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set product.
     *
     * @param \AppBundle\Entity\Product $product
     *
     * @return Images
     */
    public function setProduct(Product $product)
    {
        $this->product = $product;

        return $this;
    }

    /**
     * Get product.
     *
     * @return \AppBundle\Entity\Product
     */
    public function getProduct()
    {
        return $this->product;
    }

    /**
     * Set Image
     *
     * @param File $image
     *
     * @return $this
     */
    public function setImage(File $image)
    {
        $this->image = $image;
        return $this;
    }

    /**
     * Get Image
     *
     * @return File
     */
    public function getImage()
    {
        return $this->image;
    }

    /**
     * Set FileName
     *
     * @param $file_name
     *
     * @return $this
     */
    public function setFileName($file_name){
        $this->file_name = $file_name;

        return $this;
    }

    /**
     * Get FileName
     *
     * @return string
     */
    public function getFileName(){
        return $this->file_name;
    }
}

ProductImageType Form

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Vich\UploaderBundle\Form\Type\VichImageType;

class ProductImageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('image', VichImageType::class, array(
                'required'      => true,
                //'mapped'       => 'product',
                'allow_delete'  => true,
            ))
        ;
    }
    public function setDefaultOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => '\AppBundle\Entity\Images',
        ));
    }
    public function getName()
    {
        return 'product_images';
    }
}

És végül az Easy Admin configjában a form definiálása:

- { property: 'images', type: 'collection', type_options: { entry_type: 'AppBundle\Form\ProductImageType', by_reference: false } }

És ez az ahol a hibát sejtem, csak nem egészen értem, hogy miért tömböt ad át, illetve, hogy ezt hogy kéne kiküszöbölnöm. Köszönöm a válaszokat előre is!

kérdezve Ápr 13, 2016 Symfony kategóriában Ákos Erős (23 pont) által

2 válasz

0 like 0 dislike
Legjobb válasz

Mivel nem jött válasz, közben sikerült félig-meddig megválaszolni a saját kérdésem. Symfony3-ban valószínűleg lehetetlen szépen megvalósítani ezt. A collection form type valamiért nem szeretné, hogy saját adatot adjak vissza belőle, illetve az én adattípusomat belepakolja egy tömbbe, ami innentől eléggé ellehetetleníti (legalábbis igen megnehezíti) a vele való dolgozást. Ugyanakkor symfony 2.8-ra váltva a kódom lefutott (majdnem) hiba nélkül (a fájlfeltöltős része működik )

megválaszolva Ápr 14, 2016 Ákos Erős (23 pont) által
0 like 0 dislike

A formoddal lesz a probléma. SF3 alatt már nincs setDefaultOptions, 2.8 alatt is deprecated. configureOptions kell helyette, használata ugyanaz.

megválaszolva Máj 5, 2016 Práger Ádám (12 pont) által
A Veremcsere a Refaktor Magazinhoz kapcsolódó, barátságos kérdezz-felelek oldal, ahol felteheted a webfejlesztéssel és üzemeltetéssel kapcsolatos kérdésedet.

A részletekért olvasd el az üdvözlő postunkat!
Az oldal valamennyi tartalma a Creative Commons Attribution NonCommercial ShareAlike 3.0 licenc alatt érhető el.

Kapcsolódó kérdések

0 like 0 dislike
0 válasz
kérdezve Jún 2, 2016 Symfony kategóriában Ákos Erős (23 pont) által
0 like 0 dislike
2 válasz
kérdezve Ápr 4, 2016 Symfony kategóriában Ákos Erős (23 pont) által
0 like 0 dislike
0 válasz
1 like 0 dislike
2 válasz
kérdezve Jan 7, 2016 PHP kategóriában Siegl Zoltán (63 pont) által
67 kérdés
142 válasz
354 hozzászólás
113 felhasználó