¿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?


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

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).


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


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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.