web-dev-qa-db-fra.com

Comment le module personnalisé chrome fonctionne-t-il?

J'ai quelques problèmes avec mon module chrome.

Si je renomme le PHP modules.php Dans template/protostar/html] En XXXmodules.php (ou toute autre chose, simplement pour rompre le lien), toutes les pages de mon site Web Mais si je laisse modules.php tel quel, alors certaines pages * ne sont pas accessibles et je reçois une page This webpage is not available. Sur la page qui fonctionne, ma coutume chrome megarounded fonctionne comme il se doit.

Le bogue apparaît également si je supprime le contenu du modules.php Ou si je ne laisse que:

defined('_JEXEC') or die('Restricted access');

Parce que je voudrais avoir toutes les pages de mon site Web accessibles + le module personnalisé, je suis en train de creuser dans la façon dont custom chrome fonctionne, mais à l'exception de la question de la création d'un nouveau custom chrome (que je connais déjà), je ne trouve aucune aide.

J'essaie de comprendre comment protostar/index.php Obtient le lien vers modules.php Et j'ai donc essayé de rechercher modules.php Dans tous les fichiers du dossier template/protostar Sans pouvoir pas de lien. Je me demande comment ce module.php est récupéré! Une idée?

Merci beaucoup pour votre aide!

  • Étrangement, les pages qui ne fonctionnent pas sont celles qui ne contiennent pas de module HTML chargé via loadposition ou un module n'importe où depuis NoNumber. En bref, une page doit, dans l’article principal, charger un module pour fonctionner.

EDIT: voici le contenu de mon modules.php (mais je doute que l'erreur vienne de là car quand je vide le contenu, j'ai toujours l'erreur, seulement renommer modules.php résoudre l'erreur)

<?php
// no direct access
defined('_JEXEC') or die('Restricted access');

?>
<?php
function modChrome_megarounded($module, &$params, &$attribs)
{ ?>
        <div class="megamod module<?php echo $params->get('moduleclass_sfx'); ?>">
            <div class="megabox">
                <div class="megaboxouter">
                    <div class="megaboxinner">
                        <?php if ($module->showtitle != 0) : ?>
                            <h6><?php echo $module->title; ?></h6>
                        <?php endif; ?>
                    <?php echo $module->content; ?>
                    </div>
                </div>
            </div>
        </div>
    <?php
}
?>
5
MagTun

Ainsi, modules.php Est le moyen utilisé par les modèles pour définir (remplacer?) chrome styles si vous le souhaitez. Vous avez probablement déjà entendu parler de ces éléments dans l'article Comprendre les substitutions sur Joomla Doc)

Sans code, j'imagine que vous rencontrez probablement un bogue dans votre PHP. Le seul moyen de vérifier cela consiste à activer le mode de débogage de Joomla et à définir le rapport d'erreurs sur "Développeur". La raison pour laquelle certaines pages ne se cassent pas, c'est probablement parce que ces pages ont des modules qui utilisent des styles spécifiques chrome définis dans votre template/protostar/html/modules.php.

Si vous ajoutez votre code modules.php À la question, nous pouvons probablement vous aider. Étant donné que vous dites que votre chrome fonctionne mais que d'autres pages se cassent, il peut s'agir d'un simple problème qui rompt l'interprète PHP alors qu'il traite d'autres styles.

Lorsque vous désactivez ce fichier (en renommant etc), le bogue est évité et le système par défaut chrome prend probablement le relais.

En stock, une installation Joomla 3.x prête à l'emploi, vous trouverez des fichiers modules.php Dans 6 emplacements. Ceux-ci sont répartis entre le/administrateur et le front-end:

  1. /administrator/templates/system/html/modules.php
  2. /administrator/templates/isis/html/modules.php
  3. /administrator/templates/hathor/html/modules.php
  4. /templates/system/html/modules.php
  5. /templates/beez3/html/modules.php
  6. /templates/protostar/html/modules.php

Si vous regardez # 1 et # 4 , vous verrez qu'ils sont dans templates/system/html et contiennent le chrome par défaut. Pour le front-end, il s'agit de html5, table, horz, xhtml, rounded et outline.

Quand Joomla! tente de rendre une page et traite une position de module dans un modèle, il appelle la méthode renderModule($module, $attribs) de la classe JModuleHelper. Par exemple, aimez cette position de module dans Protostar:

<div id="aside" class="span3">
    <!-- Begin Right Sidebar -->
    <jdoc:include type="modules" name="position-7" style="well" />
    <!-- End Right Sidebar -->
</div>

Cette méthode utilise l'attribut style du jeton jdoc et l'utilise pour construire le nom de la méthode/fonction modChrome_???? Responsable du style spécifié. En utilisant ce morceau de code:

$chromeMethod = 'modChrome_' . $style;

// Apply chrome and render module
if (function_exists($chromeMethod))
{
    $module->style = $attribs['style'];

    ob_start();
    $chromeMethod($module, $params, $attribs);
    $module->content = ob_get_contents();
    ob_end_clean();
}

Comme vous pouvez voir si la fonction existe dans le fichier modules.php Du modèle actuel, elle appellera cette méthode et capturera sa sortie avant de la renvoyer au processus de rendu principal.

5
Craig