bundle/w3des/AdminBundle/src/Form/Type/AdvFileType.php line 54

Open in your IDE?
  1. <?php
  2. namespace w3des\AdminBundle\Form\Type;
  3. use Symfony\Component\Form\AbstractType;
  4. use Symfony\Component\Form\FormBuilderInterface;
  5. use Symfony\Component\OptionsResolver\OptionsResolver;
  6. use Symfony\Component\Form\Extension\Core\Type\FileType as BasicFileType;
  7. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  8. use Symfony\Component\Form\FormEvents;
  9. use Symfony\Component\Form\FormEvent;
  10. use w3des\AdminBundle\Entity\File;
  11. use Symfony\Component\Form\CallbackTransformer;
  12. use w3des\AdminBundle\Service\Values;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Component\HttpFoundation\File\UploadedFile;
  15. class AdvFileType extends AbstractType
  16. {
  17. private $values;
  18. private $em;
  19. public function __construct(Values $values, EntityManagerInterface $em)
  20. {
  21. $this->values = $values;
  22. $this->em = $em;
  23. }
  24. /**
  25. * {@inheritdoc}
  26. */
  27. public function buildForm(FormBuilderInterface $builder, array $options)
  28. {
  29. $builder->addModelTransformer(new CallbackTransformer(function (File $file = null) {
  30. $model = [
  31. 'remove' => false,
  32. 'path' => null,
  33. 'meta' => null,
  34. 'width' => null,
  35. 'height' => null,
  36. 'mime' => null,
  37. 'file' => null,
  38. 'previous' => $file
  39. ];
  40. if ($file) {
  41. $model['path'] = $file->getPath();
  42. $model['meta'] = $file->getMeta();
  43. $model['mime'] = $file->getMime();
  44. $model['width'] = $file->getWidth();
  45. $model['height'] = $file->getHeight();
  46. }
  47. return $model;
  48. }, function (array $data = null) {
  49. if ($data['file'] instanceof UploadedFile || $data['remove']) {
  50. if ($data['previous'] && $data['previous']->getPath()) {
  51. // XXX remove without em access, only if not used anymore
  52. //$this->em->remove($data['previous']);
  53. $data['previous'] = null;
  54. }
  55. }
  56. if ($data['file'] instanceof UploadedFile) {
  57. return $this->values->saveFile($data['file'], null);
  58. }
  59. return $data['previous'];
  60. }));
  61. $builder->add('file', BasicFileType::class, [
  62. 'label' => 'Wgraj nowy',
  63. 'required' => false
  64. ]);
  65. $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($builder, $options) {
  66. if (empty($event->getData()) || empty($event->getData()
  67. ->getPath())) {
  68. if ($options['allow_remove']) {
  69. $event->getForm()
  70. ->remove('remove');
  71. }
  72. } else {
  73. $event->getForm()
  74. ->remove('file');
  75. $event->getForm()
  76. ->add('file', BasicFileType::class, [
  77. 'label' => 'Zastąp',
  78. 'required' => false
  79. ]);
  80. if ($options['allow_remove']) {
  81. $event->getForm()
  82. ->add('remove', CheckboxType::class, [
  83. 'label' => 'Usuń plik',
  84. 'required' => false
  85. ]);
  86. }
  87. }
  88. });
  89. }
  90. /**
  91. * {@inheritdoc}
  92. */
  93. public function configureOptions(OptionsResolver $resolver)
  94. {
  95. $resolver->setDefaults([
  96. 'dir' => 'settings',
  97. 'allow_remove' => true
  98. ]);
  99. }
  100. public function getBlockPrefix()
  101. {
  102. return 'adv_file';
  103. }
  104. }