Estendendo um módulo Moodle YUI 3

Nosso formato de curso Moodle oferece a funcionalidade de substituir os ícones de edição de recursos padrão com texto real. No Moodle 2.3, conseguimos isso substituindo os renderizadores principais e os módulos YUI principais. É mais fácil falar do que fazer porque precisamos preservar todas as funcionalidades que você obtém com os ícones, incluindo o sofisticado AJAX. Poderíamos ter reescrito o JS para isso, mas descobrimos que é possível substituir os módulos YUI do Moodle.

A funcionalidade AJAX foi definida nos módulos principais. Os módulos principais do Moodle são definidos como qualquer módulo YUI padrão da seguinte forma:

YUI.add('moodle-module', function(Y) {
...
// Class definition
var SOMECLASS = function () {
SOMECLASS
.superclass.constructor.apply(this, arguments);
}

// Define your class
...

// Moodle modules usually extend some other core module
Y
.extend(SOMECLASS, Y.Base, {
some_method
: function(param) {
// Do something...
return foo;
}, {
NAME
: ...,
ATTRIB
: ...
});

// Define a global variable
M
.somcleass = M.somclass || {};
M
.someclass.obj = SOMECLASS;

}, '@VERSION@', {requires: [ ... ]});

Suponha que você queira estender esse módulo, você faria algo como:

YUI.add('my-module', function(Y) {

var MYCLASS = function() {
MYCLASS
.superclass.constructor.apply(this, arguments);
}

// Inherit from parent class
Y
.extend(MYCLASS, M.someclass.obj);

// Now extend
Y
.prototype.custom_method = function() {
// Do something..
}
//
}, '@VERSION@', {requires: ['moodle-module']});

Isso é pura herança de classe. Agora suponha que você queira chamar um método pai e fazer algo interessante depois que ele for chamado.

...
// Call parent method
MYCLASS
.prototype.some_method = function(param) {
// Call parent method
var foo = MYCLASS.superclass.some_method.apply(this, [param]);

// Do something after you call the parent method..
// Perhaps override the images with text!

// return what's expected
return foo;
}

O fim.