web-dev-qa-db-fra.com

Détecter le style de modèle actuel

Je construis un site Web avec un modèle mais plusieurs styles. J'ai besoin que chaque style ait son propre logo et un lien personnalisé pour le logo. Le modèle est basé sur le cadre de Gantry.

Est-il possible de détecter le style de modèle actuel (nom ou ID) et d'utiliser un if-else déclaration dans le fichier index.php? C'est à peu près ce que j'essaie de faire:

<?php
  if (styleid = "1") {
    $link = "/";
    $logo = "logo1.jpg";
  } elseif (styleid = "2" {
    $link = "/otherlink";
    $logo = "logo2.jpg";
  }
  echo '<a href="'.$link.'"><img src="/images/'.$logo.'"></a>';
?>
2
johanpw

Avec Gantry, vous pouvez avoir différents logos pour chaque style. Mais cela ne vous laissera pas avoir des liens différents.

Bien qu'il puisse y avoir différentes approches pour atteindre ce que je suppose que vous avez en tête, pour répondre directement à votre question sur la manière d'attribuer le style de modèle à un élément de menu, vous pouvez utiliser quelque chose comme ceci:

Obtenir le style du template:

$styleId = JMenu::getInstance('site')->getActive()->template_style_id;

Cela renverra l'ID du style attribué dans le menu actif. Notez que le style par défaut retournera 0.

J'ai testé cela sur un gabarit de portique et cela semble fonctionner.


Une seconde approche

En utilisant Gantry Framework pour créer des modèles personnalisés, vous pouvez ajouter un paramètre supplémentaire (champ d'élément personnalisé pour étendre la fonctionnalité du logo) dans l'administration des modèles, pour le lien personnalisé du logo.

Il suffit donc d'ajouter un champ supplémentaire dans le fichier template_options.xml et d'obtenir cette valeur dans l'index de votre modèle et de le traduire en lien. Vous pouvez utiliser un champ d’éléments de menu ou un champ de base de données interrogeant les liens d’éléments de menu. Il sera ainsi plus facile pour l’utilisateur de sélectionner un lien de site interne vers un autre élément de menu.

Votre commentaire sur le problème:

J'ai testé votre deuxième approche et créé un champ personnalisé dans templateOptions.xml comme ceci: Mais lorsque j'essaie d'utiliser la valeur dans features/logo.php, elle est vide: $ customlink = $ gantry-> get ('customlogo') ; ($ customlink ne contient aucune donnée). Des idées?

Répondre:

templateOptions.xml contient le code suivant pour le logo:

<fields name="logo" type="selectedset" label="LOGO" description="LOGO_DESC">
    <field name="enabled" type="toggle" default="1" label="SHOW" />
    <field name="position" type="position" translation="false" default="header-a" label="POSITION" />
    <field name="type" type="selectbox" selector="true" default="gantry" label="TYPE" isbodyclass="true" setbyurl="true" setinsession="true" setbysession="true" setincookie="true" setbycookie="true"/>
    <fields type="set" name="gantry" label="Gantry Template">
    </fields>
    <fields type="set" name="custom" label="CUSTOM">
        <field name="image" type="imagepicker" default="" label="LOGO_PICKER" description="LOGO_PICKER_DESC" setinsession="true" setbysession="true" setincookie="true" setbycookie="true" />
    </fields>
</fields>

Vous avez probablement ajouté votre champ personnalisé à l'intérieur du plus profond <fields - groups>?

J'ai remarqué que si vous ajoutez un champ personnalisé de cette façon, il n'est pas accessible dans le fichier feature.php avec le $this->get('fieldname').

Donc, vous devriez ajouter le champ personnalisé comme ci-dessous:

<fields name="logo" type="selectedset" label="LOGO" description="LOGO_DESC">
    <field name="enabled" type="toggle" default="1" label="SHOW" />
    <field name="position" type="position" translation="false" default="header-a" label="POSITION" />
    <field name="type" type="selectbox" selector="true" default="gantry" label="TYPE" isbodyclass="true" setbyurl="true" setinsession="true" setbysession="true" setincookie="true" setbycookie="true"/>
    <fields type="set" name="gantry" label="Gantry Template">
    </fields>
    <fields type="set" name="custom" label="CUSTOM">
        <field name="image" type="imagepicker" default="" label="LOGO_PICKER" description="LOGO_PICKER_DESC" setinsession="true" setbysession="true" setincookie="true" setbycookie="true" />
    </fields>
    <field name="mylogolink" type="text" default="" label="logo link" description="logo link" />
</fields>

Ensuite, vous pourrez probablement y accéder via $this->get('mylogolink');

1
FFrewin

Ceci est juste une idée et je sais que cela ne répond pas directement à votre problème de codage, mais si vous utilisiez NoNumbers Advanced Module Manager pour créer un module séparé pour chaque modèle.

Vous pouvez ensuite affecter ce module spécifique à son modèle correspondant? Via la zone des paramètres d’administration AMM.

Cela signifie cependant que vous devrez créer un module différent (URL, etc.) pour chaque modèle, mais cela ne devrait pas être trop fastidieux, vous pourriez simplement dupliquer chaque module.

2
jonboy

Si quelqu'un est intéressé, voici comment tout mettre en place:

Dans le fichier templateOptions.xml J'ai ajouté ce code (comme suggéré par FFrewin):

<field name="mylogolink" type="text" default="" label="logo link" description="logo link" />

Puis dans /features/logo.php, remplacez ceci:

<div class="rt-logo-block">
    <a href="<?php echo $gantry->baseUrl; ?>" id="rt-logo"></a>
</div>

Avec ça:

<div class="rt-logo-block">
   <a href="<?php echo ($customlink != "" ? $this->get('mylogolink') : $gantry->baseUrl;) ?>" id="rt-logo"></a>
</div>

Il vérifie simplement si $ customlink est vide ou non. S'il est vide, le lien d'accueil par défaut est utilisé, sinon, le lien donné est utilisé.

1
johanpw