Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new and my plugins #7

Open
loveorigami opened this issue Dec 6, 2014 · 11 comments
Open

Add new and my plugins #7

loveorigami opened this issue Dec 6, 2014 · 11 comments

Comments

@loveorigami
Copy link

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

  • добавляю в папку https://github.com/MihailDev/yii2-ckeditor/tree/master/editor/plugins свой плагин
  • переопределяю CKEditor.php, дописываю свой preset
  • там же подключаю плагины
  • вопрос в следующем - после обновления пакета не удалятся ли эти дополнительные плагины? или как можно сделать, чтоб они не удалялись...?
@MihailDev
Copy link
Owner

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

@loveorigami
Copy link
Author

Да, это если писать свой плагин, можно взять на заметку.
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
Copy link
Owner

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

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

@loveorigami
Copy link
Author

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

  • Для начала установил плагин отдельно от фреймворка.
  • скачал ckeditor (4.4.6) с предустановленным плагином.
  • подключил на странице через конфиг
        <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>
  • плагин подключился и заработал... (ckeditor.js - в нем уже все подключено, настроено и тп.. как родное, а не внешнее.)
    001
  • затем скачал отдельно чистый ckeditor.js, отдельно скачал footnotes и widget (как зависимый).
  • подключал, как CKEDITOR.plugins.addExternal... редактор не отобразился...
  • кстати - такое же поведение наблюдается, если установить inline=true.
  • по коду подключается
        if($this->_inline){
            $options['extraPlugins'] = 'sourcedialog';
            $options['removePlugins'] = 'sourcearea';
        }
  • а редактор не отображается...
  • вот и думаю - как подключать эти сторонние плагины. может нужна какая то специальная сборка ckeditor.js?

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

@loveorigami
Copy link
Author

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

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

$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
Copy link
Author

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

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

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

@loveorigami
Copy link
Author

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

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

Идея заключается в следующем 👍
Ввести в ваш класс 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
Copy link
Author

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

@loveorigami loveorigami reopened this Aug 4, 2015
@NordSol
Copy link

NordSol commented Nov 20, 2015

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

Проблема имеет место быть:
как и было сказано попытался подключить свой плагин (во вьюшку) через:
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
Copy link
Author

Я. чтоб не править, сделал форк, добавил 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
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants