From e3b463507d6b08fb4f259226919d68946b12daa0 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Mon, 22 Mar 2021 18:46:48 +0100 Subject: [PATCH] add ogImage in page --- core/Entity/Site/Page/Page.php | 44 ++++++++++++--- .../Site/Page/PageEventSubscriber.php | 56 +++++++++++++++++++ core/Form/Site/Page/PageType.php | 16 ++++++ templates/site/page_admin/_form.html.twig | 2 +- 4 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 core/EventSuscriber/Site/Page/PageEventSubscriber.php diff --git a/core/Entity/Site/Page/Page.php b/core/Entity/Site/Page/Page.php index 03ab38f..eea44f1 100644 --- a/core/Entity/Site/Page/Page.php +++ b/core/Entity/Site/Page/Page.php @@ -10,6 +10,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\HttpFoundation\File\File; /** * @ORM\Entity(repositoryClass=PageRepository::class) @@ -26,47 +27,52 @@ class Page implements EntityInterface * @ORM\GeneratedValue * @ORM\Column(type="integer") */ - private $id; + protected $id; /** * @ORM\Column(type="string", length=255) */ - private $name; + protected $name; /** * @ORM\Column(type="string", length=255, nullable=true) */ - private $template; + protected $template; /** * @ORM\OneToMany(targetEntity=Block::class, mappedBy="page", cascade={"persist"}) */ - private $blocks; + protected $blocks; /** * @ORM\Column(type="string", length=255, nullable=true) */ - private $metaTitle; + protected $metaTitle; /** * @ORM\Column(type="string", length=255, nullable=true) */ - private $metaDescrition; + protected $metaDescrition; /** * @ORM\Column(type="string", length=255, nullable=true) */ - private $ogTitle; + protected $ogTitle; /** * @ORM\Column(type="string", length=255, nullable=true) */ - private $ogDescription; + protected $ogDescription; + + /** + * @ORM\Column(type="string", length=255, nullable=true) + */ + protected $ogImage; /** * @ORM\OneToMany(targetEntity=Node::class, mappedBy="page") */ - private $nodes; + protected $nodes; public function __construct() { @@ -221,6 +227,26 @@ class Page implements EntityInterface return $this; } + public function getOgImage() + { + if (is_string($this->ogImage)) { + if (file_exists($this->ogImage)) { + return new File($this->ogImage); + } + + return null; + } + + return $this->ogImage; + } + + public function setOgImage($ogImage): self + { + $this->ogImage = $ogImage; + + return $this; + } + /** * @return Collection|Node[] */ diff --git a/core/EventSuscriber/Site/Page/PageEventSubscriber.php b/core/EventSuscriber/Site/Page/PageEventSubscriber.php new file mode 100644 index 0000000..ef9e8db --- /dev/null +++ b/core/EventSuscriber/Site/Page/PageEventSubscriber.php @@ -0,0 +1,56 @@ + + */ +class PageEventSubscriber extends EntityManagerEventSubscriber +{ + protected FileUploadHandler $fileUpload; + + public function __construct(FileUploadHandler $fileUpload) + { + $this->fileUpload = $fileUpload; + } + + public function support(EntityInterface $entity) + { + return $entity instanceof Page; + } + + public function onPreUpdate(EntityManagerEvent $event) + { + if (!$this->support($event->getEntity())) { + return; + } + + $page = $event->getEntity(); + + if ($page->getOgImage() instanceof UploadedFile) { + $directory = 'uploads/page/ogImage'; + + $this->fileUpload->handleForm( + $page->getOgImage(), + $directory, + function ($filename) use ($page, $directory) { + $page->setOgImage($directory.'/'.$filename); + } + ); + } + } + + public function onPreCreate(EntityManagerEvent $event) + { + return $this->onPreUpdate($event); + } +} diff --git a/core/Form/Site/Page/PageType.php b/core/Form/Site/Page/PageType.php index 7e40fd8..649e566 100644 --- a/core/Form/Site/Page/PageType.php +++ b/core/Form/Site/Page/PageType.php @@ -9,6 +9,8 @@ use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\NotBlank; +use Symfony\Component\Form\Extension\Core\Type\FileType; +use Symfony\Component\Validator\Constraints\Image; class PageType extends AbstractType { @@ -80,6 +82,20 @@ class PageType extends AbstractType ] ); + $builder->add( + 'ogImage', + FileType::class, + [ + 'label' => 'Image', + 'required' => false, + 'attr' => [ + ], + 'constraints' => [ + new Image(), + ], + ] + ); + $builder->add( 'template', ChoiceType::class, diff --git a/templates/site/page_admin/_form.html.twig b/templates/site/page_admin/_form.html.twig index 514278d..2f81451 100644 --- a/templates/site/page_admin/_form.html.twig +++ b/templates/site/page_admin/_form.html.twig @@ -5,7 +5,7 @@ {% endset %} {% set formOpenGraph %} - {% for item in ['ogTitle', 'ogDescription'] %} + {% for item in ['ogTitle', 'ogDescription', 'ogImage'] %} {{ form_row(form[item]) }} {% endfor %} {% endset %}