Comment remplacer les classes de base?

20

Parfois, il est nécessaire de remplacer les classes de base pour obtenir plus de fonctionnalités ou pour faire fonctionner certaines fonctions de base d'une autre manière. Existe-t-il un moyen de remplacer les classes principales? S'il est possible, à quels problèmes puis-je faire face en les annulant?

Dmitry Rekun
la source
1
Ce serait bien si vous pouviez affiner votre question pour la rendre un peu plus précise ou pour décrire un problème clair.
Valentin Despa du
Pour les utilisateurs de Joomla 3 - vérifiez-les. Cela vous aidera. joomla.stackexchange.com/questions/5449/... Plugin - github.com/ghazal/plg_mvcoverride Merci joomla.stackexchange.com/users/270/ghazal
cha

Réponses:

16

Oui c'est possible.

Vous pouvez utiliser un plugin système pour remplacer les classes, veuillez lire ce lien et ceci et cela

Deux problèmes auxquels vous serez confrontés:

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

jackJoe
la source
4
Il serait utile que vous puissiez coller les étapes pertinentes à partir des liens fournis, ou au moins donner une description des liens, au cas où ils se déplaceraient ou changeraient.
codinghands
10

J'ai créé un plugin il y a quelque temps qui vous permet de remplacer les classes de base, mais il est toujours en proie aux problèmes que @jackJoe a signalés dans sa réponse. Cependant, il vous permet d'effectuer proprement les remplacements.

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

Don Gilbert
la source
7
Je veux juste dire que cette solution fonctionne à merveille et que Don est un véritable esprit apparenté de l'Open Source - chapeau à lui et à son travail !!!
PIB
Il y a un problème substantiel avec votre script simple, c'est qu'il ne précharge pas les composants. Donc, si vous surchargez des composants, cela ne fonctionne vraiment pas pour la plupart d'entre eux (par exemple le composant com_content). Cela fonctionne bien, mais il doit précharger le composant afin qu'il puisse les remplacer (vous ne pouvez pas remplacer quelque chose qui n'a pas encore été déclaré). Oh, et vous devez utiliser onAfterRoute au lieu de faire tout cela dans le constructeur. Si vous voulez savoir ce que je veux dire par ce commentaire, essayez de passer outre components/com_content/models/articles.php.
Itoctopus
4

J'étais sur celui-ci depuis très longtemps et j'ai promis à Don qu'une fois que j'aurais fini, je donnerais plus de détails à ce sujet.

Je devais remplacer Joomla MVC pour les composants et dire à Joomla de rechercher également les remplacements dans mon dossier html de plugin, pas seulement dans le dossier html du modèle.

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

Mon processus suit.

  1. Obtenez la classe dont j'ai besoin
  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 extend qui étend la fonction loadTemplate pour rechercher la substitution dans mon plugin, que le modèle joomla et le dernier composant joomla

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

Les premières parties de l'extrait ci-dessous vérifient où se trouve l'utilisateur, s'il est sur le point de mettre à jour Joomla, je supprime les fichiers de classe temporaire qui ont été créés pour s'assurer que nous en obtenons de nouveaux lorsque la mise à jour est terminée, 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);
Dan
la source