kikwik / page-bundle
管理 symfony 6.4+ 的页面
v0.3
2024-09-21 15:33 UTC
Requires
- php: >=8.1
- doctrine/doctrine-bundle: ^2.8
- doctrine/orm: ^2.14 || ^3.0
- stof/doctrine-extensions-bundle: ^1.10
- symfony-cmf/routing-bundle: ^2.1 || ^3.0
- symfony/form: ^6.4|^7.0
- symfony/framework-bundle: ^6.4|^7.0
- symfony/security-bundle: ^6.4|^7.0
- symfony/twig-bundle: ^6.4|^7.0
- symfony/ux-icons: ^2.19
- symfony/ux-live-component: ^2.19.2
- symfony/ux-twig-component: ^2.19.2
- symfony/validator: ^6.4|^7.0
This package is auto-updated.
Last update: 2024-09-21 15:34:36 UTC
README
使用 symfony 6.4+ 管理带翻译的页面
安装
- 需要此包
#!/bin/bash composer require kikwik/page-bundle
- 在
config/packages/translation.yaml中定义enabled_locales
framework: default_locale: it enabled_locales: ['it','en','de','fr']
- 可选:在
config/packages/kikwik_page.yaml中配置选项
kikwik_page: admin_role: 'ROLE_ADMIN_PAGE' # set to empty string to disable permission checker default_locale: '%kernel.default_locale%' enabled_locales: '%kernel.enabled_locales%' resolve_target_entities: page: App\Entity\Pages\Page page_translation: App\Entity\Pages\PageTranslation block: App\Entity\Pages\Block
- 定义你的实体并使其扩展基础类
// src/Entity/Pages/Page.php namespace App\Entity\Pages; use Doctrine\ORM\Mapping as ORM; use Kikwik\PageBundle\Entity\AbstractPage; use Kikwik\PageBundle\Model\PageInterface; #[ORM\Entity()] #[ORM\Table(name: 'kw_page__page')] class Page extends AbstractPage implements PageInterface { }
// src/Entity/Pages/PageTranslation.php namespace App\Entity\Pages; use Doctrine\ORM\Mapping as ORM; use Kikwik\PageBundle\Entity\AbstractPageTranslation; use Kikwik\PageBundle\Model\PageTranslationInterface; #[ORM\Entity()] #[ORM\Table(name: 'kw_page__page_translation')] class PageTranslation extends AbstractPageTranslation implements PageTranslationInterface { }
// src/Entity/Pages/Block.php namespace App\Entity\Pages; use Doctrine\ORM\Mapping as ORM; use Kikwik\PageBundle\Entity\AbstractBlock; use Kikwik\PageBundle\Model\BlockInterface; #[ORM\Entity()] #[ORM\Table(name: 'kw_page__block')] class Block extends AbstractBlock implements BlockInterface { }
- 清除缓存并更新数据库
symfony console cache:clear symfony console doctrine:schema:update --force
页面管理员
要启用页面管理员功能,请向 config/routes/kikwik_pages.yaml 中添加路由
kikwik_page_bundle_admin: resource: '@KikwikPageBundle/config/routes.xml' prefix: '/admin/page'
并在 src/Twig/Components/PageFormLive.php 中创建一个 PageFormLive 组件
namespace App\Twig\Components; use App\Entity\Pages\Page; use Kikwik\PageBundle\Form\PageFormType; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\Form\FormInterface; use Symfony\UX\LiveComponent\Attribute\AsLiveComponent; use Symfony\UX\LiveComponent\Attribute\LiveProp; use Symfony\UX\LiveComponent\DefaultActionTrait; use Symfony\UX\LiveComponent\LiveCollectionTrait; #[AsLiveComponent(template: '@KikwikPage/components/PageFormLive.html.twig')] final class PageFormLive { public function __construct( private FormFactoryInterface $formFactory, ) { } use DefaultActionTrait; use LiveCollectionTrait; #[LiveProp] public ?Page $initialFormData = null; protected function instantiateForm(): FormInterface { return $this->formFactory->create(PageFormType::class, $this->initialFormData); } }
块
块渲染器必须是实现 Kikwik\PageBundle\Block\BlockComponentInterface 的 TwigComponent。你可以扩展 BaseBlockComponent 并使用 $this->getBlock() 来获取块实体,使用 $this->get('paramName') 来获取参数值。在管理员中,将使用 buildEditForm 创建用于编辑参数的表单
namespace App\Twig\Components; use Kikwik\PageBundle\Block\BaseBlockComponent; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\FormInterface; use Symfony\UX\TwigComponent\Attribute\AsTwigComponent; #[AsTwigComponent] class Alert extends BaseBlockComponent { public function buildEditForm(FormInterface $form): void { $form ->add('type', ChoiceType::class, [ 'choices' => ['success' => 'success', 'info' => 'info', 'warning' => 'warning', 'danger' => 'danger'], ]) ->add('message',TextareaType::class, []) ; } }
<div class="alert alert-{{ this.get('type') | default('success') }}"> {{ this.get('message') | default('default message') }} </div>
子页面
页面渲染将由内部控制器 Kikwik\PageBundle\Controller\PageController 处理。如果部分匹配页面的 URL 包含额外的 slug 部分,将触发一个事件,你可以设置一个 Response 来显示不同的模板。如果你的监听器没有设置响应,将抛出一个 404 错误。
namespace App\EventListener; use Kikwik\PageBundle\Event\PageExtraSlugEvent; use Symfony\Component\EventDispatcher\Attribute\AsEventListener; use Symfony\Component\HttpFoundation\Response; use Twig\Environment; #[AsEventListener(event: PageExtraSlugEvent::NAME, method: 'onPageExtraSlug')] class PageExtraSlugListener { public function __construct( private Environment $twig, private MyCustomController $customController, ) { } public function onPageExtraSlug(PageExtraSlugEvent $event) { $pageTranslation = $event->getPageTranslation(); $extraSlug = $event->getExtraSlug(); if($extraSlug == 'some string that matches') { $response = $this->customController->customAction($pageTranslation); $event->setResponse($response); } } }