THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

J'ai besoin de conseils/d'idées pour la réalisation d'une fonction de redirection automatique. Je m'explique :

Actuellement, sur l'un de nos sites, on publie des notices d'utilisation (qu'on ajoute en tant que Documents, via le BO). On envoie aussi à nos clients des documentations techniques en PDF, avec dedans un lien générique vers nos notices.

Par exemple la notice "ProduitExemple" est ajoutée dans le BO, son emplacement est "/cache/documents/content/ref-notice-produitexemple-juin2019.pdf".

Dans notre fichier .htaccess, on écrit une redirection propre :

Redirect 301 /notice-produit-exemple /cache/documents/content/ref-notice-produitexemple-juin2019.pdf

Et comme ça, le lien qu'on envoie dans notre doc technique ne change jamais, ça restera "/notice-produit-exemple".

Le problème c'est que nos notices changent régulièrement, et qu'on est à chaque fois obligé de réécrire la redirection en fonction du nouvel emplacement de document. On aimerait donc automatiser cette tâche et faire en sorte que la modification du document écrive systématiquement dans le .htaccess pour le mettre à jour.

J'ai plusieurs idées, mais toutes réclament d'écrire dans le .htaccess. Or, je ne suis pas sûr déjà d'avoir les droits d'écriture depuis le serveur pour modifier un document directement, et en plus je trouve ça casse-gueule. Je suis même pas certain de pouvoir juste modifier une ligne, ou de pouvoir supprimer l'ancienne au profit d'une nouvelle.

Y a-t-il un moyen sûr de créer des redirections sans écrire dans le .htaccess ? Je vois qu'il y a une table rewrite_url dans Thelia mais je connais pas son fonctionnement.

Last edited by HeishPi (01-07-2019 13:12:24)


Développeur web Junior

Offline


Ce n'est pas une bonne idée de créer des liens directs vers le cache ! Ce cache peut être vidé, et tes liens deviendront tous obsolètes d'un coup !

Chaque document a sa propre URL, que tu peux retrouver avec la variable $URL de la boucle document. Cette URL sera toujours valide, du moins tant que tu ne supprimes pas le document. C'est sur cette URL que tu dois créer ta redirection, pas sur l'URL du cache.


OpenStudio Toulouse

Offline


Ah ? Oups, notre entreprise a l'air de faire ça depuis bien longtemps... big_smile

Vers quel emplacement je peux pointer alors ? Il n'y a que le dossier web qui soit accessible ainsi, non ? Et quand je clique sur mon document fraîchement ajouté depuis le BO, c'est l'URL du cache que ça utilise automatiquement...

EDIT : Je n'avais pas vu ta dernière modif, okidoki, je vais fouiller de ce côté là déjà pour régler cette faille.

Last edited by HeishPi (27-06-2019 10:37:23)


Développeur web Junior

Offline


Bonjour !

J'ai réussi à trouver quelque chose de prometteur pour mon problème : je fais une redirection systématique vers un fichier php présent dans /web, avec des paramètres pour indiquer vers quelle notice pointer. Dans le .htaccess ça ressemble à ça :

Redirect 301 /notice-test /notice.php?notice=test&langue=fr

Et mon fichier notice.php ressemble à ça :

<?php
use Thelia\Model\ContentDocumentQuery;

$notice = $_GET['notice'];

//header('Location: /'.$notice.'v09-'.$langue.'.pdf');

Cela me permet de rediriger tout le temps la requête d'une notice vers le bon fichier, puisque ces derniers ont des noms standards.

En revanche, pour bien faire il faudrait que je récupère les URLs de chaque content_document présents en BDD. J'ai essayé de mettre ma loop dans ce fichier mais Smarty ne fonctionne pas ici :

echo "{loop type='document' name='testLoop' source='content' source_id='2'}";
echo "{$TITLE}";
echo "{/loop}";

Evidemment ça ne fonctionne pas. J'ai essayé aussi d'aller chercher le Model de contentDocument pour en tirer la liste :

use Thelia\Model\ContentDocumentQuery;

$notices = ContentDocumentQuery::create()->find();
var_dump($notices);

Cet appel ne fonctionne pas non plus, la classe n'est pas atteinte ("Fatal error: Class 'Thelia\Model\ContentDocumentQuery' not found in notice.php on line 12").

Une idée de ce que je peux faire pour récupérer la liste des mes content_document ?


Développeur web Junior

Offline


Tu ne peux pas utiliser l'environnement de Thelia sans un minimum de chose, et en premier l'autoloader (regarde dans index.php). Le plus simple est d'utiliser un template et le module SmartyRedirect ( https://github.com/thelia-modules/SmartyRedirection ).

Un fonction de base de Thelia est de pouvoir appeler un template html simplement. Si tu as un template toto.html, tu peux alors écrire https://www.tonsite.com/toto pour "exécuter" ce template.

Tu peux donc créer un fichier notice.html dans template/fontOffice/<ton_template>, dans lequel tu vas pouvoir utiliser, une boucle "document". Bien sur, tu vas pouvoir ajouter une paramètre à cette URL pour transmettre l'ID du contenu à la boucle "content".

Exemple : https://www.tonsite.com/notice?c=12

Dans notice.html, tu récupère ce paramètre avec $smarty.get comme ça (le |default:0 c'est pour affecter 0 à la variable $idContenu pour ne pas la laisser vide):

{$idContenu = $smarty.get.c|default:0}

et tu peux alors faire :

{loop type='document' name='redirect-to-doc' source='content' source_id=$idContenu limit=1}
    {redirect path=$DOCUMENT_URL  status=302}
{/loop}

Par sécurité, on ajoute une petit contrôle :

{elseloop rel="redirect-to-doc"}
Désolé, nous n'avons pas trouvé cette notice.
{/elseloop}

Tout mis ensemble, on a donc un fichier notice.html qui contient ceci :

{$idContenu = $smarty.get.c|default:0}
{loop type='document' name='redirect-to-doc' source='content' source_id=$idContenu limit=1}
    {redirect path=$DOCUMENT_URL status=302}
{/loop}
{elseloop rel="redirect-to-doc"}
Désolé, nous n'avons pas trouvé cette notice.
{/elseloop}

Si tu ne veux pas passer directement l'ID du contenu, pour des raisons de sécurité, tu peux imaginer de te baser sur un identifiant que tu vas ranger dans le chapo du contenu (exemple: notice-a, ou notice_materiel_x). Au lieu de passer l'ID directement dans l'URL, tu vas passer cet identifiant :

Exemple : https://www.tonsite.com/notice?ref=notice-a

Tu vas utiliser ensuite les paramètres de recherche des boucles pour retrouver le contenu, et par la même le document associé :

{$chapo = $smarty.get.ref|default:'xyz'}
{loop type="content" name="contenu-cherche" search_in='chapo' search_term=$chapo}
    {loop type='document' name='redirect-to-doc' content=$ID limit=1}
        {redirect path=$DOCUMENT_URL status=302}
    {/loop}
{/loop}
{elseloop rel="contenu-cherche"}
Désolé, nous n'avons pas trouvé cette notice.
{/elseloop}

OpenStudio Toulouse

Offline


Ah, pas mal du tout ! Effectivement ça me permet de faire toutes mes redirections dans le .htaccess sur la base "/notice?c=3" et je peux faire :

{redirect path=$ORIGINAL_DOCUMENT_PATH status=302}

(J'ai utilisé ça puisque la doc n'indique pas de variable $URL pour la loop document, et ça fonctionne pas mal).

En revanche, le source_id se base sur le content_id de la table content_document. Or, dans notre BDD on a des notices semblables mais dans différentes langues. Et une même notice, indépendamment de sa langue, possède le même content_id.

Du coup, avec cette méthode je récupère systématiquement la notice française, et pas les autres neutral

Mais en attendant merci beaucoup, ça fonctionne super bien ! Ce petit module fait des miracles.


Développeur web Junior

Offline


C'est $DOCUMENT_URL (cf. la doc) qu'il faut utiliser, et pas $DOCUMENT_PATH, ni $URL,  désolé pour l'erreur.

Pour ton histoire de langues, tu peux utiliser le même truc, mettre la langue (ex. "en") dans le chapo du document, passer la variable à l'URL (ex. lng=en) , et faire un truc du genre :

{loop type='document' name='redirect-to-doc' content=$ID}
        {if $CHAPO == {$smarty.get.lng}}
            {redirect path=$DOCUMENT_URL status=302}
        {/if}
    {/loop}

Endless possibilities...


OpenStudio Toulouse

Offline


J'ai collé 2 lettres pour la langue dans la description de chaque contenu comme tu le suggérais et ça fonctionne du feu de Dieu cool

Merci encore !


Développeur web Junior