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!
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.
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?
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
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à.
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