octobercms Как изменить тип виджета поля содержимого в моем плагине расширения блога

Мне нужно создать сообщение в блоге, в котором не используется виджет Markdown для ввода контента.

Я хочу использовать плагин RainLab Blog и понимаю, что мне не следует изменять RainLab \ Blog \ Post \ Models \ fields.yml, поскольку обновления будут перезаписывать мои изменения.

Поэтому я создал расширение, следуя руководству по расширению подключаемого модуля пользователя по адресу https://vimeo.com/108040919, но Конечно, в моем случае я расширяю плагин Blog.

В моем расширении плагина мне не нужны новые поля, как вы видите в руководстве. Все, что мне нужно сделать, это изменить виджет содержимого с «markdown» на «richeditor». Я просмотрел эту страницу http://octobercms.com/docs/backend/forms, и попытался использовать filterForms в моей новой модели. Однако я не уверен, что я должен это использовать.

У кого-нибудь была аналогичная проблема с решением?


person Ben    schedule 13.07.2016    source источник


Ответы (2)


Вы можете взломать его, как в приведенном ниже коде. Это будет работать, пока переменные не равны protected.

Вам необходимо обновить type на все, что вы хотите (в данном случае richeditor). Вы также можете добавлять / редактировать другие атрибуты (например, css).

Важно подключиться к событию before, чтобы подготовить значения перед их использованием в виджете Form. Документированный метод расширения перехватывает событие after, поэтому уже слишком поздно изменять атрибуты поля.

class Plugin extends PluginBase
{

    public function register()
    {
        \Event::listen('backend.form.extendFieldsBefore', function ($widget) {
            if ( ! $widget->model instanceof \RainLab\Blog\Models\Post) {
                return;
            }

            array_set($widget->secondaryTabs, 'fields.content.type', 'richeditor');
        });
    }
}
person Gabsource    schedule 31.07.2016
comment
Хорошо спасибо. У меня не было возможности вернуться к этому. У меня уже был настроен статический метод прослушивания событий в моем настраиваемом плагине, но я не знал, какую логику использовать и какой массив изменить, поскольку документация по этому поводу плохая. Я попробую и посмотрю, что будет. - person Ben; 07.08.2016

Если у вас есть плагин Rainlab Translate, вам нужно изменить строку кода php, потому что эта строка переопределяет конфигурацию yaml.

Перейдите в controllers / Posts.php и измените функцию:

public function formExtendFieldsBefore($widget)
{
    if (!$model = $widget->model) {
        return;
    }

    if ($model instanceof Post && $model->isClassExtendedWith('RainLab.Translate.Behaviors.TranslatableModel')) {
         $widget->secondaryTabs['fields']['content']['type'] = 'RainLab\Blog\FormWidgets\MLBlogMarkdown';

    }
}

для этого

public function formExtendFieldsBefore($widget)
{
    if (!$model = $widget->model) {
        return;
    }

    if ($model instanceof Post && $model->isClassExtendedWith('RainLab.Translate.Behaviors.TranslatableModel')) {
        // $widget->secondaryTabs['fields']['content']['type'] = 'RainLab\Blog\FormWidgets\MLBlogMarkdown';
        $widget->secondaryTabs['fields']['content']['type'] = 'richeditor';
    }
}

У этого есть проблема, так как этот плагин работает с форматом уценки внутри, он анализируется в формате html и сохраняется в столбце content_html, но с richeditor у вас уже есть его в формате html, синтаксический анализ завершится неудачно, и content_html будет пустым, поэтому вам нужно распечатать столбец содержимого в ваших представлениях

person XseguiB    schedule 16.12.2016