Monkey исправляет CKEditor для встраивания видео с YouTube

Я пытаюсь настроить CKEditor так, чтобы он мог напрямую вставлять видео с YouTube... Я видел предлагаемый патч, но я хочу сохранить исходный дистрибутив CKEditor как есть, поэтому мне было интересно, возможно ли «обезьянье исправление» CKEditor во время выполнения, чтобы, если пользователь вводит URL-адрес YouTube в диалоговом окне Flash, URL-адрес преобразовывался в разрешить встраивание.

Я пробовал это:

CKEDITOR.on('dialogDefinition', function(ev){
    if (dialogName == 'flash'){
        var infotab = dialogDefinition.getContents('info');
        var f = dialogDefinition.onOk;
        dialogDefinition.onOk = function(ev) {
            var cur = this.getContentElement('info', 'src').getValue();
            var newurl = cur.replace('youtube.com/watch?v=', 'youtube.com/v/'); 
            if (cur != newurl) { 
                this.getContentElement('info', 'src').setValue(newurl);
            };
            f(ev);
       }
    }
}

но не получится, так как внутри f код использует this, а мой "патч" его меняет...


person Joril    schedule 16.02.2011    source источник


Ответы (1)


Если вы прикрепите onOK к другому свойству dialogDefinition, this будет правильным внутри него (я думаю).

CKEDITOR.on('dialogDefinition', function(ev){
    if (dialogName == 'flash'){
        var infotab = dialogDefinition.getContents('info');
        dialogDefinition.oldOnOk = dialogDefinition.onOk; //change here
        dialogDefinition.onOk = function(ev) {
            var cur = this.getContentElement('info', 'src').getValue();
            var newurl = cur.replace('youtube.com/watch?v=', 'youtube.com/v/');
            if (cur != newurl) { 
                this.getContentElement('info', 'src').setValue(newurl);
            };
           dialogDefinition.oldOnOk(ev); //and change here
       }
    }
}

Или используйте Function.apply:

CKEDITOR.on('dialogDefinition', function(ev){
    if (dialogName == 'flash'){
        var infotab = dialogDefinition.getContents('info');
        var f = dialogDefinition.onOk; 
        dialogDefinition.onOk = function(ev) {
            var cur = this.getContentElement('info', 'src').getValue();
            var newurl = cur.replace('youtube.com/watch?v=', 'youtube.com/v/');
            if (cur != newurl) { 
                this.getContentElement('info', 'src').setValue(newurl);
            };                
            f.apply(this, ev);  //change here
       }
    }
}
person jball    schedule 16.02.2011
comment
Также мне пришлось добавить перед строкой if: var dialogName = ev.data.name; var dialogDefinition = ev.data.definition; - person rhu; 03.03.2011