Je m'explique je veux rediriger un lien de téléchargement afin de cacher le dossier aux visiteurs.
Mon lien :
/telechargement/$post_id/$nom_du_fichier.zip
Le fichier du dossier vers lequel il pointe réellement :
/download/$post_id/$nom_du_fichier.zip
J'aimerai faire ca dans les routes avec un router::redirect
mais je ne parviens pas à le faire.
Je précise que 2 parties de l'url sont dynamiques : $post-id et $le nom_du_fichier
Si quelqu'un maitrise le routing et le router::connect, ce serait cool :)
Merci beaucoup duffJohn, en suivant ta piste, je suis parvenu à faire ce que je voulais, à savoir cacher le veritable lien de telechargement au visiteur en le remplaçant par un lien de substitution.
Si ça peut aider quelqu'un, voici mon bout de code. Ce n'est peut être pas la solution ultime ou la plus propre, mais elle fonctionne ;)
On suppose que le lien réel de téléchargement est : /download/fichiers/12/monfichier.zip (ou le nom "monfichier" correspond au slug du post et "12" à l'id du post)
1/ Dans ma vue je place le lien de telechargement :
<a href="<?php echo $this->Html->url('/telechargement/'.$post'Post']'id'])?>">Télécharger le fichier</a>
2/ Dans mes routes, je reroute le lien fictif vers un controller et une action download en passant l'id du post :
Router::connect('/telechargement/:id', array('controller' => 'posts', 'action' => 'download'), array('pass'=>array('id'),'id'=>'[0-9]+'));
3/ Pour finir dans mon controller, je crée la fonction download qui redirigera vers le véritable lien de téléchargement :
function download ($id = null, $slug = null) {
$this->view = 'Media';
$this->autoLayout = false;
$post = $this->Post->find('first', array(
'conditions' => array('Post.id' => $id),
'recursive' => 0
));
$id = $post'Post']'id'];
$slug = $post'Post']'slug'];
/**
* Je redirige vers le lien réel
* */
$this->redirect('/download/fichiers/'.$id.'/'.$slug.'.zip');
}
Ainsi, le véritable lien de download n'apparait pas au visiteur qui clique sur " /telechargement/12 "
Merci encore à duffJohn de m'avoir indiqué une piste ... J'étais dans le brouillard :)
Pour éclairer un peu plus, mon lien de telechargement direct fonctionne tres bien, il s'agit de :
/download/$post_id/$nom_du_fichier.zip
Je voudrai que le lien
/telechargement/$post_id/$nom_du_fichier.zip pointe vers le lien réel qui fonctionne
Des réponses ???
Je dirai un truc du genre:
Router::connect('/telechargement/:post_id/:nom_du_fichier',array('controller'=>'medias','action'=>'download'),array('pass'=>array('post_id','nom_du_fichier'),'id'=>'[0-9]+'));
Si ton action Dwld se situe bien dans le controller medias...Enfin ca doit ressembler a quelque chose comme ca.
Ca pourrait fonctionner à ceci près :
1/ J'ai besoin que le lien force le téléchargement alors qu'avec ce code, cakephp appelle une vue (d'ou mon code d'erreur "missing view download") - Donc est-il possible de forcer un l'appel à un lien (url) sans appeler la vue? si oui, comment le faire ?
2/ J'ai laissé la fonction "download" du controller pour le moment vide -> Serait-ce une bonne méthode de creer une fonction qui forcerait le telechargement dans cette fonction "download" justement ?
<u>PS:</u> C'est pour ces raisons que je souhaitais utiliser à la base un "router::redirect" plutot qu'un "router::connect" car j'ai besoin que le lien pointe vers un lien et non pas appelle un controller, une action et une vue.
Merci de vos réponses en tout cas, S'il y a une solution à privilégier plutot qu'une autre, je suis preneur ^^ :) Ca pourrait servir :)
Enfait je ne pense pas que Cake appelle une vue.
Il appelle un action que tu as normalement dans ton controller. C'est dans celle ci que tu dois préciser que tu n'a pas de vue correspondante, et que tu veux forcer le téléchargement.
Donc moi c'est ainsi que je testerai. Donc faire une fonction Dwld et pointer ta redirection dessus.
Apres je ne connai pas vraiment router::redirect donc je ne peux pas t'aider plus que ca ;)