MihailDev / yii2-ckeditor

Yii2 CKEditor
Other
119 stars 67 forks source link

Add new and my plugins #7

Open loveorigami opened 9 years ago

loveorigami commented 9 years ago

Михаил, подскажите, как я могу добавить новые (или свои) плагины в редактор. http://ckeditor.com/addons/plugins/all Думаю так:

MihailDev commented 9 years ago

сложный вопрос думаю правельнее сделать через CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/', 'plugin.js' ); но надо както связать с ассетсами чтоб всё автоматом подтягивалось у меня пока нету времени занятся этим если у вас будут предложения по реализвации буду рад помощи!

loveorigami commented 9 years ago

Да, это если писать свой плагин, можно взять на заметку. http://ckeditor.com/forums/CKEditor-3.x/Tutorial-create-external-plugin-for-CKEDITOR

А из тех, которые я хочу добавить из уже разработанных, они предполагают установку путем копирования в папку plugins... http://docs.ckeditor.com/#!/guide/dev_plugins например, этот - http://ckeditor.com/addon/footnotes

видимо, просто придется обновлять ckeditor вручную... Неизвестно еще как после обновления поведут себя эти плагины...

MihailDev commented 9 years ago

невижу ничего сложно скачиваем и распаковываем кудато плагин далее во вьюхе

list(,$footnotesUrl) = Yii::$app->assetManager->publish('@app/path/to/footnotes');
$this->registerJs("CKEDITOR.plugins.addExternal( 'footnotes', ".\yii\helpers\Json::encode($footnotesUrl).", 'plugin.js' );");
loveorigami commented 9 years ago

В общем, по разному. Через компонент запустить не получилось ... Возможно баг с $options['extraPlugins'];

        <script>
            CKEDITOR.replace( 'editor1', {
                extraPlugins: 'magicline',
                extraPlugins: 'footnotes',
                extraPlugins: 'widget',
                // Ensure that magicline plugin, which is required for this sample, is loaded.
                allowedContent: true
            } );
        </script>
        if($this->_inline){
            $options['extraPlugins'] = 'sourcedialog';
            $options['removePlugins'] = 'sourcearea';
        }

кстати - на демке http://demo.gridlight-design.co.uk/ckeditor-footnotes.html тоже используется предустановленный в ckeditor.js плагин...

loveorigami commented 9 years ago

Наконец дошли руки до плагинов :) В общем, разобрался, почему они не подключаются...

Дело в том, что код

$this->registerJs("CKEDITOR.plugins.addExternal( 'footnotes', ".\yii\helpers\Json::encode($footnotesUrl).", 'plugin.js' );");

только регистрирует плагин.

а для того, чтобы появилась кнопка в редакторе, его необходимо инициализировать. и выполнить скрипт в таком порядке

                CKEDITOR.plugins.addExternal('footnotes', $footnotesUrl);
                CKEDITOR.replace('id_editor', {
                    // Load the footnotes plugin.
                    extraPlugins: 'footnotes',
                });
loveorigami commented 9 years ago

На деле же данный код в комбинации с POS

$this->registerJs("CKEDITOR.plugins.addExternal( 'footnotes', ".\yii\helpers\Json::encode($footnotesUrl).", 'plugin.js' );");

вызывается либо выше самого ckeditor.js, либо ниже CKEDITOR.replace('id_editor',.... и по этой причине плагин footnotes не подключается...

loveorigami commented 9 years ago

В связи с чем у меня есть идея ). Недавно я написал модуль плагинов, работающий на событиях. https://github.com/loveorigami/yii2-plugins-system

Когда собирал инфу по этому вопросу, находил и ваше сообщение http://www.yiiframework.ru/forum/viewtopic.php?t=19722#p115748 помогло )

Идея заключается в следующем :+1: Ввести в ваш класс CKEditor несколько event - ов, участвующих в формировании конфигурации редактора.

Например, если я все правильно понимаю, после создания такового - EVENT_BEFORE_INITEDITOR (по минимому) отдаст мне ID редактора и его preset.

Затем, как в данном плагине https://github.com/loveorigami/yii2-plugins-system/blob/master/plugins/code/Code.php в функции ShortCode я получаю эти данные, в зависимости от которых произвожу свои операции: например - для пресета mini не возвращать дополнительных настроек.

А для остальных пресетов я возвращаю URL extraplagins и набор самих extra ск-плагинов (abbr, footnotes etc.)

Вы же, получив эти данные, формируете окончательные настройки инициализации редактора, подключив вверху сначала extra-плагины, а потом вызвав их в самом CKEDITOR.replace('id_editor', {.....

Пока что в ручном режиме у меня получилось сделать так.

Во вьюшке создал textarea id="editor"

Код моего плагина

class Test
{
    /**
     * Application id, where plugin will be worked.
     * Support values: frontend, backend, common
     * Default: frontend
     * @var appId string
     */
    public static $appId = 'frontend';

    /**
     * Default configuration for plugin.
     * @var config array()
     */

    public static $config = [
        'mode' => 'full',
    ];

    public static function events()
    {
        return [
            'yii\base\View' => [
                'afterRender' => ['foo', self::$config]
            ],
        ];
    }

    /**
     * handler method foo
     */
    public function foo($event)
    {
        $view = $event->sender;

        $bundle = TestAsset::register($view);

        $view->registerJs("
            if(typeof CKEDITOR != 'undefined'){
                CKEDITOR.plugins.addExternal('footnotes', '$bundle->baseUrl/footnotes/');
                CKEDITOR.replace('editor', {
                    //language: 'ru',
                    uiColor: '#9AB8F3',

                    // Load the footnotes plugin.
                    extraPlugins: 'footnotes',

                    // Disable Advanced Content Filter as the plugin does not implement it (yet).
                    allowedContent: true,

                    // The following options are set to make the sample more clear for demonstration purposes.

                    // Rearrange toolbar groups and remove unnecessary plugins.
                    toolbarGroups: [
                        { name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },
                        { name: 'links' },
                        { name: 'insert' },
                        { name: 'document',    groups: [ 'mode' ] },
                        '/',
                        { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
                        { name: 'paragraph',   groups: [ 'list', 'indent' ] },
                        { name: 'styles' },
                        { name: 'about' }
                    ],
                    removePlugins: 'font,iframe,pagebreak,flash,stylescombo,print,preview,save,smiley,pastetext,pastefromword',
                    removeButtons: 'Anchor,Font,Strike,Subscript,Superscript'
                });
            }
        ", $view::POS_END);

        return true;
    }
}

и получаю результат. 0001

loveorigami commented 9 years ago

Т.е задача сводится к тому, как можно извне повлиять на настройки редактора. Возможно ли это через события?

NordSol commented 8 years ago

Я поддержу предыдущего оратора :)

Проблема имеет место быть: как и было сказано попытался подключить свой плагин (во вьюшку) через: list(,$linkstreeUrl) = Yii::$app->assetManager->publish('@app/web/js/cke_plugins/linkstree'); $this->registerJs("CKEDITOR.plugins.addExternal( 'linkstree', ".\yii\helpers\Json::encode($linkstreeUrl).", 'plugin.js' );");

код в странице есть: юрл плагина валиден, но эффекта нет.... при попытке добавить: CKEDITOR.replace('article-full', { // Load the footnotes plugin. extraPlugins: 'linkstree', });

получаю ошибку js: элемент уже назначен, ну или как-то так...

П.С. если прописываю в @app/vendor/mihaildev/yii2-ckeditor/editor/config.js: config.extraPlugins = 'linkstree';

все работает!.. но это же не правильно править вендоровские файлы :) хелп плиз...

loveorigami commented 8 years ago

Я. чтоб не править, сделал форк, добавил Asset с плагинами. Зарегистрировал его во вьюшке https://github.com/loveorigami/yii2-ckeditor/blob/master/CKEditor.php#L137

А потом нужные плагины добавил перед инициализацией редактора. https://github.com/loveorigami/yii2-ckeditor/blob/master/CKEditor.php#L192

И где нужно, прописал в пресеты https://github.com/loveorigami/yii2-ckeditor/blob/master/CKEditor.php#L91

После этого все заработало, как и хотелось выше ). Редактор отдельно (у себя вообще перенес в bower), доп. плагины - отдельно.

fullflash commented 8 years ago

https://github.com/sadovojav/yii2-ckeditor

eto fork MihailDev/yii2-ckeditor s dobavkami kak plugin i t.d