Как стать автором
Обновить

Неочевидные особенности настройки Genemu TinyMCE для Symfony2

Время на прочтение4 мин
Количество просмотров7.1K
GenemuFormBundle — бандл, предоставляющий удобную реализацию некоторых виджетов для Symfony2, в частности, популярного WYSIWYG-редактора TinyMCE. Рассмотрим две типовые задачи: использование TinyMCE в бэкэнде и настройка bb-кодов во фронтенде.


Предисловие


При попытке использовать GenemuFormBundle в своем приложении я столкнулась с проблемой нехватки документации. Скорее всего, для гуру решение поставленных задач будет очевидным. Данная статья адресована в первую очередь таким же новичкам, как я.
Процедура установки GenemuFormBundle стандартная, подробно описана в документации и не вызывает проблем. Кроме того, разговор не об этом. Поговорим подробнее о виджете TinyMCE. Разумеется, кому-то проще прописать по старинке в шаблонах все необходимые скрипты и настройки, однако использование бандла избавит нас от многих хлопот. Документация для него не слишком подробная, и вот ее несколько вольный перевод с пояснениями.

Официальная документация по виджету TinyMCE из GenemuFormBundle.


После выполнения инструкций по установке бандла GenemuFormBundle, надо скачать и сложить в папку /web/bundles/genemuform/ скрипты с TinyMCE. Можно сложить JS в любое место, ссылка на скрипт настраивается.
Чтобы получить доступ к функциональности TinyMCE, надо прописать в конфигурационном файле как минимум вот это:
# app/config/config.yml
genemu_form:
    tinymce: ~


Вот так будет выглядеть самое простое использование данного виджета в форме:
<?php
// ...
public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        // ...
        ->add('content', 'genemu_tinymce');
}


Чтобы виджет заработал, необходимо подключить необходимые js-библиотеки. Для этого добавьте в свой шаблон:
{% block javascripts %}
    <script src="{{ asset('js/jquery-1.7.min.js') }}"></script>
    <script src="{{ asset('tinymce/jquery.tinymce.js') }}"></script>

    {{ form_javascript(form) }}
{% endblock %}

{% block body %}
    <form action="{{ path('my_route_form') }}" type="post" {{ form_enctype(form) }}>
        {{ form_widget(form) }}

        <input type="submit" />
    </form>
{% endblock %}

Обратите внимание на фрагмент {{ form_javascript(form) }}. Он требуется для применения конкретных конфигурационных настроек виджетов из GenemuFormBundle.

В конфигурации вы можете указать путь до скрипта TinyMCE:
# app/config/config.yml
genemu_form:
    tinymce:
        script_url: '/tinymce/tiny_mce.js'

По умолчанию поле TinyMCE имеет следующие настройки:
# app/config/config.yml
genemu_form:
    tinymce:
        enabled: true
        theme:   advanced

На основе данного примера не трудно догадаться, что в app/config/config.yml можно прописать любые настройки конфигурации, которые поддерживает TinyMCE.
На этом официальная документация заканчивается. А теперь рассмотрим, как сделать, чтобы TinyMCE заработал в SonataAdminBundle и как сделать различные настройки Tiny в разных формах на сайте.

TinyMCE и SonataAdminBundle


Итак, мы установили SonataAdminBundle и хотим использовать TinyMCE в нашем бэкэнде для внесения статей или новостей на наш сайт. Для этого нам подойдут настройки плагина по умолчанию, надо только прикрутить сам виджет к форме. Подробное описание по работе с SonataAdminBundle можно найти в этом прекрасном посте. А мы рассмотрим конкретные настройки для нашего виджета.
В конфигурации админки пишем следующее:
/* my_app\PagesBundle\Admin\PagesAdmin.php */
    protected function configureFormFields(FormMapper $formMapper)
    {
	//...
        $formMapper->add( 'body','genemu_tinymce',array('label' => 'Содержание'));
        //...
    }

Теперь необходимо перекрыть шаблон SonataAdminBundle, чтобы прикрепить наши JavaScript:
{# /app/Resources/SonataAdminBundle/views/standard_layout.html.twig #}

        {% block javascripts %}
	    {# ... #}            

            <script type="text/javascript" src="/bundles/genemuform/tinymce/jscripts/tiny_mce/tiny_mce.js"></script>
            {% if form is defined %}
                {{ form_javascript(form) }}
            {% endif %}
        {% endblock %}


Подключаю сразу в standard_layout, чтобы использовать потом и другие виджеты из GenemuFormBundle.
Заходим в админку, и видим, что всё заработало:

Напомню, что вывод HTML без экранирования в твигах делается так:
{{ entity.body | raw }}
PS Чтобы не удивляться результатам, «волшебные кавычки» надо отключить.

Различные настройки TinyMCE для разных форм.


А теперь представим, что кроме статей на сайте будут размещаться комментарии, в которых мы тоже хотим использовать TinyMCE, но уже с bb-кодами. Немного покопавшись в исходных кодах GenemuFormBundle, выясняем, что настройки можно прописывать не только глобально для всего приложения, но и для конкретного виджета, в качестве параметров:
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
	//...
        $builder->add('body','genemu_tinymce',array(
                        'label' => 'Содержание',
                        'configs' =>array(
                            'entity_encoding'=>'raw',
                            'plugins' => 'bbcode',
                            'add_unload_trigger' => 'false',
                            'remove_linebreaks' => 'false',
                            'inline_styles' => 'false',
                            'convert_fonts_to_spans' => 'false',

                            'theme_advanced_buttons1' => 'bold,italic,underline,undo,redo,link,unlink,forecolor,styleselect,removeformat,cleanup,code',
                            'theme_advanced_buttons2' => '',
                            'theme_advanced_buttons3' => '')
                    )) ;
	//...
    }


Далее всё делаем в соответствии с документацией к бандлу, и получаем следующее:

Да, действительно заработали bb-коды.

Список использованных источников


  1. GenemuFormBundle
  2. TinyMCE
  3. SonataAdminBundle
  4. Административный интерфейс с SonataAdminBundle
Теги:
Хабы:
+3
Комментарии2

Публикации

Истории

Работа

PHP программист
157 вакансий

Ближайшие события