Skip to content
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

[WIP] Fork6 blog #3576

Open
wants to merge 24 commits into
base: fork6
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 41 additions & 1 deletion src/Core/Domain/Twig/RoutingExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@

namespace ForkCMS\Core\Domain\Twig;

use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\Query\Expr\Join;
use ForkCMS\Modules\Backend\Domain\Action\ActionName;
use ForkCMS\Modules\Backend\Domain\Action\ActionSlug;
use ForkCMS\Modules\Extensions\Domain\Module\ModuleName;
use ForkCMS\Modules\Internationalisation\Domain\Locale\Locale;
use ForkCMS\Modules\Pages\Domain\Page\Page;
use ForkCMS\Modules\Pages\Domain\Page\PageRepository;
use ForkCMS\Modules\Pages\Domain\Page\PageRouter;
use Symfony\Bridge\Twig\Extension\RoutingExtension as TwigBridgeRoutingExtension;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

Expand All @@ -17,7 +23,9 @@ final class RoutingExtension extends AbstractExtension
public function __construct(
private UrlGeneratorInterface $generator,
private TwigBridgeRoutingExtension $twigBridgeRoutingExcension,
private RequestStack $requestStack
private RequestStack $requestStack,
private readonly PageRepository $pageRepository,
private readonly PageRouter $pageRouter
) {
}

Expand All @@ -34,6 +42,10 @@ public function getFunctions(): array
[$this, 'getPath'],
['is_safe_callback' => [$this->twigBridgeRoutingExcension, 'isUrlGenerationSafe']]
),
new TwigFunction(
'get_url_for_block',
[$this, 'getUrlForBlock']
),
];
}

Expand Down Expand Up @@ -88,4 +100,32 @@ private function getActionSlug(?string $moduleName, ?string $actionName): Action
ActionName::fromString($actionName)
);
}

/**
* @param array<string,mixed> $parameters
* @throws NonUniqueResultException
*/
public function getUrlForBlock(
string $moduleName,
string $actionName,
?string $type = 'action',
array $parameters = [],
): string {
$page = $this->pageRepository->createQueryBuilder('p')
->innerJoin('p.revisions', 'r', Join::WITH, 'r.isDraft = :draft AND r.locale = :locale')
->innerJoin('r.blocks', 'pb')
->innerJoin('pb.block', 'fb', Join::WITH, 'fb.block.module = :module AND fb.block.name = :name')
->setParameter('module', $moduleName)
->setParameter('name', $type . '__' . $actionName)
->setParameter('locale', Locale::current()->value)
->setParameter('draft', false)
->getQuery()
->getOneOrNullResult();

if ($page === null) {
return $this->pageRouter->getRouteForPageId(Page::PAGE_ID_404, Locale::current());
}

return $this->pageRouter->getRouteForPage($page, Locale::current(), $parameters);
}
}
29 changes: 29 additions & 0 deletions src/Modules/Blog/Backend/Actions/BlogIndex.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace ForkCMS\Modules\Blog\Backend\Actions;

use Doctrine\ORM\QueryBuilder;
use ForkCMS\Modules\Backend\Domain\Action\AbstractDataGridActionController;
use ForkCMS\Modules\Blog\Domain\Article\Article;
use ForkCMS\Modules\Blog\Domain\Article\Status;
use Symfony\Component\HttpFoundation\Request;

class BlogIndex extends AbstractDataGridActionController
{
protected function execute(Request $request): void
{
$locale = $this->translator->getLocale();

$this->renderDataGrid(
Article::class,
static function (QueryBuilder $queryBuilder) use ($locale): void {
$queryBuilder
->andWhere('Article.locale = :locale')
->andWhere('Article.status != :archived')
->setParameter('locale', $locale)
->setParameter('archived', Status::ARCHIVED)
;
}
);
}
}
30 changes: 30 additions & 0 deletions src/Modules/Blog/Backend/Actions/BlogPostAdd.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace ForkCMS\Modules\Blog\Backend\Actions;

use ForkCMS\Core\Domain\Header\FlashMessage\FlashMessage;
use ForkCMS\Modules\Backend\Domain\Action\AbstractFormActionController;
use ForkCMS\Modules\Blog\Domain\Article\ArticleType;
use ForkCMS\Modules\Blog\Domain\Article\Command\CreateArticle;
use ForkCMS\Modules\ContentBlocks\Backend\Actions\ContentBlockIndex;
use ForkCMS\Modules\Internationalisation\Domain\Locale\Locale;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class BlogPostAdd extends AbstractFormActionController
{
protected function getFormResponse(Request $request): ?Response
{
$createBlogPost = new CreateArticle();
$createBlogPost->locale = Locale::from($this->translator->getLocale());

return $this->handleForm(
request: $request,
formType: ArticleType::class,
formData: $createBlogPost,
flashMessage: FlashMessage::success('Added'),
redirectResponse: new RedirectResponse(BlogIndex::getActionSlug()->generateRoute($this->router))
);
}
}
30 changes: 30 additions & 0 deletions src/Modules/Blog/Backend/Actions/BlogPostEdit.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace ForkCMS\Modules\Blog\Backend\Actions;

use ForkCMS\Core\Domain\Header\FlashMessage\FlashMessage;
use ForkCMS\Modules\Backend\Domain\Action\AbstractFormActionController;
use ForkCMS\Modules\Blog\Domain\Article\Article;
use ForkCMS\Modules\Blog\Domain\Article\ArticleType;
use ForkCMS\Modules\Blog\Domain\Article\Command\EditArticle;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class BlogPostEdit extends AbstractFormActionController
{
protected function getFormResponse(Request $request): ?Response
{
/** @var Article $article */
$article = $this->getEntityFromRequest($request, Article::class);
$this->assign('article', $article);

return $this->handleForm(
request: $request,
formType: ArticleType::class,
formData: new EditArticle($article),
flashMessage: FlashMessage::success('Edited'),
redirectResponse: new RedirectResponse(BlogIndex::getActionSlug()->generateRoute($this->router)),
);
}
}
28 changes: 28 additions & 0 deletions src/Modules/Blog/Backend/Actions/CategoryAdd.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace ForkCMS\Modules\Blog\Backend\Actions;

use ForkCMS\Modules\Backend\Domain\Action\AbstractFormActionController;
use ForkCMS\Modules\Blog\Domain\Category\CategoryType;
use ForkCMS\Modules\Blog\Domain\Category\Command\CreateCategory;
use ForkCMS\Modules\Internationalisation\Domain\Locale\Locale;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class CategoryAdd extends AbstractFormActionController
{

protected function getFormResponse(Request $request): ?Response
{
$createCategory = new CreateCategory();
$createCategory->locale = Locale::from($this->translator->getLocale());

return $this->handleForm(
request: $request,
formType: CategoryType::class,
formData: $createCategory,
redirectResponse: new RedirectResponse(CategoryIndex::getActionSlug()->generateRoute($this->router))
);
}
}
31 changes: 31 additions & 0 deletions src/Modules/Blog/Backend/Actions/CategoryEdit.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace ForkCMS\Modules\Blog\Backend\Actions;

use ForkCMS\Core\Domain\Header\FlashMessage\FlashMessage;
use ForkCMS\Modules\Backend\Domain\Action\AbstractFormActionController;
use ForkCMS\Modules\Blog\Domain\Category\Category;
use ForkCMS\Modules\Blog\Domain\Category\CategoryType;
use ForkCMS\Modules\Blog\Domain\Category\Command\EditCategory;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class CategoryEdit extends AbstractFormActionController
{
protected function getFormResponse(Request $request): ?Response
{
/** @var Category $category */
$category = $this->getEntityFromRequest($request, Category::class);

$this->assign('category', $category);

return $this->handleForm(
request: $request,
formType: CategoryType::class,
formData: new EditCategory($category),
flashMessage: FlashMessage::success('Edited'),
redirectResponse: new RedirectResponse(CategoryIndex::getActionSlug()->generateRoute($this->router)),
);
}
}
26 changes: 26 additions & 0 deletions src/Modules/Blog/Backend/Actions/CategoryIndex.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace ForkCMS\Modules\Blog\Backend\Actions;

use Doctrine\ORM\QueryBuilder;
use ForkCMS\Modules\Backend\Domain\Action\AbstractDataGridActionController;
use ForkCMS\Modules\Blog\Domain\Category\Category;
use Symfony\Component\HttpFoundation\Request;

class CategoryIndex extends AbstractDataGridActionController
{
protected function execute(Request $request): void
{
$locale = $this->translator->getLocale();

$this->renderDataGrid(
Category::class,
static function (QueryBuilder $queryBuilder) use ($locale): void {
$queryBuilder
->andWhere('Category.locale = :locale')
->setParameter('locale', $locale)
;
}
);
}
}
19 changes: 19 additions & 0 deletions src/Modules/Blog/Backend/Actions/ModuleSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace ForkCMS\Modules\Blog\Backend\Actions;

use ForkCMS\Modules\Backend\Domain\Action\AbstractFormActionController;
use ForkCMS\Modules\Blog\Domain\ModuleSettings\ModuleSettingsType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class ModuleSettings extends AbstractFormActionController
{
protected function getFormResponse(Request $request): ?Response
{
return $this->handleModuleSettingsForm(
$request,
ModuleSettingsType::class
);
}
}
19 changes: 19 additions & 0 deletions src/Modules/Blog/DependencyInjection/BlogExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace ForkCMS\Modules\Blog\DependencyInjection;

use ForkCMS\Core\Domain\DependencyInjection\ForkModuleExtension;
use Symfony\Component\DependencyInjection\ContainerBuilder;

final class BlogExtension extends ForkModuleExtension
{
public function load(array $configs, ContainerBuilder $container): void
{
$this->getLoader($container)->load('services.yaml');
}

public function prepend(ContainerBuilder $container): void
{
$this->getLoader($container)->load('doctrine.yaml');
}
}