Page
A page is a doctrine entity that contains blocks and form builder.
You can run php bin/console make:page
and generate a new page in an interactive way.
namespace App\Entity\Page;
use App\Core\Entity\Site\Page\Block;
use App\Core\Entity\Site\Page\Page;
use App\Core\Form\Site\Page\TextBlockType;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Form\FormBuilderInterface;
#[ORM\Entity]
class YourPage extends Page
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'myBlock',
TextBlockType::class,
[
'label' => 'My block',
'options' => [
// options given to the sub form
],
]
);
// ...
}
public function setMyBlock(Block $block)
{
return $this->setBlock($block);
}
public function getMyBlock(): Block
{
return $this->getBlock('myBlock');
}
// ...
}
Then edit config/packages/app.yaml
and add your page:
core:
site:
pages:
App\Entity\Page\SimplePage:
name: 'Simple page'
templates:
- {name: "Default", file: "page/simple/default.html.twig"}
App\Entity\Page\YourPage:
name: 'Your page'
templates:
- {name: "Template 1", file: "page/your_page/template1.html.twig"}
- {name: "Template 2", file: "page/your_page/template2.html.twig"}
Blocks
TextBlockType
App\Core\Form\Site\Page\TextBlockType
will render a symfony TextType
.
TextareaBlockType
App\Core\Form\Site\Page\TextareaBlockType
will render a symfony TextareaType
.
ChoiceBlockType
App\Core\Form\Site\Page\ChoiceBlockType
will render a symfony ChoiceType
.
FileBlockType
App\Core\Form\Site\Page\FileBlockType
will render a symfony FileType
with a download link.
In the getter, you must specify the block:
use App\Core\Entity\Site\Page\FileBlock;
public function getMyBlock(): Block
{
return $this->getBlock('myBlock', FileBlock::class);
}
FilePickerBlockType
App\Core\Form\Site\Page\FilePickerBlockType
will render a specific widget that use the file manager.
EditorJsTextareaBlockType
App\Core\Form\Site\Page\EditorJsTextareaBlockType
will render a EditorJs widget.
GrapesJsBlockType
App\Core\Form\Site\Page\GrapesJsBlockType
will render a GrapesJS editor.
TinymceTextareaBlockType
App\Core\Form\Site\Page\TinymceTextareaBlockType
will render a Tinymce editor.
ImageBlockType
App\Core\Form\Site\Page\ImageBlockType
will render a symfony FileType
with a preview of the image.
In the getter, you must specify the block:
use App\Core\Entity\Site\Page\FileBlock;
public function getMyBlock(): Block
{
return $this->getBlock('myBlock', FileBlock::class);
}
CollectionBlockType
App\Core\Form\Site\Page\CollectionBlockType
will a render a symfony CollectionType
with availabity to add and remove elements.
use App\Core\Entity\Site\Page\CollectionBlock;
public function getMyBlock(): Block
{
return $this->getBlock('myBlock', CollectionBlock::class);
}
Event
When a page is being edited, the options can be set as follows:
namespace App\EventSubscriber;
use App\Core\Event\Page\PageEditEvent;
use App\Entity\Page\YourPage;
class PageEventSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
PageEditEvent::FORM_INIT_EVENT => ['onFormInit'],
];
}
public function onFormInit(PageEditEvent $event)
{
if ($event->getPage() instanceof YourPage) {
$event->addPageBuilderOptions([
// options
]);
}
}
}