web-dev-qa-db-fra.com

Comment remplacer correctement les fichiers de disposition

Dans Joomla 3.x, nous pouvons utiliser la classe JLayout pour remplacer les fichiers situés dans le dossier ROOT/layouts

Selon cette documentation http://docs.joomla.org/J3.x:JLayout_Improvements_for_Joomla !

tout ce que nous avons à faire est d’ajouter quelque chose comme ceci;

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

        print_r($layout);

Cet extrait de code est ajouté à la fonction onAfterRoute de mon plug-in système.

Maintenant, le tableau a l'air bien et pointe dans la bonne direction

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

)

et le fichier frontediting_modules.php se trouve dans mon dossier http://prntscr.com/4lijlf

mais la dérogation ne se produit pas.

J'ai retiré l'appel pour bootstrap popover et les info-bulles http://prntscr.com/4lijz juste pour le tester, mais cela ne fonctionne pas.

si je déplace le dossier de substitution dans mon dossier HTML de modèle, la substitution fonctionne.

Quelqu'un peut-il s'il vous plaît conseiller.

Merci!

3
Dan

L'appel addIncludePaths n'affecte que cette instance particulière de la variable $layout. À moins que vous ne rendiez également la mise en page dans le plug-in, votre code n'aura aucun effet sur le rendu réel.

On dirait que vous essayez d'affecter cette ligne à partir du moteur de rendu de document:

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

Ceci utilise la méthode de rendu de JLayoutHelper qui instancie une nouvelle instance de 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;
}

Pour faire ce que vous essayez de faire, vous devez insérer votre ligne ($layout->addIncludePaths(YJSGPATH .'includes/html/layouts');) entre le paramètre $layout Et l'appel de rendu dans cette méthode.

Comme cela impliquerait l'édition du code principal, vous voudrez probablement l'éviter. Cependant, il ne semble pas y avoir de moyen de faire ce que vous essayez de faire dans le CMS (pour le moment!).

Il s’agit d’un élément très nouveau du système de gestion de contenu, ce qui constituera donc une option dans l’avenir, mais il n’en existe pas encore.

5
David Fritsch

OK, nous avons trouvé une solution de contournement, car nous étendons déjà quelques classes. J'ai réussi à étendre la classe JLayoutFile et à ajouter mon chemin entre layout et template/html/layout.

via cette méthode Comment redéfinir les classes principales?

http://prntscr.com/4ln5dt

donc le tableau lit maintenant

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

)

Et vérifie

  • mises en page
  • mon_plugin/layouts
  • template/html/layouts

ce serait génial si nous pouvons juste faire

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

à l'avenir puisque la méthode addIncludePath existe déjà.

2
Dan

Je suis tombé sur cela; la réponse principale n’est pas correcte et la solution de contournement proposée n’est pas nécessaire. Comme ils ont été postés il y a longtemps, les informations n'étaient probablement pas bien connues à l'époque.

L'objectif principal de JLayout étant d'être annulable, c'était le cas dès le premier jour (dans Joomla 3.0.0).

Tout ce que vous avez à faire pour annuler, dites joomla.edit.frontediting_modules consiste à coller le fichier de mise en page d'origine dans votre dossier de remplacement de modèle. Dans cet exemple, vous copiez:

/layouts/joomla/edit/frontediting_modules.php

à

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

et apportez vos modifications comme d’habitude pour d’autres types de substitutions.

Voici le page de documentation Joomla correspondante (Consultez le paragraphe "Remplacements de modèle".

Rgds

1
Weeblr