Développement d'un Framework PHP3
Développement d'un Framework PHP3
Contexte
Un concepteur de sites web a commencé à développer une application de partage de connaissances. Les
visiteurs du site peuvent ajouter des URL d’autres sites avec un descriptif. Ces URL sont visibles à partir de la
page [Link]. Chaque URL peut être consultée par l’intermédiaire d’une iframe, ce qui permet de revenir
facilement à la liste et de naviguer ainsi entre les ressources partagées.
Vous récupérerez ce code sur Moodle. Il est constitué de 3 pages PHP :
— [Link] affiche la liste et le formulaire d’ajout ;
— [Link] affiche le site ;
— [Link] crée et initialise la base de données.
Vous trouverez également 3 classes : [Link] qui gère les objets messages, [Link] qui
gère l’abstraction BD et [Link] qui gère la persistance BD des objets messages.
Votre objectif est de mettre ce développement dans un framework que vous allez vous-même créer. Attention,
certains sites interdisent l’affichage en iframe, notamment [Link]. Choisissez donc bien vos exemples.
Ce TP est volontairement long car il clôture la partie PHP. Le découpage en étapes devraient vous permettre
d’itérer dans sa construction en maintenant une version fonctionnelle.
Vous trouverez ci-dessous un visuel vous permettant de vous donner une idée du résultat final.
Première étape : routage
Dans un premier temps vous mettrez uniquement en place le « routage » de votre framework.
— La page avec la liste des sites sera accessible sur l’URL directe /.
— La page contenant l’iframe de chaque site mémorisé sera disponible sur /site/ID (ID étant l’identifiant
du site correspondant en BD).
— Pour toutes les autres URL, vous afficherez une page 404.
Vous utiliserez la ré-écriture d’URL. Vous créerez également une classe route chargée de gérer la liste des
routes autorisées. Celle-ci variera bien évidemment en fonction des ressources ajoutées.
Pensez dès à présent et durant tout le TDM à bien organiser votre code dans des répertoires aux noms
appropriés (classes, db, routes, templates, etc.).
Correction
.htaccess
R e w r i t e E n g i n e On
# ATTENTION s i dans un d o s s i e r /~ d o s s i e r _ u t i l i s a t e u r
# R e w r i t e B a s e /URL_JUSQUA_L_URL_DU_DOSSIER_DU_HTACCESS
R e w r i t e B a s e /~ p a u c h e t a /TW/PHP−TDM08/
RewriteCond %{REQUEST_FILENAME} !− f
RewriteCond %{REQUEST_FILENAME} !−d
R e w r i t e R u l e ( . ∗ ) i n d e x . php ? a r g=$1 [ QSA, L ]
[Link]
<? php
header ( ’ Content −Type : t e x t / h t m l ; c h a r s e t=u t f −8 ’ ) ;
// I n i t i a l i s a t i o n du Framework
include ( ’ c o n f . php ’ ) ;
include ( ’ c l a s s e s / t p l . c l a s s . php ’ ) ;
include ( ’ c l a s s e s / r o u t e . c l a s s . php ’ ) ;
include ( ’ c l a s s e s / db . c l a s s . php ’ ) ;
// Chargement d e s c l a s s e s m é t i e r s
include ( ’ c l a s s e s / m e s s a g e . c l a s s . php ’ ) ;
include ( ’ c l a s s e s / m e s s a g e . db . c l a s s . php ’ ) ;
try {
// I n i t i a l i s a t i o n du moteur de t e m p l a t e
$ t p l = new a s i 4 f r a m e \ t e m p l a t e ( ) ;
// I n i t i a l i s a t i o n de l a b a s e de d o n n é e s
i f ( ! f i l e _ e x i s t s (DB_PATH) ) {
a s i 4 f r a m e \ db : : Connect ( ’ s q l i t e : ’ .DB_PATH) ;
messageDb : : C r e a t e T a b l e ( ) ;
messageDb : : LoadSample ( ) ;
} else {
a s i 4 f r a m e \ db : : Connect ( ’ s q l i t e : ’ .DB_PATH) ;
}
// g e s t i o n de l a c o n n e x i o n
session_start ( ) ;
i f ( ! empty($_POST [ ’ a u t h ’ ] ) && s h a 1 ($_POST [ ’ a u t h ’ ] . SALT)==ADMIN_PASS) {
$_SESSION [ ’ a u t h ’ ] = true ;
}
$ t p l −> i s a u t h = ! empty ( $_SESSION [ ’ a u t h ’ ] ) ;
// I n i t i a l i s a t i o n du r o u t a g e
a s i 4 f r a m e \ r o u t e : : i n i t ( a r r a y ( ’ home ’ , ’ s i t e ’ ) ) ; // d e f i n i t i o n d e s r o u t e s a u t o r i s é e s
a s i 4 f r a m e \ r o u t e : : s e t D e f a u l t R o u t e ( ’ home ’ ) ; // d e f i n i t i o n d e s r o u t e s a u t o r i s é e s
// E x e c u t i o n du r o u t a g e
$maroute = a s i 4 f r a m e \ r o u t e : : g e t C u r r e n t R o u t e ( ) ;
i n c l u d e ( ’ r o u t e s / ’ . $maroute . ’ . r o u t e . php ’ ) ;
} c a t c h ( E x c e p t i o n $e ) {
i n c l u d e ( ’ t e m p l a t e s / e r r e u r . t p l . php ’ ) ;
}
[Link]
<? php
d e f i n e ( ’DB_PATH ’ , ’ db / m e s s a g e s . s q l i t e ’ ) ;
d e f i n e ( ’ADMIN_PASS ’ , ’ 4 d e f 8 2 6 4 d 8 7 d 2 2 a 4 4 3 2 b 5 b 1 9 6 8 e c f 8 1 9 e c 5 b 0 f 2 b ’ ) ; // s t o c k é h a c h é
d e f i n e ( ’SALT ’ , ’ 1 g r o s G r a i n D e S e l ’ ) ;
// p o u r c a l c u l e r un mot de p a s s e h a c h é
// e c h o s h a 1 ( ’ m o t d e p a s s e ’ . SALT) ;
[Link]
<? php
namespace a s i 4 f r a m e ;
c l a s s db {
private s t a t i c $conString ;
p r i v a t e s t a t i c $conActive = false ;
p r i v a t e s t a t i c $db ;
private s t a t i c $preparequery = false ;
p u b l i c s t a t i c f u n c t i o n Connect ( $ c o n s t r i n g = f a l s e ) {
if ( $constring ) {
db : : $ c o n S t r i n g = $ c o n s t r i n g ;
}
try {
s e l f : : $ d b = new \PDO( db : : $ c o n S t r i n g ) ;
s e l f : : $db−> s e t A t t r i b u t e ( \PDO : : ATTR_ERRMODE, \PDO : : ERRMODE_EXCEPTION) ;
} c a t c h ( E x c e p t i o n $e ) {
s e l f : : $conActive = f a l s e ;
t h r o w $e ;
}
s e l f : : $conActive = true ;
}
public s t a t i c f u n c t i o n OnlyConActive ( ) {
if ( ! s e l f : : $conActive ) {
t h r o w new \ E x c e p t i o n ( "DB non c o n n e c t é e " ) ;
}
}
p u b l i c s t a t i c f u n c t i o n Query ( $ s q l ) {
s e l f : : OnlyConActive ( ) ;
try {
r e t u r n s e l f : : $db−>q u e r y ( $ s q l ) ;
} c a t c h ( E x c e p t i o n $e ) {
t h r o w $e ;
}
}
p u b l i c s t a t i c f u n c t i o n Prepare ( $ s q l ) {
s e l f : : OnlyConActive ( ) ;
try {
s e l f : : $ p r e p a r e q u e r y = s e l f : : $db−>p r e p a r e ( $ s q l ) ;
} c a t c h ( E x c e p t i o n $e ) {
t h r o w $e ;
}
}
p u b l i c s t a t i c f u n c t i o n E x e c u t e ( $params ) {
s e l f : : OnlyConActive ( ) ;
i f ( ! s e l f : : $preparequery ) {
t h r o w new \ E x c e p t i o n ( "On ne p e u t p a s e x e c u t e r a v a n t d ’ a v o i r p r é p a r é s a q u e r y
");
}
try {
s e l f : : $ p r e p a r e q u e r y −>e x e c u t e ( $params ) ;
r e t u r n s e l f : : $ p r e p a r e q u e r y −> f e t c h A l l ( ) ;
} c a t c h ( E x c e p t i o n $e ) {
t h r o w $e ;
}
s e l f : : $preparequery = f a l s e ;
}
[Link]
<? php
c l a s s Message {
p r i v a t e $ i d=NULL ;
p r i v a t e $timestamp ;
p r i v a t e $ e m a i l= ’ ’ ;
p r i v a t e $ t e x t e= ’ ’ ;
p r i v a t e $ u r l= ’ ’ ;
p u b l i c f u n c t i o n __construct ( ) {
$ t h i s −>t i m e s t a m p = t i m e ( ) ;
}
p u b l i c f u n c t i o n g e t D a t e ( $ f o r m a t = "%A %d %B %Y %T" ) {
r e t u r n s t r f t i m e ( $ f o r m a t , ( i n t ) $ t h i s −>t i m e s t a m p ) ;
}
p u b l i c f u n c t i o n s e t D a t e ( $d ) {
$ t h i s −>t i m e s t a m p= ( i n t ) $d ;
}
p u b l i c function getEmail () {
r e t u r n $ t h i s −>e m a i l ;
}
p u b l i c f u n c t i o n s e t E m a i l ( $e ) {
i f ( f i l t e r _ v a r ( $e , FILTER_VALIDATE_EMAIL) ) {
$ t h i s −>e m a i l=$e ;
} else {
t h r o w new \ E x c e p t i o n ( " Email non v a l i d e " ) ;
}
}
p u b l i c f u n c t i o n s e t U r l ( $u ) {
i f ( f i l t e r _ v a r ( $u , FILTER_VALIDATE_URL) ) {
$ t h i s −>u r l=$u ;
} else {
t h r o w new \ E x c e p t i o n ( "URL non v a l i d e " ) ;
}
}
}
[Link]
<? php
c l a s s MessageDb e x t e n d s a s i 4 f r a m e \ db {
p u b l i c s t a t i c function CreateTable () {
s t a t i c : : Query ( "CREATE TABLE IF NOT EXISTS m e s s a g e s (
m e s s a g e _ i d INTEGER PRIMARY KEY,
m e s s a g e _ d a t e TEXT NOT NULL,
m e s s a g e _ e m a i l TEXT NOT NULL,
m e s s a g e _ t e x t e TEXT NOT NULL,
m e s s a g e _ u r l TEXT NOT NULL
)");
}
p u b l i c s t a t i c f u n c t i o n LoadSample ( ) {
$ a l l m = array (
array ( ’ e m a i l ’=> ’ o l i v i e r @ s b . am ’ , ’ t e x t e ’=>" Symfony , l ’ un d e s f r a m e w o r k l e s
p l u s u t i l i s é " , ’ u r l ’=>" h t t p : / / symfony . com/ " ) ,
a r r a y ( ’ e m a i l ’=> ’ o l i v i e r @ s b . am ’ , ’ t e x t e ’=>" L ’ un d e s p r e m i e r s f r a m e w o r k s PHP,
i n s p i r é de RAIL " , ’ u r l ’=>" h t t p : / / c a k e p h p . o r g / " ) ,
a r r a y ( ’ e m a i l ’=> ’ o l i v i e r @ s b . am ’ , ’ t e x t e ’=>" Code I g n i t e r , l ’ une d e s r é f é r e n c e s "
, ’ u r l ’=>" h t t p s : / /www . c o d e i g n i t e r . com/ " ) ,
a r r a y ( ’ e m a i l ’=> ’ o l i v i e r @ s b . am ’ , ’ t e x t e ’=>" FuelPHP un f r a m e w o r k q u i monte en
c e moment " , ’ u r l ’=>" h t t p : / /www . f u e l p h p . com/ " )
);
f o r e a c h ( $ a l l m a s $m) {
$ m e s s a g e = new Message ( ) ;
$message −>s e t E m a i l ($m [ ’ e m a i l ’ ] ) ;
$message −>s e t T e x t e ($m [ ’ t e x t e ’ ] ) ;
$message −>s e t U r l ($m [ ’ u r l ’ ] ) ;
s t a t i c : : Create ( $message ) ;
}
}
p u b l i c s t a t i c f u n c t i o n Create ( $message ) {
s t a t i c : : P r e p a r e ( "INSERT INTO m e s s a g e s ( message_date , message_email ,
m e s s a g e _ t e x t e , m e s s a g e _ u r l ) VALUES ( : d a t e , : e m a i l , : t e x t e , : u r l ) " ) ;
s t a t i c : : E x e c u t e ( a r r a y ( ’ : d a t e ’=>$message −>g e t D a t e S q l ( ) ,
’ : e m a i l ’=>$message −>g e t E m a i l ( ) ,
’ : t e x t e ’=>$message −>g e t T e x t e ( ) ,
’ : u r l ’=>$message −>g e t U r l ( )
));
}
p u b l i c s t a t i c f u n c t i o n Read ( $ i d ) {
s t a t i c : : P r e p a r e ( "SELECT ∗ FROM m e s s a g e s WHERE m e s s a g e _ i d = : i d " ) ;
$ l i s t e _ m e s s a g e s = s e l f : : E x e c u t e ( a r r a y ( ’ : i d ’=>( i n t ) $ i d ) ) ;
$row = $ l i s t e _ m e s s a g e s [ 0 ] ;
$ m e s s a g e = new Message ( ) ;
$message −>s e t I d ( $row [ ’ m e s s a g e _ i d ’ ] ) ;
$message −>s e t D a t e ( s t r t o t i m e ( $row [ ’ m e s s a g e _ d a t e ’ ] ) ) ;
$message −>s e t E m a i l ( $row [ ’ m e s s a g e _ e m a i l ’ ] ) ;
$message −>s e t T e x t e ( $row [ ’ m e s s a g e _ t e x t e ’ ] ) ;
$message −>s e t U r l ( $row [ ’ m e s s a g e _ u r l ’ ] ) ;
r e t u r n $message ;
}
p u b l i c s t a t i c f u n c t i o n Update ( $ m e s s a g e ) {
s t a t i c : : P r e p a r e ( "UPDATE m e s s a g e s SET m e s s a g e _ d a t e = : d a t e , m e s s a g e _ e m a i l = :
e m a i l , m e s s a g e _ t e x t e = : t e x t e , m e s s a g e _ u r l = : u r l WHERE m e s s a g e _ i d = : i d " ) ;
s t a t i c : : E x e c u t e ( a r r a y ( ’ : d a t e ’=>$message −>g e t D a t e S q l ( ) ,
’ : e m a i l ’=>$message −>g e t E m a i l ( ) ,
’ : t e x t e ’=>$message −>g e t T e x t e ( ) ,
’ : u r l ’=>$message −>g e t U r l ( ) ,
’ : i d ’=>$message −>g e t I d ( )
));
}
p u b l i c s t a t i c function ListMessage () {
$messages = array () ;
$ l i s t e _ m e s s a g e s = s e l f : : Query ( "SELECT ∗ FROM m e s s a g e s ORDER BY m e s s a g e _ i d ASC" ) ;
f o r e a c h ( $ l i s t e _ m e s s a g e s a s $row ) {
$ m e s s a g e = new Message ( ) ;
$message −>s e t I d ( $row [ ’ m e s s a g e _ i d ’ ] ) ;
$message −>s e t D a t e ( s t r t o t i m e ( $row [ ’ m e s s a g e _ d a t e ’ ] ) ) ;
$message −>s e t E m a i l ( $row [ ’ m e s s a g e _ e m a i l ’ ] ) ;
$message −>s e t T e x t e ( $row [ ’ m e s s a g e _ t e x t e ’ ] ) ;
$message −>s e t U r l ( $row [ ’ m e s s a g e _ u r l ’ ] ) ;
$messages [ ] = $message ;
}
return $messages ;
}
}
[Link]
<? php
namespace a s i 4 f r a m e ;
class route {
p r i v a t e s t a t i c $ r o u t e s a u t o r i s e = array ( ) ;
private static $defaultroute ;
public s t a t i c function i n i t ( $routes ) {
i f ( is_array ( $ r o u t e s ) ) {
route : : $routesautorise = $routes ;
} else {
t h r o w new \ E x c e p t i o n ( " Route a b e s o i n d ’ un t a b l e a u de r o u t e s p o u r ê t r e
initialisé ");
}
}
p u b l i c s t a t i c function getCurrentRoute () {
$ r o u t e = array ( ) ;
// s i p a s de PATH_INFO = d e f a u l t r o u t e
i f ( ! i s s e t ($_GET [ ’ a r g ’ ] ) && i s s e t ($_SERVER [ ’PATH_INFO ’ ] ) ) {
$ p a t h = trim ($_SERVER [ ’PATH_INFO ’ ] , ’ / ’ ) ;
} e l s e i f ( i s s e t ($_GET [ ’ a r g ’ ] ) ) {
$ p a t h = $_GET [ ’ a r g ’ ] ;
}
i f (empty( $ p a t h ) && ! empty( r o u t e : : $ d e f a u l t r o u t e ) ) {
return route : : $defaultroute ;
}
// e x t r a c t i o n de l a r o u t e du PATH_INFO
e l s e i f ( preg_match ( ’ / ^ ( [ a−z ]+) \ / ? ( [ 0 − 9 ] ∗ ) $ / ’ , $ p a t h , $ r o u t e ) ) {
// v é r i f i c a t i o n s i l a r o u t e e s t a u t o r i s é
i f ( in_array ( $ r o u t e [ 1 ] , r o u t e : : $ r o u t e s a u t o r i s e ) ) {
return $route [ 1 ] ;
}
}
p u b l i c s t a t i c function getCurrentArg () {
$ r o u t e = array ( ) ;
// s i p a s de PATH_INFO = d e f a u l t r o u t e
i f ( ! i s s e t ($_GET [ ’ a r g ’ ] ) && i s s e t ($_SERVER [ ’PATH_INFO ’ ] ) ) {
$ p a t h = trim ($_SERVER [ ’PATH_INFO ’ ] , ’ / ’ ) ;
} e l s e i f ( i s s e t ($_GET [ ’ a r g ’ ] ) ) {
$ p a t h = $_GET [ ’ a r g ’ ] ;
}
i f ( preg_match ( ’ / ^ ( [ a−z ]+) \ / ? ( [ 0 − 9 ] ∗ ) $ / ’ , $ p a t h , $ r o u t e ) ) {
i f ( in_array ( $ r o u t e [ 1 ] , r o u t e : : $ r o u t e s a u t o r i s e ) ) {
return ( int ) $route [ 2 ] ;
}
}
r e t u r n f a l s e ; // p a s d e f a u t
}
p u b l i c s t a t i c f u n c t i o n show404 ( ) {
include ( ’ r o u t e s / 4 0 4 . r o u t e . php ’ ) ;
exit ;
}
}
[Link]
<? php
namespace a s i 4 f r a m e ;
class template {
// I c i on p o u r r a i t m e t t r e d e s m e t h o d e s s p é c i f i q u e s p o u r l e f o r m a t a g e de d a t e p a r
exemple . . .
}
[Link]
<? php
header ( "HTTP/ 1 . 0 404 Not Found " ) ;
// a f f i c h a g e du t e m p l a t e 404
include ( ’ t e m p l a t e s / 4 0 4 . t p l . php ’ ) ;
[Link]
<? php
// g e s t i o n de l a s u p p r e s i o n
i f ( ! empty($_GET [ ’ d e l ’ ] ) ) {
MessageDb : : Delete ($_GET [ ’ d e l ’ ] ) ;
}
// g e s t i o n de l a m o d i f i c a t i o n
i f ( ! empty($_GET [ ’ e d i t ’ ] ) ) {
$ e d i t m e s s a g e = MessageDb : : Read ($_GET [ ’ e d i t ’ ] ) ;
$ t p l −>e d i t m e s s a g e = new A r r a y O b j e c t ( ) ;
$ t p l −>e d i t m e s s a g e −>t e x t e = $ e d i t m e s s a g e −>g e t T e x t e ( ) ;
$ t p l −>e d i t m e s s a g e −>u r l = $ e d i t m e s s a g e −>g e t U r l ( ) ;
$ t p l −>e d i t m e s s a g e −>i d = $ e d i t m e s s a g e −>g e t I d ( ) ;
$ t p l −>e d i t m e s s a g e −>e m a i l = $ e d i t m e s s a g e −>g e t E m a i l ( ) ;
}
// g e s t i o n du f o r m u l a i r e
i f ( ! empty ($_POST [ ’ u r l ’ ] ) ) {
// I n s e r t i o n du nouveau
try {
$m= new Message ( ) ;
$m−>s e t U r l ($_POST [ ’ u r l ’ ] ) ;
$m−>s e t E m a i l ($_POST [ ’ e m a i l ’ ] ) ;
$m−>s e t T e x t e ($_POST [ ’ t e x t e ’ ] ) ;
i f ( ! empty ($_POST [ ’ i d ’ ] ) ) {
$m−>s e t I d ($_POST [ ’ i d ’ ] ) ;
MessageDb : : Update ($m) ;
} else {
MessageDb : : C r e a t e ($m) ;
}
} c a t c h ( E x c e p t i o n $e ) {
// r e c h a r g e m e n t du f o r m u l a i r e p o u r l a c o r r e c t i o n
$ t p l −>e d i t m e s s a g e = new A r r a y O b j e c t ( ) ;
$ t p l −>e d i t m e s s a g e −>t e x t e = $_POST [ ’ t e x t e ’ ] ;
$ t p l −>e d i t m e s s a g e −>u r l = $_POST [ ’ u r l ’ ] ;
$ t p l −>e d i t m e s s a g e −>e m a i l = $_POST [ ’ e m a i l ’ ] ;
// g e s t i o n d e s e r r e u r s
$ t p l −>e r r = $e−>g e t M e s s a g e ( ) ;
}
}
// a f f i c h a g e du t e m p l a t e home
i n c l u d e ( ’ t e m p l a t e s /home . t p l . php ’ ) ;
[Link]
<? php
// r é c u p é r a t i o n du p a r a m e t r e
$ i d=a s i 4 f r a m e \ r o u t e : : g e t C u r r e n t A r g ( ) ;
i f (! $id ) {
a s i 4 f r a m e \ r o u t e : : show404 ( ) ;
}
// r e c h e r c h e du m e s s a g e
$ m e s s a g e = MessageDb : : Read ( $ i d ) ;
i f ( ! $message ) {
a s i 4 f r a m e \ r o u t e : : show404 ( ) ;
}
// l a n c e m e n t du t e m p l a t e
i n c l u d e ( ’ t e m p l a t e s / s i t e . t p l . php ’ ) ;
[Link]
<html>
<head>
< t i t l e>Page non t r o u v é e</ t i t l e>
<s t y l e>
div {
f o n t − s i z e : 3 0 0 px ;
color : grey ;
margin−t o p : 100 px ;
w i d t h : 100%;
t e x t −a l i g n : c e n t e r ;
}
</ s t y l e>
</head>
<body>
<div>404</ div>
</body>
</html>
[Link]
<html>
<head>
< t i t l e>E r r e u r</ t i t l e>
<s t y l e>
div {
f o n t − s i z e : 2 4 px ;
color : grey ;
margin−t o p : 100 px ;
w i d t h : 100%;
t e x t −a l i g n : c e n t e r ;
}
.t {
f o n t − s i z e : 2 0 0 px ;
}
</ s t y l e>
</head>
<body>
<div c l a s s=" t ">E r r e u r</ div>
<div c l a s s="m"><?=$e−>g e t M e s s a g e ( ) ?></ div>
</body>
</html>
[Link]
< !DOCTYPE html>
<html lang=" en "><head>
<meta h t t p −e q u i v=" c o n t e n t −t y p e " content=" t e x t / h t m l ; c h a r s e t=UTF−8">
< t i t l e>P a r t a g e de r e s s o u r c e s</ t i t l e>
<meta name=" v i e w p o r t " content=" w i d t h=d e v i c e −w i d t h , i n i t i a l −s c a l e =1.0 ">
<meta charset=" u t f −8">
<l i n k r e l=" s t y l e s h e e t " h r e f=" . . / s t a t i c / b o o t s t r a p . c s s " media=" s c r e e n ">
<l i n k r e l=" s t y l e s h e e t " h r e f=" . . / s t a t i c / b o o t s w a t c h . c s s ">
<s t y l e>
. bs −d o c s −s e c t i o n {
margin−t o p : 3em ;
}
iframe {
border : 0 ;
margin : 0 ;
padding : 0 ;
width :100%;
h e i g h t : 1 0 0 0 px ;
}
</ s t y l e>
</head>
<body>
<div c l a s s=" n a v b a r n a v b a r − d e f a u l t n a v b a r −f i x e d −t o p ">
<div c l a s s=" c o n t a i n e r ">
<div c l a s s=" n a v b a r −h e a d e r ">
<span c l a s s=" n a v b a r −b r a n d "><?= $ t p l −> t e x t e ?></span>
</ div>
<div c l a s s=" n a v b a r −c o l l a p s e c o l l a p s e " id=" n a v b a r −main ">
<ul c l a s s=" nav n a v b a r −nav n a v b a r − r i g h t ">
< l i><a type=" b u t t o n " c l a s s=" b t n b t n −w a r n i n g " h r e f=" . . / ">R e t o u r à l a l i s t e<
/a></ l i>
</ ul>
</ div>
</ div>
</ div>
<iframe s r c="<?= $ t p l −>u r l ?>"></ iframe>
</body></html>
[Link]
< !DOCTYPE html>
<html lang=" en ">
<head>
<meta h t t p −e q u i v=" c o n t e n t −t y p e " content=" t e x t / h t m l ; c h a r s e t=UTF−8">
< t i t l e>P a r t a g e de r e s s o u r c e s</ t i t l e>
<meta name=" v i e w p o r t " content=" w i d t h=d e v i c e −w i d t h , i n i t i a l −s c a l e =1.0 ">
<meta charset=" u t f −8">
<l i n k r e l=" s t y l e s h e e t " h r e f=" s t a t i c / b o o t s t r a p . c s s " media=" s c r e e n ">
<l i n k r e l=" s t y l e s h e e t " h r e f=" s t a t i c / b o o t s w a t c h . c s s ">
<s t y l e>
. bs −d o c s −s e c t i o n {
margin−t o p : 3em ;
}
</ s t y l e>
</head>
<body>
<div c l a s s=" n a v b a r n a v b a r − d e f a u l t n a v b a r −f i x e d −t o p ">
<div c l a s s=" c o n t a i n e r ">
<div c l a s s=" n a v b a r −h e a d e r ">
<span c l a s s=" n a v b a r −b r a n d ">P a r t a g e de r e s s o u r c e</span>
</ div>
<div c l a s s=" n a v b a r −c o l l a p s e c o l l a p s e " id=" n a v b a r −main ">
<ul c l a s s=" nav n a v b a r −nav n a v b a r − r i g h t ">
< l i><a h r e f="#i n s e r t ">A j o u t e r</a></ l i >
< l i><a h r e f="#c o n n e c t ">Connexion</a></ l i >
</ ul>
</ div>
</ div>
</ div>
<? php
i f ( ! empty( $ t p l −>e r r ) ) { ?>
< !−− A f f i c h a g e d e s é v e n t u e l s m e s s a g e s d ’ e r r e u r −−>
<d i v c l a s s ="row">
<d i v c l a s s =" c o l −l g −12">
<d i v c l a s s =" bs −e x a m p l e ">
<d i v c l a s s =" a l e r t a l e r t −d i s m i s s a b l e a l e r t −w a r n i n g ">
<b u t t o n t y p e =" b u t t o n " c l a s s =" c l o s e " d a t a −d i s m i s s =" a l e r t ">x</ b u t t o n >
<h4>Er reu r </h4>
<p><?=$ t p l −>e r r ?></p>
</ d i v >
</ d i v >
</ d i v >
</ d i v >
<?php } ?>
<!−− T a b l e s
================================================== −−>
<d i v c l a s s =" bs −d o c s −s e c t i o n ">
<d i v c l a s s ="row">
<d i v c l a s s =" c o l −l g −12">
<d i v c l a s s =" bs −e x a m p l e t a b l e −r e s p o n s i v e ">
< t a b l e c l a s s =" t a b l e t a b l e −s t r i p e d t a b l e −b o r d e r e d t a b l e −h o v e r ">
<t h e a d >
<t r >
<t h >#</t h >
<t h >R e s s o u r c e </t h >
<t h >URL</t h >
<t h >A c t i o n s </t h >
</ t r >
</ t h e a d >
<t b o d y >
<?php f o r e a c h ( $ t p l −>m e s s a g e s a s $ m e s s a g e ) { ?>
<t r >
<t d ><?=$message −>i d ?></t d >
<t d ><?=$message −>t e x t e ?></t d >
<t d ><a h r e f =" s i t e /<?=$message −>i d ?>"><?=$message −>u r l ?></a></t d >
<t d >
<?php i f ( $ t p l −>i s a u t h ) {?>
<!−− s i on e s t c o n n e c t é u n i q u e m e n t −−><a h r e f= ’ . / ? e d i t=<?=
$message −>id ?> ’ c l a s s =" b t n b t n −x s b t n −p r i m a r y ">
M o d i f i e r </a> <a h r e f= ’ . / ? del=<?=$message −>id ?> ’ c l a s s
=" b t n b t n −x s b t n −d a n g e r "> Supprimer </a>
<?php } ?>
</t d >
</ t r >
<?php } ?>
</ t b o d y >
</ t a b l e >
</ d i v ><!−− / e x a m p l e −−>
</ d i v >
</ d i v >
</ d i v >
<!−− F o r m u l a i r e d ’ a j o u t
================================================== −−>
<div c l a s s=" bs −d o c s −s e c t i o n ">
<div c l a s s=" row ">
<div c l a s s=" c o l −l g −6">
<div c l a s s=" w e l l ">
<form id=" i n s e r t " method="POST" a c t i o n=" . / " c l a s s=" bs −e x a m p l e form−
h o r i z o n t a l ">
< f i e l d s e t>
<legend>A j o u t e z v o t r e r e s s o u r c e</ legend>
<div c l a s s=" form−g r o u p ">
<l a b e l f o r=" i n p u t E m a i l " c l a s s=" c o l −l g −2 c o n t r o l − l a b e l ">Email</ l a b e l>
<div c l a s s=" c o l −l g −10 ">
<input c l a s s=" form−c o n t r o l " name=" e m a i l " id=" e m a i l " p l a c e h o l d e r="
Email " type=" t e x t " value=" <?=(! empty ( $ t p l −>e d i t m e s s a g e −>e m a i l ) ?
$ t p l −>e d i t m e s s a g e −>e m a i l : ’ ’ ) ?>">
</ div>
</ div>
<div c l a s s=" form−g r o u p ">
<l a b e l f o r=" i n p u t P a s s w o r d " c l a s s=" c o l −l g −2 c o n t r o l − l a b e l ">URL</ l a b e l
>
<div c l a s s=" c o l −l g −10 ">
<input c l a s s=" form−c o n t r o l " name=" u r l " id=" u r l " p l a c e h o l d e r="URL"
type=" t e x t " value=" <?=(! empty ( $ t p l −>e d i t m e s s a g e −>u r l ) ? $ t p l −>
e d i t m e s s a g e −>u r l : ’ ’ ) ?>">
</ div>
</ div>
<div c l a s s=" form−g r o u p ">
<l a b e l f o r=" t e x t A r e a " c l a s s=" c o l −l g −2 c o n t r o l − l a b e l "> D e s c r i p t i f</
l a b e l>
<div c l a s s=" c o l −l g −10 ">
<textarea c l a s s=" form−c o n t r o l " name=" t e x t e " rows=" 3 " id=" t e x t e "><
?=(!empty( $ t p l −>e d i t m e s s a g e −>t e x t e ) ? $ t p l −>e d i t m e s s a g e −>t e x t e : ’ ’
)?></ textarea>
<span c l a s s=" h e l p −b l o c k ">D é c r i v e z r a p i d e m e n t l a r e s s o u r c e p a r t a g é e
.</span>
<?=(!empty( $ t p l −>e d i t m e s s a g e −>i d ) ? "<i n p u t t y p e =’ h i d d e n ’ name=’ i d ’
v a l u e =’ " . $ t p l −>e d i t m e s s a g e −>i d . " ’/> " : ’ ’ )?>
</ div>
</ div>
</ div>
</ div>
</ div>
</ div>
< f o o t e r>
<div c l a s s=" row ">
<div c l a s s=" c o l −l g −12 ">
<p>Made b y <a h r e f=" h t t p : / / t h o m a s p a r k . me/ ">Thomas Park</a> . C o n t a c t him a t
<a h r e f=" m a i l t o : h e l l o @ t h o m a s p a r k . me">h e l l o @ t h o m a s p a r k . me</a> .</p>
<p>Code l i c e n s e d u n d e r t h e <a h r e f=" h t t p : / /www . a p a c h e . o r g / l i c e n s e s /LICENSE
−2.0 ">Apache L i c e n s e v2 . 0</a> .</p>
<p>Based on <a h r e f=" h t t p : / / g e t b o o t s t r a p . com/ ">B o o t s t r a p</a> . I c o n s from <
a h r e f=" h t t p : / / f o r t a w e s o m e . g i t h u b . i o / Font−Awesome/ ">Font Awesome</a> .
Web f o n t s from <a h r e f=" h t t p : / /www . g o o g l e . com/ w e b f o n t s ">G o o g l e</a> .
F a v i c o n b y <a h r e f=" h t t p s : / / t w i t t e r . com/ g e r a l d h i l l e r ">G e r a l d H i l l e r</a>
.</p>
</ div>
</ div>
</ f o o t e r>
</ div>
</body></html>
Remarques
1. Le serveur asi-technoweb utilisé lors de la session précédente est toujours à votre disposition et est
configuré pour interpréter les scripts PHP.
2. Pour plus d’informations sur PHP : [Link]
3. Continuez à vérifier vos pages HTML et CSS sur le site du W3C ([Link]
4. À l’issu de la séance, vous aurez accès à la correction de ce TDM au format PDF.
5. Déposez votre compte-rendu sur moodle sous la forme d’un fichier PDF de 2p. (1 feuille
recto-verso) nommé [Link], chez chacune des 2 personnes du binôme.