Article 404 personnalisé

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Eddy.vh
    a répondu
    Bonjour.

    Je viens de buter sur une page perso pour un site multilingue.
    En effet, pour avoir une URL propre et réécrite, si on indique l'URL comme précédemment, on se retrouve sur une page qui ne correspond pas forcément à la langue du visiteur.
    J'ai donc fouiné un peu et ai trouvé une solution fonctionnelle en obtenant une URL réécrite dirigée vers la langue utilisateur.

    Prenons en exemple un site français / anglais.
    1. Créons 2 modules de contenus personnalisés contenant chacun ce que l'on souhaite afficher au visiteur, l'un en anglais, l'autre en français.
    2. Affectons ces deux modules à leur langue respective.
    3. Créons la page d'erreur personnalisée et n'y insérons que les deux modules préalablement créés comme suit {loadmodule mod_custom,moduleFR} {loadmodule mod_custom,ModuleEN} (Les noms dépendent de vos créations de modules bien sûr)
    4. Comme langue de la page, sélectionnons "Toutes" afin qu'elle puisse s'afficher dans les deux langues. Le fait d'avoir paramétré le module FR pour la langue française ne lui permettra de s'afficher que sur la partir française du site et vice et versa pour le module anglais.
    5. Créons maintenant un lien masqué vers la page d'erreur et relevons son alias.
    6. Rendons-nous sur la page d'erreur du template et faisons-en une copie sous un autre nom au cas où…
    7. Dans la page error.php, entrons ce qui suit :
    Code PHP:
    <?php
    /**
     * @package     Joomla.Site
     * @subpackage  Template.system
     *
     * [USER="64686"]Copyright[/USER]   Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
     * @license     GNU General Public License version 2 or later; see LICENSE.txt
     */

    defined('_JEXEC') or die;

    /** @var JDocumentError $this */

    if (!isset($this->error))
    {
        
    $this->error JError::raiseWarning(404JText::_('JERROR_ALERTNOAUTHOR'));
        
    $this->debug false;
    }

    $app JFactory::getApplication();
    if ((
    $this->error->getCode()) == '404') {
    header('Location: ' .$this->baseURL '404.html'); // dans l'exemple ici, l'alias de l'article est 404, suivi de l'extension html si elle est utilisée dans vos paramètres.
    exit;
    }
    ?>
    Et voilà, on a une page d'erreur personnalisée avec une belle URL réécrite et fonctionnant peu importe la langue du site.

    Testé avec succès sur un site au template créé par TemplateCreator CK et un autre au template HelixUltimate.

    En espérant que ça puisse aider les webmestres gérant des sites multilingues…

    Laisser un commentaire:


  • Eddy.vh
    a répondu
    Mais on peut appeler n'importe quelle URL normalement.

    Laisser un commentaire:


  • GraphiqueDesign
    a répondu
    Envoyé par fredjouan Voir le message
    Salut Eddy,
    Je confirme, l'adresse "https://www.domaine.fr/page-d-erreur-404.html" fonctionne aussi bien que "index.php?com_content..."
    Merci du tuyau !
    Fred
    On peut même appeler une page montée dans SPPB en lieu et place d'un article Joomla !

    Laisser un commentaire:


  • fredjouan
    a répondu
    Salut Eddy,
    Je confirme, l'adresse "https://www.domaine.fr/page-d-erreur-404.html" fonctionne aussi bien que "index.php?com_content..."
    Merci du tuyau !
    Fred

    Laisser un commentaire:


  • Eddy.vh
    a répondu
    GraphiqueDesign

    Le code que j'ai donné ci-dessus fonctionne parfaitement pour moi, je l'ai testé également sur Helix Ultimate et il est opérationnel également.

    J'ai même remplacé l'url par le nom du lien de menu et tout roule…
    Dernière édition par Eddy.vh à 12/10/2018, 12h29

    Laisser un commentaire:


  • chabi01
    a répondu
    Merci

    Laisser un commentaire:


  • fredjouan
    a répondu
    chabi01 : Le fil a été passé sur "Réglé" immédiatement après le problème résolu
    Le petit tuto "Méthode" vient d'être complété pour ne pas indexer et cacher ce lien de menu

    Laisser un commentaire:


  • GraphiqueDesign
    a répondu
    Si quelqu'un (@daneel ?) a réussi a faire cette manipulation sur hélix Ultimate, je suis super intéressé d'en parler avec lui car visiblement, ce n'est pas possible. D'avance, merci.

    Laisser un commentaire:


  • chabi01
    a répondu
    Super
    Passe le sujet en "réglé" si le problème est résolu
    Cordialement,

    Laisser un commentaire:


  • fredjouan
    a répondu
    Bonjour,
    C'est la ligne de code suggérée par Chabi qui fonctionne :
    Code PHP:
      header('Location: ' JRoute::_("index.php?option=com_content&view=article&id=202&itemid=300"false)); 
    Mais en adaptant le script d'Eddy avec la ligne ci-dessus, on obtient le même résultat. C'est la solution que j'ai choisie et le résultat est parfait.
    Je vous remercie infiniment tous les deux pour votre sens du partage.
    Fred

    La méthode :
    - Créer un article "404" avec votre texte personnalisé et une image (optionnelle)
    - Dans cet article, dans l'onglet "Publication", régler "Robots" sur Noindex.
    - Créer un lien de menu "404" pointant sur votre article
    - Dans les paramètres du lien de menu, dans l'onglet "Type de lien", il faut mettre "Afficher dans le menu" sur "non". Votre lien sera "caché".
    - Créer un fichier error.php en indiquant l'ID de votre lien de menu à la place de xxx :
    Code PHP:
     <?php
    /**
     * @package     Joomla.Site
     * @subpackage  Template.system
     *
     * [USER="64686"]Copyright[/USER]   Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
     * @license     GNU General Public License version 2 or later; see LICENSE.txt
     */

    defined('_JEXEC') or die;

    /** @var JDocumentError $this */

    if (!isset($this->error))
    {
        
    $this->error JError::raiseWarning(404JText::_('JERROR_ALERTNOAUTHOR'));
        
    $this->debug false;
    }

    $app JFactory::getApplication();
    if ((
    $this->error->getCode()) == '404') {
    header('Location: ' JRoute::_("index.php?option=com_content&view=article&id=xxx"false));exit; // Remplacer les XX par l'ID de l'article erreur 404…
    exit;
    }
    ?>
    - Placer ce fichier à la racine de votre template.
    Faire un test sur une page ou un fichier obsolète.

    PS : petite astuce trouvée par Eddy, en laissant le lien de menu visible quelques instants, vous pouvez récupérer l'URL de la page pour la remplacer par l'adresse de type "index.php?option=com_content&view=article&id=xxx" . Vous aurez ainsi une adresse de type "https://www.domaine.fr/page-erreur-404.html".
    Merci à lui,
    Fred
    Dernière édition par fredjouan à 13/10/2018, 09h45

    Laisser un commentaire:


  • Eddy.vh
    a répondu
    Salut Fred.

    Est-ce le contenu complet de ton fichier error.php ?
    Car j'utilise cette astuce sur un de mes sites et la page d'erreur fonctionne correctement.

    Voilà ce que dit mon fichier error.php entier afin que tu puisses comparer avec le tien.

    Code PHP:
    <?php
    /**
     * @package     Joomla.Site
     * @subpackage  Template.system
     *
     * [USER="64686"]Copyright[/USER]   Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
     * @license     GNU General Public License version 2 or later; see LICENSE.txt
     */

    defined('_JEXEC') or die;

    /** @var JDocumentError $this */

    if (!isset($this->error))
    {
        
    $this->error JError::raiseWarning(404JText::_('JERROR_ALERTNOAUTHOR'));
        
    $this->debug false;
    }

    $app JFactory::getApplication();
    if ((
    $this->error->getCode()) == '404') {
    header('Location: /index.php?option=com_content&view=article&id=XX'); // Remplacer les XX par l'ID de l'article erreur 404…
    exit;
    }
    ?>

    Laisser un commentaire:


  • chabi01
    a répondu
    Ok, alors fais les manips suivantes.
    Tu as ton id d'article (ici, le 202)
    Tu vas créer un lien de menu vers ton article. Cela va te donner un élément de menu (imaginons l'élément avec l'id 300).
    Ok.

    Dans ton fichier, tu vas alors remplacer :
    Code:
    [COLOR=#000000][COLOR=#0000BB]header[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'Location: /index.php?option=com_content&view=article&id=202'[/COLOR][COLOR=#007700]);[/COLOR][/COLOR]
    par
    Code:
    [COLOR=#000000][COLOR=#0000BB]header[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'Location: /index.php?option=com_content&view=article&id=202&itemid=300'[/COLOR][COLOR=#007700]);[/COLOR][/COLOR]
    (tu remplaces par les id du menu et ton article).

    si cela ne fonctionne pas, tu remplaces alors toute la ligne (en adaptant encore les id) avec une autre écriture possible avec JRoute :
    Code:
    [COLOR=#000000][COLOR=#0000BB]header[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'Location: ' . JRoute::_("index.php?option=com_content&view=article&id=202&itemid=300", false))[/COLOR][COLOR=#007700];[/COLOR][/COLOR]
    Essaye...
    Cordialement,

    Laisser un commentaire:


  • fredjouan
    a répondu
    Merci de votre aide.
    Le code vient d'être modifié en ajoutant les balises PHP en début et en fin du fichier :
    Code PHP:
    <?php
    if (($this->error->getCode()) == '404') {
    header('Location: /index.php?option=com_content&view=article&id=202');
    exit;
    }
    ?>
    Le navigateur affiche maintenant une page d'erreur 404, mais pas la mienne ! C'est la page d'erreur par défaut du navigateur, avec le bandeau rouge.
    Le fichier n'est toujours pas conforme ?
    C'est un peu étonnant que la documentation Joomla fournisse un document incomplet.

    Laisser un commentaire:


  • RobertG
    a répondu
    C'est le texte de la doc que Fred a placé dans son fichier, manifestement, puisque dans la doc, cette ligne n'est pas présente.

    Laisser un commentaire:


  • chabi01
    a répondu
    Envoyé par RobertG Voir le message
    Il manque bien "<?php" en première ligne du fichier. La balise de fin n'est pas indispensable.
    Oui, sauf si c'est juste un copié collé partiel.. d'où la demande du fichier "complet" (ce qui est peut être déjà le cas).
    Et personnellement, je préfère toujours fermer les balises : plus propre mais surtout évite les erreurs quand le gars ajoute un petit bout de code html sans avoir fermé la balise

    Cordialement,

    Laisser un commentaire:

Annonce

Réduire
Aucune annonce pour le moment.

Partenaire de l'association

Réduire

Hébergeur Web PlanetHoster
Travaille ...
X