Come sovrascrivere le classi principali?


20

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?


1
Sarebbe bello se potessi affinare la tua domanda per renderla un po 'più specifica o per descrivere un problema chiaro.
Valentin Despa,

Per gli utenti di Joomla 3: controlla questi. Ti aiuterà. joomla.stackexchange.com/questions/5449/… Plugin - github.com/ghazal/plg_mvcoverride Grazie joomla.stackexchange.com/users/270/ghazal
cha

Risposte:


16

Sì, è possibile.

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

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


4
Sarebbe utile se potessi incollare i passaggi pertinenti dai collegamenti forniti, o almeno fornire una descrizione dei collegamenti, nel caso in cui si spostino o cambino.
codinghands

10

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


7
Voglio solo dire che questa soluzione funziona magnificamente e che Don è un vero spirito affine all'Open Source: un cappello a lui e al suo lavoro !!!
PIL,

C'è un problema sostanziale con il tuo semplice script, è che non precarica i componenti. Quindi, se si sostituiscono i componenti, in realtà non funziona per la maggior parte di essi (ad esempio il componente com_content). Funziona bene, ma deve precaricare il componente in modo da poterlo sovrascrivere (non è possibile ignorare qualcosa che non è stato ancora dichiarato). Oh, e devi usare onAfterRoute invece di fare tutto nel costruttore. Se vuoi sapere cosa intendo con questo commento, prova a sovrascrivere components/com_content/models/articles.php.
itoctopus,


4

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 plugin, 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.