web-dev-qa-db-fra.com

Remplacement de la disposition des composants principaux avec plug-in

Dans un plugin, j'ai besoin d'ajouter et de peupler (les données sont disponibles dans mon plugin) une colonne pour com_menus & view = menus dans l'administration.

enter image description here

mon_plugin.php

...
public function onAfterInitialise()
{
    $input = JFactory::getApplication()->input;
    if (JFactory::getApplication()->isAdmin()
        && $input->getCmd('option') == 'com_menus'
        && $input->getCmd('view') == 'menus')
    {
        JRequest::setVar('view', 'menusextra');
        JLoader::register('MenusViewMenusextra', __DIR__ . '/views/menus/view.html.php');
    }
}
...

view.html.php

...
JLoader::register('MenusViewMenus', JPATH_ADMINISTRATOR . '/components/com_menus/views/menus/view.html.php');
JLoader::register('MenusModelMenus', JPATH_ADMINISTRATOR . '/components/com_menus/models/menus.php');

class MenusViewMenusextra extends MenusViewMenus
{
    public function display($tpl = null)
    {
        $this->items         = $this->get('Items');
        $this->pagination    = $this->get('Pagination');
        $this->state         = $this->get('State');
        $this->filterForm    = $this->get('FilterForm');
        $this->activeFilters = $this->get('ActiveFilters');
        $this->canDo         = JHelperContent::getActions('com_menus');
        $this->db            = JFactory::getDbo();

        $this->addTemplatePath(__DIR__ . '/tmpl/');
        parent::display($tpl);
    }
}

class MenusModelMenusextra extends MenusModelMenus {}
...

Maintenant, je reçois le message d'erreur "JForm :: getInstance n'a pas pu charger le fichier" . Je pense que cela est dû au fait qu’il est impossible de charger le filter_menusextra.xml, l’original (noyau) filter_menus.xml qui se trouve \administrateur\composants\com_menus\modèles\formulaires. Est-ce parce qu'il utilise les outils de recherche de JLayout et doit charger le fichier xml?

Faites le test suivant: renommé filter_menus.xml en filter_menusextra.xml in \administrateur\composants\com_menus\modèles\formulaires = et cela a fonctionné. Mais comme je l’annule, je devrais pouvoir le faire dans mon plugin, pas dans celui-ci?! Qu'est-ce que je fais mal?

Quelqu'un pourrait-il m'aider s'il vous plait? Merci.

4
n.h.

Réponse courte

Tu ne peux pas. Vous pouvez uniquement essayer de traiter la sortie système (via le tampon de sortie de l'application ou Java)) ou de modifier les fichiers système.

Longue réponse

Le composant de menu devrait prendre en charge les événements de plug-in personnalisés, mais ce n'est pas le cas. La modification des fichiers système est une très mauvaise idée et je vous conseille de l’éviter. Vous pouvez essayer de créer un plug-in système qui modifiera le tampon de sortie de l'application, mais il serait vulnérable en cas de modification du code. Plus efficace serait de le faire avec JavaScript/jQuery. De cette façon, de petites modifications de code n'affecteront pas les fonctionnalités de votre plugin. Bien sûr, il a ses inconvénients. Vous ne pouvez pas rendre cette colonne triable et vous ne pouvez pas rechercher son contenu.

1
Artur Stępień

Pour charger un formulaire de filtre différent, remplacez $filterFormName propriété dans le modèle:

class MenusModelMenusextra extends MenusModelMenus
{
    public function __construct($config = array())
    {
        $this->filterFormName = 'filter_menus';

        parent::__construct($config);
    }
}
1
Sharky