¿Cómo anular las clases principales?

20

A veces es necesario anular las clases principales para obtener más funcionalidad o hacer que algunas funciones centrales funcionen de otra manera. ¿Hay alguna forma de anular las clases principales? Si es posible, ¿qué problemas puedo enfrentar al anularlos?

Dmitry Rekun
fuente
1
Sería genial si pudiera refinar su pregunta para hacerlo un poco más específico o para describir un problema claro.
Valentin Despa
Para usuarios de Joomla 3, verifíquelos. Te ayudará. joomla.stackexchange.com/questions/5449/… Plugin - github.com/ghazal/plg_mvcoverride Gracias joomla.stackexchange.com/users/270/ghazal
cha

Respuestas:

16

Sí, es posible.

Puede usar un complemento del sistema para anular las clases, lea este enlace y esto y esto

Dos problemas que enfrentará:

  1. necesita anular toda la clase (no solo partes de ella)

  2. Si el núcleo se actualiza y la clase también se actualiza / cambia, debe actualizar su anulación (si es necesario).

jackJoe
fuente
44
Sería útil si pudiera pegar los pasos pertinentes de los enlaces proporcionados, o al menos dar una descripción de los enlaces, en caso de que se muevan o cambien.
codinghands
10

Creé un complemento hace un tiempo que le permite anular las clases principales, pero aún es víctima de los problemas que @jackJoe señaló en su respuesta. Sin embargo, le permite hacer las anulaciones limpiamente.

https://gist.github.com/dongilbert/3237387

Don gilbert
fuente
77
Solo quiero decir que esta solución funciona de maravilla, y que Don es un verdadero espíritu afín de código abierto, ¡felicitaciones para él y su trabajo!
PIB
Hay un problema importante con su script simple, es que no precarga componentes. Entonces, si anula componentes, realmente no funciona para la mayoría de ellos (por ejemplo, el componente com_content). Funciona bien, pero debe precargar el componente para que pueda anularlos (no puede anular algo que aún no se ha declarado). Ah, y debes usar onAfterRoute en lugar de hacer todo en el constructor. Si quieres saber a qué me refiero con este comentario, intenta anularlo components/com_content/models/articles.php.
itoctopus el
4

Estuve en este durante mucho tiempo y le prometí a Don que una vez que termine, daré más detalles al respecto.

Necesitaba anular Joomla MVC para los componentes y decirle a Joomla que busque anulaciones en mi carpeta html del complemento también, no solo dentro de la carpeta html de la plantilla.

Lo que nunca me gustó es cuando los desarrolladores realmente toman la clase predeterminada de Joomla y se meten con ella, así que prefiero extender esa clase si puedo, en lugar de frenar algo.

Mi proceso hace lo siguiente.

  1. Obtener la clase que necesito anular
  2. Léalo, reemplace el nombre de la clase, cree un nuevo archivo en mi carpeta de clase temporal
  3. Cargue mi versión de la clase
  4. Cargar clase Joomla
  5. Registre mi método de extensión que extiende la función loadTemplate para buscar anulación en mi complemento, que la plantilla de joomla y el último componente de joomla

Aquí está la imagen más bien http://prntscr.com/3d9syq

Las primeras partes en el fragmento a continuación están verificando dónde está el usuario, si está a punto de actualizar Joomla, estoy eliminando los archivos de clase temporal que se crearon para asegurarme de que obtengamos nuevos cuando se complete la actualización, que se ocupa del número de JackJoe 2)

if (($this->Input('option') == 'com_joomlaupdate' && $this->Input('task') == 'update.install') || ($this->Input('option') == 'com_joomlaupdate' && $this->Input('layout') == 'complete')) {

    JFolder::delete(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    JFolder::create(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    $indexContent = '';
    JFile::write(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/index.html', $indexContent);
}

$YjsgJViewDefaultRead         = JPATH_LIBRARIES . '/legacy/view/legacy.php';
$YjsgJViewDefaultFile         = YJSGEXTEND . "classes" . YJDS . "Yjsg" . $isView . "Default" . $IsJversion . ".php";



    //extend JView library class

    if (!JFile::exists($YjsgJViewDefaultFile)) {
        $YjsgJViewDefault = JFile::read($YjsgJViewDefaultRead);
        $YjsgJViewDefault = str_replace('class ' . $isView, 'class Yjsg' . $isView . 'Default', $YjsgJViewDefault);
        JFile::write($YjsgJViewDefaultFile, $YjsgJViewDefault);
    }

    require_once($YjsgJViewDefaultFile);
    jimport('joomla.application.component.view');
    JLoader::register($isView, YJSGEXTEND . $IsJversion . '/component/view.php', true);
Dan
fuente