it-swarm-eu.dev

Come sovrascrivere correttamente i file di layout

In Joomla 3.x possiamo usare la classe JLayout per sovrascrivere i file che si trovano nella cartella ROOT/layouts

Secondo questo documento http://docs.joomla.org/J3.x:JLayout_Improvements_for_Joomla !

tutto ciò che dobbiamo fare è aggiungere qualcosa di simile;

        $layout = new JLayoutFile('joomla.edit.frontediting_modules'); 
        $layout->addIncludePaths(YJSGPATH .'includes/html/layouts');

        print_r($layout);

Questo frammento viene aggiunto nel mio plugin di sistema nella funzione onAfterRoute.

Ora l'array sembra a posto e punta nella giusta direzione

JLayoutFile Object
(
    [layoutId:protected] => joomla.edit.frontediting_modules
    [basePath:protected] => 
    [fullPath:protected] => 
    [includePaths:protected] => Array
        (
            [0] => D:\wamp\www\Development\Yjsgv2-DEV\3x\plugins\system\yjsg\includes/html/layouts
            [1] => D:\wamp\www\Development\Yjsgv2-DEV\3x/templates/creatus/html/layouts
            [2] => D:\wamp\www\Development\Yjsgv2-DEV\3x/layouts
        )

    [options:protected] => Joomla\Registry\Registry Object
        (
            [data:protected] => stdClass Object
                (
                    [component] => 
                    [client] => 0
                )

        )

    [debugMessages:protected] => Array
        (
        )

)

e il file frontediting_modules.php si trova nella mia cartella http://prntscr.com/4lijlf

ma l'override non sta avvenendo.

Ho rimosso la chiamata per bootstrap popover e tooltips http://prntscr.com/4lijz solo per testarlo ma non funziona

se sposto la cartella override nella cartella html del mio modello, l'override funziona.

Qualcuno può avvisare per favore.

Grazie!

3
Dan

La chiamata addIncludePaths ha effetto solo su quella particolare istanza della variabile $layout. A meno che non si stia anche eseguendo il rendering del layout nel plug-in, il codice non avrà alcun effetto sul rendering effettivo.

Sembra che tu stia cercando di influenzare questa riga dal renderer del documento:

JLayoutHelper::render('joomla.edit.frontediting_modules', $displayData);

Questo utilizza il metodo di rendering di JLayoutHelper che crea un'istanza di una nuova istanza di JLayoutFile:

public static function render($layoutFile, $displayData = null, $basePath = '', $options = null)
{
    $basePath = empty($basePath) ? self::$defaultBasePath : $basePath;

    // Make sure we send null to JLayoutFile if no path set
    $basePath = empty($basePath) ? null : $basePath;
    $layout = new JLayoutFile($layoutFile, $basePath, $options);
    $renderedLayout = $layout->render($displayData);

    return $renderedLayout;
}

Per fare ciò che stai cercando di fare, dovresti mettere la tua linea ($layout->addIncludePaths(YJSGPATH .'includes/html/layouts');) tra l'impostazione $layout E la chiamata di rendering all'interno di questo metodo.

Dal momento che ciò comporterebbe la modifica del codice principale, probabilmente vorrai evitarlo. Tuttavia, non sembra esserci un modo per fare ciò che stai cercando di fare nel CMS (ancora!).

Questo è un pezzo molto nuovo del CMS, quindi probabilmente sarà un'opzione in futuro, ma non è ancora arrivato.

5
David Fritsch

OK, ho trovato una soluzione dal momento che stiamo già estendendo alcune classi sono riuscito a estendere la classe JLayoutFile e aggiungere il mio percorso tra layout e template/html/layout

tramite questo metodo Come sovrascrivere le classi principali?

http://prntscr.com/4ln5dt

quindi l'array ora legge

JLayoutFile Object
(
    [layoutId:protected] => joomla.edit.frontediting_modules
    [basePath:protected] => 
    [fullPath:protected] => 
    [includePaths:protected] => Array
        (
            [0] => D:\wamp\www\Development\Yjsgv2-DEV\3x/templates/creatus/html/layouts
            [1] => D:\wamp\www\Development\Yjsgv2-DEV\3x\plugins\system\yjsg\includes/html/layouts
            [2] => D:\wamp\www\Development\Yjsgv2-DEV\3x/layouts
        )

    [options:protected] => Joomla\Registry\Registry Object
        (
            [data:protected] => stdClass Object
                (
                    [component] => 
                    [client] => 0
                )

        )

    [debugMessages:protected] => Array
        (
        )

)

E assegni

  • layout
  • my_plugin/layout
  • template/html/layout

sarebbe bello se possiamo semplicemente fare

jimport('cms.layout.file');
JLayoutFile::addIncludePath(YJSGPATH .'includes/html/layouts');

in futuro poiché il metodo addIncludePath esiste già.

2
Dan

Mi sono appena imbattuto in questo; la risposta migliore non è corretta e non è necessaria la soluzione alternativa. Dato che sono stati pubblicati molto tempo fa, le informazioni probabilmente non erano ben note al momento.

Lo scopo principale di JLayout è l'overridable, quindi è stato il caso dal primo giorno (in Joomla 3.0.0).

Tutto quello che devi fare per eseguire l'override, ad esempio joomla.edit.frontediting_modules consiste nel trasferire il file di layout originale nella cartella di override del modello. In questo esempio, dovresti copiare:

/layouts/joomla/edit/frontediting_modules.php

a

/templates/{your_templates}/html/layouts/joomla/edit/frontediting_modules.php

e apporta le modifiche come al solito per altri tipi di sostituzioni.

Ecco il corrispondente pagina di documentazione di Joomla (Guarda il paragrafo "Sostituzione dei template".

Rgds

1
Weeblr