Всем доброго времени суток! Столкнулся с ситуацией в 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); точнее нужно его реализовать так или из сущности или контролера, что б последущии объекты динамически добавляли связь данной сущности. Помогите добрые люди!!!))))