Witam,
opierając się na podpowiedzi
http://forum.php.pl/index.php?s=&showt...t&p=1039759 próbuję skonstruować upload obrazków z możliwością dodawania z dysku bądź podania linku do obrazka. Chcę przechowywać jedynie nazwę obrazka w Entity np. usera jako awatar, czy jakiejkolweiek innej i na podstawie tej nazwy i nazwy Entity będę generował odpowiedni link do obrazka, ale to nie w tym problem.
Utknęłem w miejscu gdzie przed walidacją chcę pobrać do katalogu tymczasowego obrazek z linku i utworzyć na jego podstawie objekt UploadedFile.
Właśnie w tym miejscu var_dump zwraca wartość null:
UploadImageType
<?php
namespace FP\Media\UploadBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
class UploadImageType extends AbstractType {
public function buildForm
(FormBuilderInterface
$builder, array $options) { $builder->add('image_from_url', 'url', array( //'label' => 'z linku',
'class' => 'image_from_url'
),
'required' => false
));
$builder->add('image_from_disc', 'file', array( //'label' => 'z dysku',
'accept' => 'image/*',
'class' => 'image_from_disk'
),
'required' => false
));
/**
* Pobieranie obrazka z linku
*/
$builder->addEventListener(
FormEvents::POST_SET_DATA, function(FormEvent $event) {
$image = $event->getData();
$form = $event->getForm();
// pobieranie obrazka z linku jeśli ustawiony image_from_url
//if (!$product || null !== $image->getImageName()) {
// $form->add('image_name', 'text');
//}
}
);
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array( 'data_class' => 'FP\Media\UploadBundle\Form\Domain\Image',
));
}
public function getName() {
return 'upload_image';
}
}
Tak dodaję go do form User w Sonata Admin (ale to chyba bez znaczenia gdzie, form to form):
(...)
protected function configureFormFields(FormMapper $formMapper) {
$transformer = new ImageToNameTransformer();
$formMapper
->add('nameMain', 'text')
->add('nameTranslate', 'text', array('required' => false)) ->add('description', 'textarea', array('required' => false)) ->add(
$formMapper->create('imageName', 'upload_image', $imageFieldOptions)
->addModelTransformer($transformer)
)
;
}
(...)
ImageToNameTransformer (ze względu na to, że przechowuję tylko nazwę obrazka)
<?php
namespace FP\Media\UploadBundle\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use FP\Media\UploadBundle\Form\Domain\Image;
class ImageToNameTransformer implements DataTransformerInterface {
/**
* @return Image
*/
public function transform($imageName=null) {
$image = new Image();
$image->setImageName($imageName);
return $image;
}
/**
* Transforms an object (image) to a string (name).
*
* @param Image|null $image
* @return string
*/
public function reverseTransform($image) {
if (null === $image) {
return '';
}
return $image->getImageName();
}
}
Jak teraz dostać się w tym EventListener do przesłanej wartości 'image_from_url' i pobrać obrazek z tego linku wywołując metodę downloadImage, która jest aktualnie w objekcie Image.
Gdyż $image = $event->getData(); zwraca null.
Proszę o podpowiedzi czy idę w dobrym kierunku.