ti-enxame.com

Como substituir classes principais?

Às vezes, é necessário substituir as classes principais para obter mais funcionalidades ou fazer com que algumas funções principais funcionem de outra maneira. Existe alguma maneira de substituir classes principais? Se possível, que problemas posso enfrentar ao substituí-los?

20
Dmitry Rekun

Sim, é possível.

Você pode usar um plug-in do sistema para substituir as classes, leia este link e this e this

Dois problemas que você enfrentará:

  1. você precisa substituir toda a classe (não apenas partes dela)

  2. se o núcleo for atualizado e a classe também for atualizada/alterada, será necessário atualizar sua substituição (se necessário).

16
jackJoe

Há um tempo atrás, criei um plug-in que permite substituir as classes principais, mas ainda é vítima dos problemas que o @jackJoe apontou em sua resposta. No entanto, ele permite que você faça as substituições de forma limpa.

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

10
Don Gilbert
5
cha

Estive nessa por muito tempo e prometi a Don que, assim que terminar, darei mais detalhes sobre isso.

Eu precisava substituir o Joomla MVC por componentes e dizer ao Joomla para procurar substituições na minha pasta html do plugin também, não apenas dentro da pasta html do modelo.

O que eu nunca gostei é quando os desenvolvedores realmente pegam a classe padrão do Joomla e mexem com ela, então prefiro estender essa classe, se puder, em vez de frear alguma coisa.

Meu processo segue.

  1. Obter a classe que preciso substituir
  2. Leia, substitua o nome da classe, crie um novo arquivo na minha pasta de classe temporária
  3. Carregar minha versão da classe
  4. Carregar classe Joomla
  5. Registrar meu método de extensão que estende a função loadTemplate para procurar substituição no meu plugin, do que o modelo joomla e o último componente joomla

aqui está a imagem em vez http://prntscr.com/3d9syq

As primeiras partes do snippet abaixo estão verificando onde o usuário está, se ele está prestes a atualizar o Joomla. Estou excluindo os arquivos de classe temporária criados para garantir que recebamos novos quando a atualização for concluída, que cuida do número 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);
4
Dan