<?php
namespace Boab\CmsBundle\Manager;
use Boab\CmsBundle\Entity\Document;
use Boab\CmsBundle\Util\FileUploader;
use Boab\CmsBundle\Entity\DocumentInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Constraints;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
class DocumentTypeManager extends AbstractContentType implements AdminFormInterface
{
private $oldFile;
public function __construct(FileUploader $uploader)
{
$this->uploader = $uploader;
}
public function buildForm(FormBuilderInterface $builder, array $options=[])
{
parent::buildForm($builder, $options);
$builder->add('document', FileType::class, [
'attr'=>[
'class'=>'select-document'
],
'required'=>false,
'constraints' => $this->getFileConstraints($options),
]);
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
$content = $event->getData();
$this->oldFile = $content->getDocumentPath();
});
$builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event){
$content = $event->getData();
if($content->getDocument() instanceof UploadedFile){
$ext = $content->getDocument()->guessExtension();
$content->setExtension($ext);
}
});
}
public function getFileConstraints($options)
{
if($options["data"]->getId() && !$options["data"]->getUploadedFile()){
return;
}
$constraints = [
new Constraints\File([
'maxSize' => '2100k',
'mimeTypes' => [
'application/pdf',
'application/x-pdf',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
],
'mimeTypesMessage' => 'Please upload a valid PDF',
]),
] ;
array_unshift($constraints, new Constraints\NotBlank());
return $constraints;
}
public function prePersist(DocumentInterface $content)
{
$this->preUpdate($content);
}
public function preUpdate(DocumentInterface $content)
{
$uploadFile = $content->getDocument();
if($uploadFile instanceof UploadedFile ){
$fileName = $this->uploader->upload($uploadFile, $content->getUploadRoot());
$content->setFileName($fileName);
if($this->oldFile){
$this->uploader->deleteFile($this->oldFile);
}
}
}
public function preRemove(DocumentInterface $document)
{
$docPath = sprintf("%s/%s", $document->getUploadRoot(), $document->getFileName());
$this->uploader->deleteFile($docPath);
}
}