diff --git a/Bundle/BlogBundle/Controller/ArticleController.php b/Bundle/BlogBundle/Controller/ArticleController.php index a726cee23..b8a1d228f 100644 --- a/Bundle/BlogBundle/Controller/ArticleController.php +++ b/Bundle/BlogBundle/Controller/ArticleController.php @@ -24,14 +24,16 @@ class ArticleController extends Controller /** * Create article. * - * @Route("/create", name="victoire_blog_article_create") + * @Route("/create/{id}", name="victoire_blog_article_create") + * @ParamConverter("blog", class="VictoireBlogBundle:Blog") * * @return JsonResponse */ - public function createAction() + public function createAction(Blog $blog) { $entityManager = $this->get('doctrine.orm.entity_manager'); $article = new Article(); + $article->setBlog($blog); $form = $this->createForm('victoire_article_type', $article); $form->handleRequest($this->get('request')); @@ -80,7 +82,8 @@ public function createAction() 'html' => $this->container->get('victoire_templating')->render( 'VictoireBlogBundle:Article:new.html.twig', [ - 'form' => $form->createView(), + 'form' => $form->createView(), + 'blogId' => $blog->getId(), ] ), ] @@ -106,7 +109,7 @@ public function newBlogArticleAction(Blog $blog) [ 'html' => $this->container->get('victoire_templating')->render( 'VictoireBlogBundle:Article:new.html.twig', - ['form' => $form->createView()] + ['form' => $form->createView(), 'blogId' => $blog->getId()] ), ] ); @@ -127,24 +130,31 @@ public function newBlogArticleAction(Blog $blog) public function settingsAction(Request $request, Article $article) { $form = $this->createForm('victoire_article_settings_type', $article); + $pageHelper = $this->get('victoire_page.page_helper'); $businessProperties = []; + $businessPage = $pageHelper->findPageByParameters([ + 'viewId' => $article->getPattern()->getId(), + 'entityId' => $article->getId(), + ]); $form->handleRequest($request); $novalidate = $request->query->get('novalidate', false); if ($novalidate === false && $form->isValid()) { + $em = $this->getDoctrine()->getManager(); if (count($article->getTags())) { /** @var Tag $tag */ foreach ($article->getTags() as $tag) { $tag->setBlog($article->getBlog()); - $this->get('doctrine.orm.entity_manager')->persist($tag); + $em->persist($tag); } } - $this->get('doctrine.orm.entity_manager')->flush(); + $businessPage->setTemplate($article->getPattern()); + $em->flush(); $pattern = $article->getPattern(); - $page = $this->container->get('victoire_page.page_helper')->findPageByParameters([ + $page = $pageHelper->findPageByParameters([ 'viewId' => $pattern->getId(), 'entityId' => $article->getId(), ]); diff --git a/Bundle/BlogBundle/Entity/Article.php b/Bundle/BlogBundle/Entity/Article.php index ee93f7c75..d65aff6fc 100644 --- a/Bundle/BlogBundle/Entity/Article.php +++ b/Bundle/BlogBundle/Entity/Article.php @@ -46,7 +46,7 @@ class Article /** * @ORM\Column(name="slug", type="string", length=255) - * @Gedmo\Slug(fields={"name"}, updatable=false, unique=false) + * @Gedmo\Slug(fields={"name"}, updatable=false, unique=true) * @VIC\BusinessProperty("businessParameter") */ private $slug; @@ -106,7 +106,7 @@ class Article /** * @var BusinessTemplate - * @ORM\ManyToOne(targetEntity="\Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate") + * @ORM\ManyToOne(targetEntity="ArticleTemplate") * @ORM\JoinColumn(name="pattern_id", referencedColumnName="id", onDelete="SET NULL") * @Assert\NotNull() */ diff --git a/Bundle/BlogBundle/Entity/ArticleTemplate.php b/Bundle/BlogBundle/Entity/ArticleTemplate.php index 7d4aaa992..777f47a52 100644 --- a/Bundle/BlogBundle/Entity/ArticleTemplate.php +++ b/Bundle/BlogBundle/Entity/ArticleTemplate.php @@ -8,7 +8,7 @@ /** * ArticleTemplate (extends BusinessTemplate). * - * @ORM\Entity + * @ORM\Entity(repositoryClass="Victoire\Bundle\BlogBundle\Repository\ArticleTemplateRepository") */ class ArticleTemplate extends BusinessTemplate { diff --git a/Bundle/BlogBundle/Form/ArticleTemplateType.php b/Bundle/BlogBundle/Form/ArticleTemplateType.php new file mode 100644 index 000000000..f77d114ff --- /dev/null +++ b/Bundle/BlogBundle/Form/ArticleTemplateType.php @@ -0,0 +1,64 @@ +entityManager = $entityManager; + } + + /** + * define form fields. + * + * @param FormBuilderInterface $builder + * @param array $options + */ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->addModelTransformer(new ViewToIdTransformer($this->entityManager)); + } + + /** + * bind to Page entity. + * + * @param OptionsResolverInterface $resolver + */ + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults([ + 'data_class' => 'Victoire\Bundle\BlogBundle\Entity\ArticleTemplate', + 'translation_domain' => 'victoire', + ]); + } + + public function getParent() + { + return 'hidden'; + } + + /** + * get form name. + * + * @return string The name of the form + */ + public function getName() + { + return 'victoire_article_template_type'; + } +} diff --git a/Bundle/BlogBundle/Form/ArticleType.php b/Bundle/BlogBundle/Form/ArticleType.php index 5f0775e25..acc2e766c 100644 --- a/Bundle/BlogBundle/Form/ArticleType.php +++ b/Bundle/BlogBundle/Form/ArticleType.php @@ -39,62 +39,49 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder ->add('name', null, [ - 'label' => 'form.article.name.label', - ]) + 'label' => 'form.article.name.label', + ]) ->add('description', null, [ - 'label' => 'form.article.description.label', - 'required' => false, ]) + 'label' => 'form.article.description.label', + 'required' => false, + ]) ->add('image', 'media', [ - 'required' => false, - 'label' => 'form.article.image.label', - ]) - ->add( - $builder->create('blog', 'hidden', [ - 'label' => 'form.article.blog.label', ] - )->addModelTransformer($viewToIdTransformer) - ) - ->add( - 'tags', - 'tags', - [ - 'required' => false, - 'multiple' => true, - ] - ) + 'required' => false, + 'label' => 'form.article.image.label', + ]) + ->add($builder + ->create('blog', 'hidden', ['label' => 'form.article.blog.label']) + ->addModelTransformer($viewToIdTransformer)) + ->add('pattern') + ->add('tags', 'tags', [ + 'required' => false, + 'multiple' => true, + ]) ->remove('visibleOnFront'); $builder->get('blog')->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { - $data = $event->getData(); - $form = $event->getForm(); - $this->manageCategories($data, $form->getParent()); - }); + $data = $event->getData(); + $parent = $event->getForm()->getParent(); + $this->manageCategories($data, $parent); + $this->manageTemplate($data, $parent); + }); $builder->get('blog')->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { - $form = $event->getForm(); - $data = $event->getData(); - $this->manageCategories($data, $form->getParent()); - }); + $data = $event->getData(); + $parent = $event->getForm()->getParent(); + $this->manageCategories($data, $parent); + }); $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { - $form = $event->getForm(); - $data = $event->getData(); - $this->manageTags($data, $form); - }); + $data = $event->getData(); + $form = $event->getForm(); + $this->manageTags($data, $form); + }); $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { - $form = $event->getForm(); - $data = $form->getData(); - $this->manageTags($data, $form); - }); - - $articlePatterns = function (EntityRepository $repo) { - return $repo->getInstance()->andWhere("pattern.businessEntityId = 'article'"); - }; - $builder->add('pattern', null, [ - 'label' => 'form.view.type.pattern.label', - 'property' => 'name', - 'required' => true, - 'query_builder' => $articlePatterns, - ]); + $form = $event->getForm(); + $data = $form->getData(); + $this->manageTags($data, $form); + }); } /** @@ -102,20 +89,16 @@ public function buildForm(FormBuilderInterface $builder, array $options) */ protected function manageTags($data, $form) { - $form->add( - 'tags', - 'tags', - [ - 'required' => false, - 'multiple' => true, - 'query_builder' => function (TagRepository $er) use ($data) { - $qb = $er->filterByBlog($data->getBlog())->getInstance(); - $er->clearInstance(); - - return $qb; - }, - ] - ); + $form->add('tags', 'tags', [ + 'required' => false, + 'multiple' => true, + 'query_builder' => function (TagRepository $er) use ($data) { + $qb = $er->filterByBlog($data->getBlog())->getInstance(); + $er->clearInstance(); + + return $qb; + }, + ]); } /** @@ -134,13 +117,38 @@ protected function manageCategories($blogId, $form) } $form->add('category', 'hierarchy_tree', [ - 'required' => false, - 'label' => 'form.article.category.label', - 'class' => 'Victoire\\Bundle\\BlogBundle\\Entity\\Category', - 'query_builder' => $queryBuilder, - 'empty_value' => 'Pas de catégorie', - 'empty_data' => null, + 'required' => false, + 'label' => 'form.article.category.label', + 'class' => 'Victoire\\Bundle\\BlogBundle\\Entity\\Category', + 'query_builder' => $queryBuilder, + 'empty_value' => 'Pas de catégorie', + 'empty_data' => null, + ]); + } + + /** + * @param \Symfony\Component\Form\FormInterface|null $form + */ + protected function manageTemplate($blog_id, $form) + { + $articleTemplateRepo = $this->entityManager->getRepository('VictoireBlogBundle:ArticleTemplate'); + + if ($articleTemplateRepo->filterByBlog($blog_id)->getCount('parent')->run('getSingleScalarResult') > 1) { + $articlePatterns = function (EntityRepository $repo) use ($blog_id) { + return $repo->filterByBlog($blog_id)->getInstance(); + }; + $form->add('pattern', null, [ + 'label' => 'form.view.type.pattern.label', + 'property' => 'name', + 'required' => true, + 'query_builder' => $articlePatterns, + ]); + } else { + $form->add('pattern', 'victoire_article_template_type', [ + 'data_class' => null, + 'data' => $articleTemplateRepo->filterByBlog($blog_id)->run('getSingleResult'), ]); + } } /** diff --git a/Bundle/BlogBundle/Repository/ArticleTemplateRepository.php b/Bundle/BlogBundle/Repository/ArticleTemplateRepository.php new file mode 100644 index 000000000..545b32211 --- /dev/null +++ b/Bundle/BlogBundle/Repository/ArticleTemplateRepository.php @@ -0,0 +1,44 @@ +qb->select("count($alias.id)"); + + return $this; + } + + /** + * @param $blog_id + * + * @return \Doctrine\ORM\QueryBuilder + */ + public function filterByBlog($blog_id) + { + $this->clearInstance(); + $this->qb = $this->getInstance('at'); + + $this->qb + ->join('at.parent', 'parent') + ->andWhere('parent.id = :id') + ->setParameter('id', $blog_id); + + return $this; + } +} diff --git a/Bundle/BlogBundle/Resources/config/services.yml b/Bundle/BlogBundle/Resources/config/services.yml index a85a1a20d..ad4937005 100644 --- a/Bundle/BlogBundle/Resources/config/services.yml +++ b/Bundle/BlogBundle/Resources/config/services.yml @@ -55,6 +55,12 @@ services: - "@request_stack" tags: - { name: form.type, alias: victoire_article_type } + victoire_blog.article.container.form.type: + class: Victoire\Bundle\BlogBundle\Form\ArticleTemplateType + arguments: + - "@doctrine.orm.entity_manager" + tags: + - { name: form.type, alias: victoire_article_template_type } victoire_blog.article_settings.form.type: class: Victoire\Bundle\BlogBundle\Form\ArticleSettingsType diff --git a/Bundle/BlogBundle/Resources/views/Article/new.html.twig b/Bundle/BlogBundle/Resources/views/Article/new.html.twig index 38760900f..c663cf824 100644 --- a/Bundle/BlogBundle/Resources/views/Article/new.html.twig +++ b/Bundle/BlogBundle/Resources/views/Article/new.html.twig @@ -11,7 +11,7 @@ {% endblock modal_header_title %} {% block modal_body_content %} - {% include "VictoireBlogBundle:Article:_form.html.twig" with {'action': path('victoire_blog_article_create')} %} + {% include "VictoireBlogBundle:Article:_form.html.twig" with {'action': path('victoire_blog_article_create', {id: blogId})} %} {% endblock modal_body_content %} {% block modal_footer_content %} diff --git a/Bundle/CoreBundle/EventSubscriber/ViewReferenceSubscriber.php b/Bundle/CoreBundle/EventSubscriber/ViewReferenceSubscriber.php index 47636b12b..a95ad04e3 100644 --- a/Bundle/CoreBundle/EventSubscriber/ViewReferenceSubscriber.php +++ b/Bundle/CoreBundle/EventSubscriber/ViewReferenceSubscriber.php @@ -78,7 +78,8 @@ public function onFlush(OnFlushEventArgs $eventArgs) if ($entity instanceof View) { if (((array_key_exists('slug', $uow->getEntityChangeSet($entity)) //the slug of the page has been modified || array_key_exists('staticUrl', $uow->getEntityChangeSet($entity)) - || array_key_exists('parent', $uow->getEntityChangeSet($entity))) + || array_key_exists('parent', $uow->getEntityChangeSet($entity)) + || array_key_exists('template', $uow->getEntityChangeSet($entity))) )) { $this->manageView($entity, $entityManager, $uow); } diff --git a/Tests/Features/Blog/create.feature b/Tests/Features/Blog/create.feature index d6ffab162..71db66a01 100644 --- a/Tests/Features/Blog/create.feature +++ b/Tests/Features/Blog/create.feature @@ -35,7 +35,6 @@ Background: Then I should see "Créer un nouvel article" When I fill in "Nom de l'article" with "I'm your father." When I fill in "Description" with "This is a great description." - When I select "{{item.name}}" from "Modèle à utiliser" And I follow "Créer" And I wait 10 seconds Then I should be on "/fr/the-jedi-network/i-m-your-father" diff --git a/Tests/Functionnal/src/Acme/AppBundle/DataFixtures/Fixtures/ORM/Blog/pattern.yml b/Tests/Functionnal/src/Acme/AppBundle/DataFixtures/Fixtures/ORM/Blog/pattern.yml index c10e16f4a..d284204ea 100644 --- a/Tests/Functionnal/src/Acme/AppBundle/DataFixtures/Fixtures/ORM/Blog/pattern.yml +++ b/Tests/Functionnal/src/Acme/AppBundle/DataFixtures/Fixtures/ORM/Blog/pattern.yml @@ -1,4 +1,4 @@ -Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate: +Victoire\Bundle\BlogBundle\Entity\ArticleTemplate: pattern_article: name: "{{item.name}}" slug: "{{item.slug}}"