Como substituir classes principais?


20

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


11
Seria ótimo se você pudesse refinar sua pergunta para torná-la um pouco mais específica ou para descrever um problema claro.
Valentin Despa

Para usuários do Joomla 3 - verifique estes. Isso vai te ajudar. joomla.stackexchange.com/questions/5449/... Plugin - github.com/ghazal/plg_mvcoverride Graças joomla.stackexchange.com/users/270/ghazal
cha

Respostas:


16

Sim, é possível.

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

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


4
Seria útil se você pudesse colar as etapas pertinentes nos links fornecidos ou, pelo menos, fornecer uma descrição dos links, caso eles se movam ou mudem.
Codigohands

10

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


7
Só quero dizer que esta solução funciona lindamente e que Don é um verdadeiro espírito de código-fonte aberto - tiramos o chapéu para ele e seu trabalho !!!
GDP

Há um problema substancial com seu script simples: ele não pré-carrega componentes. Portanto, se você substituir componentes, ele realmente não funcionará para a maioria deles (por exemplo, o componente com_content). Funciona bem, mas deve pré-carregar o componente para que possa substituí-los (você não pode substituir algo que ainda não foi declarado). Ah, e você deve usar onAfterRoute em vez de fazer a coisa toda no construtor. Se você quiser saber o que quero dizer com este comentário, tente substituir components/com_content/models/articles.php.
Itoctopus


4

Eu estive nessa por muito tempo e prometi a Don que, uma vez terminado, 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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.