CKEditor 4 динамический выбор в диалоговом окне

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


person bclingan    schedule 14.03.2011    source источник


Ответы (4)


Я думаю, что вы пытаетесь динамически заполнить раскрывающийся список в своем плагине. И по какой-то причине этот раскрывающийся список необходимо заполнить, пока диалоговое окно открыто.

Если да, то вот что я сделал для аналогичной ситуации:

{
    type: 'select',
    id: 'exam_ID',
    label: 'Select Exam',
    items : [ ['--- Select an Exam---',0] ],
    setup : function(element) {
        var element_id = '#' + this.getInputElement().$.id;
        $.ajax({
            type: 'POST',
            url: 'lib/ckeditor/plugins/customExam/utilities/listExams.aspx',
            data: '{"cpID":' + window.parent.$("#cpID").val() + '}',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            async: false,
            success: function(data) {
                $.each(data.DATA, function(index, item) {
                    $(element_id).get(0).options[$(element_id).get(0).options.length] = new Option(item[1], item[0]);
                });
            },
            error:function (xhr, ajaxOptions, thrownError){
                alert(xhr.status);
                alert(thrownError);
            } 
        });
    }

}

Ключом было найти идентификатор элемента, который устанавливает CKEditor, который не является id в определении элемента. Вы можете использовать этот id для других функций, но если вы планируете выполнять какое-либо обновление элемента, вам нужно получить элемент DOM CKEditor.

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

person voidinutah    schedule 27.07.2011
comment
Я заметил, что в setup: вы не используете аргумент element — это нормально? - person Nano Taboada; 26.12.2012
comment
Я не могу понять, почему, но мне пришлось использовать событие onLoad, а не setup при использовании ckeditor 4.5.4. ссылка на диалоговое окно uiElement. - person jxmallett; 19.04.2016

Боб,

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

        //for button we just want to limit the button type to button
    if ( dialogName == 'button' ) {

        // updates the info tab 
        var infoTab = dialogDefinition.getContents( 'info' );
        var typeDef = infoTab.get( 'type' );
        var buttonType = new Array("Button", "button");
        var myItems = new Array (buttonType); 
        typeDef['items'] = myItems;

Если это не поможет, предоставьте дополнительную информацию о фактических и ожидаемых результатах.

person rquinn    schedule 14.03.2011
comment
Я хочу динамически заполнить выборку, например: Пример: содержимое : [ { тип : 'выбрать', метка : 'Выберите исследование:', ширина : 200, элементы : [ ['один',1],['два',2] ] } ] } ] }; }) ; ` - person bclingan; 15.03.2011
comment
Ваш фрагмент был полезен ... но в основном мне нужно заполнить меню выбора через внешний источник, то есть, возможно, что-то вроде вызова ajax ... кажется, нет простого способа сделать это. Разве нет, возможно ли обернуть все, что я хочу сделать, внутри iframe, который попадает на другую веб-страницу. Это избавило бы меня от необходимости иметь дело с громоздкими определениями внутри редактора. - person bclingan; 15.03.2011
comment
Я не уверен, что понимаю, что мешает вам сделать вызов AJAX? Эти onDefinitions вызываются только один раз, а не каждый раз, когда пользователь щелкает плагин. Или загрузите данные во время запуска и сохраните их в DATA или где-то еще, а затем используйте их. - person rquinn; 17.03.2011

elements: [
                {
                    type: 'select',
                    id: 'test',
                    label: 'test label',
                    items: [
                        ['Please Choose', '']
                    ],
                    onLoad: function(element) {
                        this.add('Option 1', '1');
                        this.add('Option 2', '2');
                    }              
               }
        ]

Если вы хотите добавить или удалить элементы, когда открывается диалоговое окно для редактирования. Вы можете использовать вызов setup. Поместите его выше или ниже определения onLoad.

                    setup: function(element) {
                        this.clear();

                        this.add('Please Choose', '');
                        this.add('Option 1', '1');
                        this.add('Option 2', '2');

                        this.setValue(element.getText());
                    },
person electron    schedule 21.08.2014

Улучшенный код, который использует метод add() и выбирает правильный элемент в списке.

{
    type: 'select',
    label: 'Select a page',
    id: 'localPage',
    items: [['', '']],
    setup: function(data) {
        var self = this;
        $.get('/pages.php', function(items) {
            items.forEach(function(item) {
                self.add(item[0], item[1]);
            });
            if (data.localPage) {
                self.setValue(data.localPage || '');
            }
        }).fail(function() {
            alert('An error occurred while getting the pages.');
        });
    },
}

Пример скрипта pages.php:

$pages = [
    ['Contact', '{!! page:4 !!}'],
    ['About', '{!! page:5 !!}'],
    ['Home page', '{!! page:1 !!}'],
];

return json_encode($pages);
person Samuel De Backer    schedule 06.04.2020