Пытаясь выяснить, как динамически заполнять меню выбора в диалоговом окне... во всех моих попытках до сих пор я не смог заставить его работать правильно.
CKEditor 4 динамический выбор в диалоговом окне
Ответы (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.
Там может быть лучший способ сделать это, но это работает для меня.
setup:
вы не используете аргумент element
— это нормально?
- person Nano Taboada; 26.12.2012
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;
Если это не поможет, предоставьте дополнительную информацию о фактических и ожидаемых результатах.
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());
},
Улучшенный код, который использует метод 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);