# Page - Documentation of Murph
None

Skip to content

# 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.

src/Entity/Page/YourPage.php

    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:

src/EventSubscriber/PageEventSubscriber.php

    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
                ]);
            }
        }
    }