web-dev-qa-db-fra.com

Le contenu de l'en-tête personnalisé dépend de l'article

Je me demande s'il est possible d'avoir différents en-têtes en fonction des différents articles? Par exemple, l'ID d'article 1 montre l'en-tête A et l'ID d'article 2, l'en-tête B. Actuellement, j'ai modifié le fichier php d'en-tête de modèle dans tpl/blocks/header.php, dont l'en-tête est codé en dur avec html. Existe-t-il un moyen d'utiliser php pour réaliser l'en-tête personnalisé?

Mon header.php actuel:

<?php defined('_JEXEC') or die; <header class="header js-header">SOMETHING</header> <?php endif; ?>

1
Z Pat

Il y a de nombreuses façons de personnaliser quelque chose en fonction de quelque chose, je ne peux donc que répondre en suggérant des façons de faire certaines choses.

Tout d’abord, généralement dans Joomla, on essaie de coder le moins possible dans le modèle et on utilise plutôt des substitutions de composants et des modules afin que la sortie puisse être gérée dans l’interface admin. Cela étant dit, de nombreux modèles sont codés en dur, il est donc parfois logique de dire "J'ai essayé d'être une bonne personne, mais regardez où cela me mène, je veux simplement que cela soit collé dans le modèle comme personne ne s'en soucie."

Utiliser l'ID d'article dans une condition du modèle

<?php
defined('_JEXEC') or die;

$jinput = JFactory::getApplication()->input;
$component = $jinput->get('option','','cmd');
$id = $jinput->get('id',0,'int');
?>
<header class="header js-header">
<?php
if($component == 'com_content'){

    switch ($id) {
        case '34':
            echo '<p>Some Content For Article Id 34</p>';
            break;
        case '48':
            echo '<p>Some Content For Article Id 48</p>';
            break;
        default:
            echo '<p>Some Default Content For other articles and category lists etc</p>';
            break;
    }

} else {
    echo '<p>Some Default Header Content For Pages that are not views of com_content</p>';

}
?>
</header>

Utiliser une position de module

Vous pouvez plutôt utiliser une position de module, puis insérer vos propres modules personnalisés dans la position et les affecter aux éléments de menu, le cas échéant.

<?php
defined('_JEXEC') or die; ?>

<jdoc:include type="modules" name="customheader" />

Utiliser un champ personnalisé dans l'article et en extraire le contenu

Peut-être plus ergonomique, mais plus complexe à configurer, serait d’ajouter un champ personnalisé aux articles et d’extraire ensuite ce contenu, comme ce qui suit.

<?php
defined('_JEXEC') or die; 

$jinput = JFactory::getApplication()->input;
$component = $jinput->get('option','','cmd');
$view = $jinput->get('view','','cmd');

$header = 'some default content';

if($component == 'com_content' && $view == 'article'){

    JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
    JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');

    $id = $jinput->get('id');

    $model =& JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request'=>true));
    $appParams = JFactory::getApplication()->getParams();
    $model->setState('params', $appParams);
    $item =& $model->getItem($id);
    $jcFields = FieldsHelper::getFields('com_content.article',  $item, True);

    $name_of_your_custom_field = 'mycustomheader';

    foreach($jcFields as $jcField){
        if($jcField->name == $name_of_your_custom_field){
            $header = $jcField->value;
            break;
        }
    }

}

?>
<header><?php echo $header; ?></header>
1
jamesgarrett