it-swarm-eu.dev

Come sovrascrivere le classi principali?

A volte è necessario sostituire le classi principali per ottenere più funzionalità o per far funzionare alcune funzioni principali in un altro modo. Esiste un modo per ignorare le classi principali? Se è possibile, quali problemi posso affrontare ignorandoli?

20
Dmitry Rekun

Sì, è possibile.

Puoi usare un plugin di sistema per sovrascrivere le classi, leggi questo link e this and this

Due problemi che dovrai affrontare:

  1. devi scavalcare l'intera classe (non solo parti di essa)

  2. se il core viene aggiornato e anche la classe viene aggiornata/modificata, è necessario aggiornare la sostituzione (se necessario).

16
jackJoe

Qualche tempo fa ho creato un plug-in che ti consente di ignorare le classi principali, ma cade comunque in preda ai problemi che @jackJoe ha sottolineato nella sua risposta. Tuttavia, ti consente di eseguire le sostituzioni in modo pulito.

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

10
Don Gilbert
5
cha

Sono stato su questo per molto tempo e ho promesso a Don che una volta terminato fornirò maggiori dettagli al riguardo.

Avevo bisogno di sostituire Joomla MVC per i componenti e dire a Joomla di cercare anche le sostituzioni nella mia cartella html del plug-in, non solo nella cartella html del modello.

Quello che non mi è mai piaciuto è quando gli sviluppatori prendono effettivamente la classe di default di Joomla e se la confondono, quindi preferisco estendere quella classe se posso, invece di frenare qualcosa.

Il mio processo segue.

  1. Ottieni la classe di cui ho bisogno per ignorare
  2. Leggilo, sostituisci il nome della classe, crea un nuovo file nella mia cartella della classe temporanea
  3. Carica la mia versione della classe
  4. Carica la classe Joomla
  5. Registra il mio metodo di estensione che estende la funzione loadTemplate per cercare l'override nel mio plug-in, rispetto al modello joomla e all'ultimo componente joomla

ecco l'immagine piuttosto http://prntscr.com/3d9syq

Le prime parti nello snippet di seguito stanno controllando dove si trova l'utente, se sta per aggiornare Joomla, sto eliminando i file della classe temporanea che sono stati creati per assicurarmi di averne di nuovi quando l'aggiornamento è completo e che si occupa del numero di 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