it-swarm-eu.dev

Sostituzione layout componenti core con plug-in

All'interno di un plugin ho bisogno di aggiungere e popolare (i dati sono disponibili all'interno del mio plugin) una colonna per com_menus & view = menu vista in amministrazione.

enter image description here

my_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 {}
...

Ora sto ricevendo l'errore "JForm :: getInstance Impossibile caricare il file" . Pensa che ciò sia dovuto perché non è in grado di caricare il filter_menusextra.xml, l'originale (core) filter_menus.xml che si trova \administrator\Components\com_menus\modelli\forme. È perché utilizza gli strumenti di ricerca JLayout e deve caricare il file XML?

Effettuato il seguente test: renamed filter_menus.xml to filter_menusextra.xml in \amministratore\componenti\com_menus\modelli\forme = e ha funzionato. Ma mentre lo sto sovrascrivendo, dovrei essere in grado di farlo nel mio plugin, non in quello principale ?! Che cosa sto facendo di sbagliato?

Qualcuno potrebbe aiutarmi per favore su questo? Grazie.

4
n.h.

Risposta breve

Non puoi. Puoi solo provare a elaborare l'output del sistema (tramite il buffer di output dell'applicazione o Java Script) o modificando i file di sistema.

Risposta lunga

Il componente menu dovrebbe supportare eventi plug-in personalizzati, ma non è così. Modificare i file di sistema è una pessima idea e ti consiglio di evitarlo. Puoi provare a creare un plug-in di sistema che modificherà il buffer di output dell'applicazione ma sarebbe vulnerabile per le modifiche al codice. Più a prova di proiettile sarebbe farlo con JavaScript/jQuery. In questo modo piccole modifiche al codice non influiranno sulla funzionalità del plug-in. Ovviamente ha i suoi lati negativi. Non puoi rendere ordinabile questa colonna e non puoi cercarne il contenuto.

1
Artur Stępień

Per caricare un modulo filtro diverso, sovrascrivere $filterFormName proprietà nel modello:

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

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