web-dev-qa-db-fra.com

Comment remplacer les classes de base?

Il est parfois nécessaire de remplacer les classes principales pour obtenir davantage de fonctionnalités ou pour que certaines fonctions fonctionnent d'une autre manière. Existe-t-il un moyen de remplacer les classes principales? Si c'est possible, à quels problèmes puis-je faire face en les surmontant?

20
Dmitry Rekun

Oui c'est possible.

Vous pouvez utiliser un plugin système pour écraser les classes, lisez ceci lien et this et this

Deux problèmes que vous allez rencontrer:

  1. vous devez remplacer toute la classe (pas seulement certaines parties)

  2. si le noyau est mis à jour et que la classe est également mise à jour/modifiée, vous devez mettre à jour votre remplacement (si nécessaire).

16
jackJoe

J'ai créé un plugin il y a quelque temps qui vous permet de remplacer les classes de base, mais il reste victime des problèmes mentionnés par @jackJoe dans sa réponse. Cependant, cela vous permet de faire les substitutions proprement.

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

10
Don Gilbert
5
cha

Cela faisait très longtemps que je travaillais sur celui-ci et j'ai promis à Don qu'une fois que j'aurais terminé, il donnerait plus de détails à ce sujet.

J'avais besoin de remplacer Joomla MVC pour les composants et d'indiquer à Joomla de rechercher également les remplacements dans mon dossier HTML de plug-in, et pas seulement à l'intérieur du dossier modèle html.

Ce que je n’ai jamais aimé, c’est quand les développeurs prennent Joomla par défaut et classent la classe par défaut. Je préfère donc étendre cette classe si je le peux, au lieu de freiner quelque chose.

Mon processus suit.

  1. Obtenez la classe que j'ai besoin de remplacer
  2. Lisez-le, remplacez le nom de la classe, créez un nouveau fichier dans mon dossier de classe temporaire
  3. Charger ma version de la classe
  4. Charger la classe Joomla
  5. Enregistrer ma méthode d'extension qui étend la fonction loadTemplate pour rechercher un remplacement dans mon plugin, que joomla template et le dernier composant joomla

voici l'image plutôt http://prntscr.com/3d9syq

La première partie de l'extrait ci-dessous vérifie où se trouve l'utilisateur. S'il est sur le point de mettre à jour Joomla, je supprime les fichiers de classe temporaire créés pour garantir que nous en aurons de nouveaux à la fin de la mise à jour, ce qui prend en charge le numéro 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