diff --git a/src/Command/MigrateDataCommand.php b/src/Command/MigrateDataCommand.php index 5a84b48..430fd05 100644 --- a/src/Command/MigrateDataCommand.php +++ b/src/Command/MigrateDataCommand.php @@ -11,15 +11,17 @@ use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use App\Repository\Blog\PostRepositoryQuery; class MigrateDataCommand extends Command { protected static $defaultName = 'app:migrate-data'; protected static $defaultDescription = ''; - public function __construct(EntityManager $entityManager) + public function __construct(EntityManager $entityManager, PostRepositoryQuery $postRepo) { $this->entityManager = $entityManager; + $this->postRepo = $postRepo; parent::__construct(); } @@ -35,6 +37,14 @@ class MigrateDataCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + /* + foreach ($this->postRepo->create()->find() as $post) + { + $tags = $post->getTags(); + $post->setTags($tags); + $this->entityManager->update($post); + } + require 'data/category.php'; require 'data/comment.php'; require 'data/post.php'; @@ -103,6 +113,7 @@ class MigrateDataCommand extends Command $this->entityManager->create($comment); } + */ return Command::SUCCESS; } diff --git a/src/Controller/Blog/PostController.php b/src/Controller/Blog/PostController.php index f199dfd..ba37b75 100644 --- a/src/Controller/Blog/PostController.php +++ b/src/Controller/Blog/PostController.php @@ -95,10 +95,11 @@ class PostController extends PageController public function search(Request $request, int $page = 1): Response { $query = $request->query->get('query'); + $tag = $request->query->get('tag'); - if ($query) { + if ($query || $tag) { $entities = $this->createQuery() - ->search($query) + ->search($query, $tag) ->paginate($page, 5) ; } diff --git a/src/Entity/Blog/Post.php b/src/Entity/Blog/Post.php index f4b0776..61e0dff 100644 --- a/src/Entity/Blog/Post.php +++ b/src/Entity/Blog/Post.php @@ -257,7 +257,21 @@ class Post implements EntityInterface public function getTags(): ?array { - return $this->tags; + $tags = []; + + foreach ($this->tags as $tag) { + if (is_string($tag)) { + $tags[] = ['label' => $tag]; + } else { + $tags[] = $tag; + } + } + + usort($tags, function($a, $b) { + return $a['label'] < $b['label'] ? -1 : 1; + }); + + return $tags; } public function setTags(?array $tags): self diff --git a/src/Form/Blog/PostTagType.php b/src/Form/Blog/PostTagType.php new file mode 100644 index 0000000..c5afbbc --- /dev/null +++ b/src/Form/Blog/PostTagType.php @@ -0,0 +1,35 @@ +add( + 'label', + TextType::class, + [ + 'label' => 'Libellé', + 'required' => true, + 'attr' => [ + ], + 'constraints' => [ + new NotBlank(), + ], + ] + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + ]); + } +} diff --git a/src/Form/Blog/PostType.php b/src/Form/Blog/PostType.php index bc780b0..7ffa634 100644 --- a/src/Form/Blog/PostType.php +++ b/src/Form/Blog/PostType.php @@ -20,6 +20,7 @@ use Symfony\Component\Validator\Constraints\Image; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\Range; use Symfony\Component\Validator\Constraints\Url; +use Symfony\Component\Form\Extension\Core\Type\CollectionType; class PostType extends AbstractType { @@ -156,14 +157,17 @@ class PostType extends AbstractType ] ); - // $builder->add( - // 'tags', - // 'text', - // [ - // 'constraints' => [ - // ], - // ] - // ); + $builder->add( + 'tags', + CollectionType::class, + [ + 'entry_type' => PostTagType::class, + 'by_reference' => false, + 'allow_add' => true, + 'allow_delete' => true, + 'prototype' => true, + ] + ); $builder->add( 'isQuick', diff --git a/src/Repository/Blog/PostRepositoryQuery.php b/src/Repository/Blog/PostRepositoryQuery.php index c8a0dda..bfbaa67 100644 --- a/src/Repository/Blog/PostRepositoryQuery.php +++ b/src/Repository/Blog/PostRepositoryQuery.php @@ -63,59 +63,69 @@ class PostRepositoryQuery extends RepositoryQuery return $this; } - public function search(string $keywords) + public function search(?string $keywords, ?string $tag) { - $conn = $this->repository->getEm()->getConnection(); + if ($keywords) { + $conn = $this->repository->getEm()->getConnection(); - $statement = $conn->prepare( - 'SELECT - post.id, - post.title, - MATCH(post.title) AGAINST(:search) AS MATCH_TITLE, - MATCH(post.content) AGAINST(:search) AS MATCH_CONTENT - FROM post - WHERE - post.status = 1 AND - post.published_at < :date - ORDER BY - MATCH_TITLE DESC, - MATCH_CONTENT DESC - '); + $statement = $conn->prepare( + 'SELECT + post.id, + post.title, + MATCH(post.title) AGAINST(:search) AS MATCH_TITLE, + MATCH(post.content) AGAINST(:search) AS MATCH_CONTENT + FROM post + WHERE + post.status = 1 AND + post.published_at < :date + ORDER BY + MATCH_TITLE DESC, + MATCH_CONTENT DESC + '); - $statement->execute([ - ':search' => $keywords, - ':date' => (new \DateTime())->format('Y-m-d H:i:s'), - ]); + $statement->execute([ + ':search' => $keywords, + ':date' => (new \DateTime())->format('Y-m-d H:i:s'), + ]); - $results = $statement->fetchAll(); - $ids = []; + $results = $statement->fetchAll(); + $ids = []; - foreach ($results as $k => $v) { - $rate = ($v['MATCH_TITLE'] * 2) + $v['MATCH_CONTENT']; - - if ($rate >= 7) { - $ids[] = $v['id']; - } - } - - if (0 == count($ids)) { foreach ($results as $k => $v) { $rate = ($v['MATCH_TITLE'] * 2) + $v['MATCH_CONTENT']; - if ($rate >= 6) { + if ($rate >= 7) { $ids[] = $v['id']; } } + + if (0 == count($ids)) { + foreach ($results as $k => $v) { + $rate = ($v['MATCH_TITLE'] * 2) + $v['MATCH_CONTENT']; + + if ($rate >= 6) { + $ids[] = $v['id']; + } + } + } + + if (!$ids) { + $ids = [-1]; + } + + $this + ->orderBy('FIELD(p.id, :ids)') + ->andWhere('.id IN(:ids)') + ->setParameter(':ids', $ids) + ; } - if (!$ids) { - $ids = [-1]; + if ($tag) { + $this + ->andWhere('.tags LIKE :tag') + ->setParameter(':tag', '%'.$tag.'%'); } - return $this - ->orderBy('FIELD(p.id, :ids)') - ->andWhere('.id IN(:ids)') - ->setParameter(':ids', $ids) - ; + return $this; } } diff --git a/templates/blog/post/_post.html.twig b/templates/blog/post/_post.html.twig index 17af2d9..b143f9d 100644 --- a/templates/blog/post/_post.html.twig +++ b/templates/blog/post/_post.html.twig @@ -75,8 +75,8 @@ {% for tag in post.tags %}
  • - - {{- '#' ~ tag -}} + + {{- '#' ~ tag.label -}}
  • {% endfor %} diff --git a/templates/blog/post/post.html.twig b/templates/blog/post/post.html.twig index 6f3447e..3b2a631 100644 --- a/templates/blog/post/post.html.twig +++ b/templates/blog/post/post.html.twig @@ -25,8 +25,8 @@ {% for tag in post.tags %}
  • - - {{- '#' ~ tag -}} + + {{- '#' ~ tag.value -}}
  • {% endfor %} diff --git a/templates/blog/post_admin/_form.html.twig b/templates/blog/post_admin/_form.html.twig index 84911d7..7064b1e 100644 --- a/templates/blog/post_admin/_form.html.twig +++ b/templates/blog/post_admin/_form.html.twig @@ -6,6 +6,37 @@ {{ form_row(form[item]) }} {% endfor %} + +
    + {% for item in form.tags %} +
    +
    + + {{ item.vars.data.label }} + +
    +
    +
    + {{ form_row(item.label) }} + +
    + + + +
    + + {{ form_rest(item) }} +
    +
    +
    + {% endfor %} +
    +
    + + + {{ 'Nouveau tag'|trans }} + +
    @@ -59,3 +90,23 @@
    + diff --git a/templates/blog/post_admin/show.html.twig b/templates/blog/post_admin/show.html.twig index b9ee5ef..8b3d8f5 100644 --- a/templates/blog/post_admin/show.html.twig +++ b/templates/blog/post_admin/show.html.twig @@ -41,6 +41,13 @@ {{ category.title }} {% endfor %} +
  • + Tags + + {% for tag in entity.tags %} + {{ tag.label }} + {% endfor %} +
  • Slug