# GrapesJS

GrapesJS is a web builder which combines different tools and features with the goal to help users to build HTML templates without any knowledge of coding. It's a very good solution to replace the common WYSIWYG editor like TinyMCE.

GrapesJS is fully integrated in Murph as form types.

![](/_static/img/editors/grapesjs.png)

## Classic form

```php-inline
// src/Form/ExampleType.php
namespace App\Form\ExampleType;

use App\Core\Form\Type\GrapesJsType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ExampleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'myField',
            GrapesJsType::class
        );

        // ...
    }

    // ...
}
```

## Page form

```php-inline
// src/Entity/Page/YourPage.php
namespace App\Entity\Page;

use App\Core\Entity\Site\Page\Block;
use App\Core\Form\Site\Page\GrapesJsBlockType;

#[ORM\Entity]
class YourPage extends Page
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'myBlock',
            GrapesJsBlockType::class,
            [
                'label' => 'My block',
                'row_attr' => [
                ],
                'options' => [
                    // options given to the sub form
                ],
            ]
        );

        // ...
    }

    public function setMyBlock(Block $block)
    {
        return $this->setBlock($block);
    }

    public function getMyBlock(): Block
    {
        return $this->getBlock('myBlock');
    }

    // ...
}
```

## Options

There are 3 modes:

* Bootstrap 4 (default): `bootstrap4`
* Preset webpage: `presetWebpage`
* Preset newsletter: `presetNewsletter`

To specify a mode, you must define the attribute `data-grapesjs`:

```php-inline title="src/Form/ExampleType.php"
$builder->add(
    'myField',
    GrapesJsType::class,
    [
        // ...

        'attr' => [
            'data-grapesjs' => 'bootstrap4',
        ],
    ]
);

```php-inline title="src/Entity/Page/YourPage.php"
$builder->add(
    'myBlock',
    GrapesJsBlockType::class,
    [
        // ...

        'options' => [
            'attr' => [
                'data-grapesjs' => 'bootstrap4',
            ],
        ],
    ]
);
```

## Rendering

GrapesJS will generate a JSON which contains HTML and CSS.

* To extract HTML: `{% set html = value|grapesjs_html %}`
* To extract CSS: `{% set css = value|grapesjs_css %}`

Depending of the mode, you will need to import in the app sass file:

* Bootstrap 4: `@import "~bootstrap/scss/bootstrap.scss";`
* Preset webpage: `@import "~grapesjs-preset-webpage/dist/grapesjs-preset-webpage.min.css";`
* Preset newsletter: `@import "~grapesjs-preset-newsletter/dist/grapesjs-preset-newsletter.css";`
