Обезьяна исправляет CKEditor для вставки видео на YouTube - PullRequest
0 голосов
/ 17 февраля 2011

Я пытаюсь настроить 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, и мой «патч» меняет его ...

1 Ответ

1 голос
/ 17 февраля 2011

Если вы присоедините 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
       }
    }
}
...