Skip to content

Bugfix/update article choose default template #258

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 17 additions & 7 deletions Bundle/BlogBundle/Controller/ArticleController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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'));
Expand Down Expand Up @@ -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(),
]
),
]
Expand All @@ -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()]
),
]
);
Expand All @@ -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(),
]);
Expand Down
4 changes: 2 additions & 2 deletions Bundle/BlogBundle/Entity/Article.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
*/
Expand Down
2 changes: 1 addition & 1 deletion Bundle/BlogBundle/Entity/ArticleTemplate.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
/**
* ArticleTemplate (extends BusinessTemplate).
*
* @ORM\Entity
* @ORM\Entity(repositoryClass="Victoire\Bundle\BlogBundle\Repository\ArticleTemplateRepository")
*/
class ArticleTemplate extends BusinessTemplate
{
Expand Down
64 changes: 64 additions & 0 deletions Bundle/BlogBundle/Form/ArticleTemplateType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace Victoire\Bundle\BlogBundle\Form;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Victoire\Bundle\CoreBundle\DataTransformer\ViewToIdTransformer;

/**
*
*/
class ArticleTemplateType extends HiddenType
{
private $entityManager;

/**
* Constructor.
*/
public function __construct(EntityManager $entityManager)
{
$this->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';
}
}
140 changes: 74 additions & 66 deletions Bundle/BlogBundle/Form/ArticleType.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,83 +39,66 @@ 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);
});
}

/**
* @param \Symfony\Component\Form\FormInterface $form
*/
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;
},
]);
}

/**
Expand All @@ -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'),
]);
}
}

/**
Expand Down
44 changes: 44 additions & 0 deletions Bundle/BlogBundle/Repository/ArticleTemplateRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace Victoire\Bundle\BlogBundle\Repository;

use Doctrine\ORM\EntityRepository;
use Victoire\Bundle\CoreBundle\Repository\StateFullRepositoryTrait;

/**
* The Article Template repository.
*/
class ArticleTemplateRepository extends EntityRepository
{
use StateFullRepositoryTrait;

/**
* @param $blog_id
*
* @return \Doctrine\ORM\QueryBuilder
*/
public function getCount($alias = 'at')
{
$this->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;
}
}
6 changes: 6 additions & 0 deletions Bundle/BlogBundle/Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading