Bonjour,
j ai suivi le tutoriel sur twig et c'est la premiere fois que je fait du twig, j ai deja fait un petit peu de php mais c'est pas du tout mon metier
j ai un ficher home.twig ave cun lien comme ceci
"<.a href="movie?id="{{ movie.ID }}> mon film </a>"
j ai un fichier index.php comme ceci :
<?php
header( 'content-type: text/html; charset=utf-8' );
require 'vendor/autoload.php';
// Routing
$page = 'home';
// DEV
$loader = new Twig_Loader_Filesystem(__DIR__ . '/view/templates');
$twig = new Twig_Environment($loader, [
'cache' => false, // '__DIR__.'/tmp'
]);
//liste des films
function movies () {
$pdo = new PDO('mysql:dbname=movie;host=localhost;charset=utf8', 'root' ,'');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$movies = $pdo->query('SELECT * FROM movie');
return $movies;
}
//details films ID
function movie_details($ID) {
$pdo = new PDO('mysql:dbname=movie;host=localhost;charset=utf8', 'root' ,'');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$movies = $pdo->query('SELECT * FROM movie WHERE ID='.$ID);
return $movies_details;
}
//extention externe
$twig->addExtension(new Twig_Extensions_Extension_Text());
switch ($page){
case 'home':
echo $twig->render('home.twig', ['movies' => movies()]);
break;
case 'movie':
echo $twig->render('movie.twig', ['movie_details('.$ID.')' => movie_details]);
break;
case 'contact':
echo $twig->render('contact.twig');
break;
default:
header('HTTP/1.0 404 Not Found');
echo $twig->render('404.twig');
break;
}
en fait je voudrais un que lorsque je creer sur une image de films cela me renvoi vers la page movie.twig mais que la fonction movie_details soit executer pour ne recuperer les informations du films choisi
je me doute que je fait un erreur quelque part mais je ne comprends pas ou
ps je suis debutant
Objet non trouvé!
L'URL demandée n'a pas pu être trouvée sur ce serveur. Si vous avez tapé l'URL à la main, veuillez vérifier l'orthographe et réessayer.
Si vous pensez qu'il s'agit d'une erreur du serveur, veuillez contacter le webmestre.
Error 404
127.0.0.1
Apache/2.4.34 (Win32) OpenSSL/1.1.0h PHP/7.2.8
Hello,
Tu n'es pas loin en effet ! ;)
Il faut bien que tu gardes en tête que le twig ne doit pas appeler de fonction php (il faut éviter un maximum, le côté serveur sert déjà à ça), du coup, il faut attribuer une variable qui contiendra le retour de ta fonction :
switch ($page) {
case 'home':
echo $twig->render('home.twig', ['movies' => movies()]);
break;
case 'movie':
// Ici j'attribue le retour de la fonction à une variable, au mieux il faudrait qu'elle renvoit un array ou un string :
$movie_details = movie_details($ID);
// Et je l'attribue au template :
echo $twig->render('movie.twig', ['details' => $movie_details]);
break;
case 'contact':
echo $twig->render('contact.twig');
break;
default:
header('HTTP/1.0 404 Not Found');
echo $twig->render('404.twig');
break;
}
Mais j'ai encore un doute sur le fait que ça marche. $ID sera sûrement vide donc pour le moment, rien ne t'empêche de le récupérer comme ceci :
switch ($page) {
case 'home':
echo $twig->render('home.twig', ['movies' => movies()]);
break;
case 'movie':
// Je récupère l'id via la requète get :
$id = htmlspecialchars($_GET['id']);
// J'appelle la fonction :
$movie_details = movie_details($id);
// Et je l'attribue à la variable details :
echo $twig->render('movie.twig', ['details' => $movie_details]);
break;
case 'contact':
echo $twig->render('contact.twig');
break;
default:
header('HTTP/1.0 404 Not Found');
echo $twig->render('404.twig');
break;
}
Je te laisse rajouter la sécurité et autre mais l'idée est là.
Un grand merci :) ca marche super !!
concernant la securité en quoi ce fonctionement n'est il pas securitaire ?
en tout cas merci je peux avancer sur mon petit site ^^
C'est top alors :D
J'ai juste appliqué un htmlspeciachars sur la variable $id que tu récupères depuis l'url. Mais méfies-toi car des personnes mal intentionnées peuvent passer par exemple du js dedans. Impossible de te dire si niveau sécurité cela suffira.