Request class and begin Frontend. #3
182
public/assets/css/style.css
Normal file
182
public/assets/css/style.css
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
/* Sommaire :
|
||||||
|
- body et html
|
||||||
|
- Header et ses contenues
|
||||||
|
- Body contenue
|
||||||
|
- Content
|
||||||
|
- Page de présentation des recettes
|
||||||
|
- Page d'une recette
|
||||||
|
- Footer
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*Tout*/
|
||||||
|
html, body{
|
||||||
|
height: 100%;
|
||||||
|
text-align: center;
|
||||||
|
/*font-size: 98%;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*Header et son contenu*/
|
||||||
|
#header {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
padding: 3px;
|
||||||
|
padding-left: 2%;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
background-color: blanchedalmond;
|
||||||
|
}
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
background-color: aqua;
|
||||||
|
background-image: url("Logo.jpg");
|
||||||
|
/*background:no-repeat;*/
|
||||||
|
height: 103px;
|
||||||
|
width: 141px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo{
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
border: 1px white solid;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 1px 1px 1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
flex: 9;
|
||||||
|
text-align: initial;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-list {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background-color: rgb(255, 217, 160);
|
||||||
|
display: flex;
|
||||||
|
border: 1px solid rgba(0,0,0,.125);
|
||||||
|
border-radius: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.nav-element {
|
||||||
|
line-height: 2.5;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Body et son contenu */
|
||||||
|
body {
|
||||||
|
background-color: blanchedalmond;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
background-color: aquamarine;
|
||||||
|
border: 1px solid rgba(0,0,0,.125);
|
||||||
|
border-radius: 10px;
|
||||||
|
width: 128px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.main-body {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
overflow: auto;
|
||||||
|
flex: 1;
|
||||||
|
background-clip: border-box;
|
||||||
|
padding-right: 5%;
|
||||||
|
padding-left: 5%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* content : le cadre de base du centre de notre site
|
||||||
|
*/
|
||||||
|
.content {
|
||||||
|
background-color: #ffe4bb;
|
||||||
|
text-align: left;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 1px solid rgba(0,0,0,.125);
|
||||||
|
border-radius: 6px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Recettes :
|
||||||
|
représente le contenue centrale de la page.
|
||||||
|
*/
|
||||||
|
.recettes {
|
||||||
|
--UneVariable: calc( 100vw / 500 );
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(var(--UneVariable), 1fr);
|
||||||
|
grid-gap: 10px;
|
||||||
|
grid-auto-rows: minmax(300px, auto);
|
||||||
|
grid-auto-columns: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Classe recette icone :
|
||||||
|
C'est la classe de chaques éléments de notre liste de recette
|
||||||
|
*/
|
||||||
|
.recette-icone{
|
||||||
|
border: 3px solid rgba(0,0,0,.125);
|
||||||
|
border-radius: 40px;
|
||||||
|
text-align: left;
|
||||||
|
padding: 15px;
|
||||||
|
vertical-align: middle;
|
||||||
|
box-shadow: 3px 5px 5px black;
|
||||||
|
width: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recette-preview-image{
|
||||||
|
max-width: calc( 10vh + 10vw );
|
||||||
|
max-height: calc( 10vh + 10vw );
|
||||||
|
border: 1px solid rgb(252, 223, 57);
|
||||||
|
border-radius: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Ici commence le CSS pour la page de chaques recettes */
|
||||||
|
/*contenue*/
|
||||||
|
.recette-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*titre*/
|
||||||
|
.recette-title {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*image*/
|
||||||
|
.recette-image {
|
||||||
|
background-color: red;
|
||||||
|
aspect-ratio: 1/1;
|
||||||
|
max-height: calc( 30vh + 30vw );
|
||||||
|
max-width: calc( 30vh + 30vw );
|
||||||
|
border: 1px solid white;
|
||||||
|
border-radius: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recette-div-image {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*description*/
|
||||||
|
.recette-desc {
|
||||||
|
padding : 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*Footer et son contenue*/
|
||||||
|
footer{
|
||||||
|
padding: 25px;
|
||||||
|
background: rgb(11, 189, 144);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
public/assets/images/Logo.jpg
Normal file
BIN
public/assets/images/Logo.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 141 KiB |
16
src/Domain/Recettes/RecettesAPIController.php
Normal file
16
src/Domain/Recettes/RecettesAPIController.php
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domain\Recettes;
|
||||||
|
|
||||||
|
use App\Domain\Controller;
|
||||||
|
|
||||||
|
class RecettesAPIController extends Controller {
|
||||||
|
|
||||||
|
public static function defineRoutes(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
self::Route( routeUrl: '/api/recettes/list', routeName: 'api->recettes->list', routeAction: 'list', routeMethods: ['POST'] ),
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
24
src/Domain/Recettes/RecettesController.php
Normal file
24
src/Domain/Recettes/RecettesController.php
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domain\Recettes;
|
||||||
|
|
||||||
|
use App\Domain\Controller;
|
||||||
|
use App\Http\JSONResponse;
|
||||||
|
use App\Infrastructure\View;
|
||||||
|
|
||||||
|
class RecettesController extends Controller {
|
||||||
|
|
||||||
|
public static function defineRoutes(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
self::Route( routeUrl: '/recettes', routeName: 'recettes->index', routeAction: 'index', pageHeadTitle: 'Liste des recettes' ),
|
||||||
|
self::Route( routeUrl: '/recettes/{string}', routeName: 'recettes->show', routeAction: 'show', pageHeadTitle: 'Recette' ),
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index(): View {
|
||||||
|
return new View( 'recettes/index', [] );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
17
src/Domain/Recettes/RecettesManagementController.php
Normal file
17
src/Domain/Recettes/RecettesManagementController.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domain\Recettes;
|
||||||
|
|
||||||
|
use App\Domain\Controller;
|
||||||
|
|
||||||
|
class RecettesManagementController extends Controller {
|
||||||
|
|
||||||
|
public static function defineRoutes(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
self::Route( routeUrl: '/recettes/create', routeName: 'recettes->create', routeAction: 'create' ),
|
||||||
|
self::Route( routeUrl: '/recettes/edit/{int}', routeName: 'recettes->edit', routeAction: 'edit' ),
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
57
src/Domain/Utilisateurs/AuthentificationController.php
Normal file
57
src/Domain/Utilisateurs/AuthentificationController.php
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domain\Utilisateurs;
|
||||||
|
|
||||||
|
use App\Domain\Controller;
|
||||||
|
use App\Helpers\Authentification;
|
||||||
|
use App\Http\JSONResponse;
|
||||||
|
use App\Http\Request;
|
||||||
|
|
||||||
|
class AuthentificationController extends Controller {
|
||||||
|
|
||||||
|
public static function defineRoutes(): array {
|
||||||
|
|
||||||
|
return [
|
||||||
|
|
||||||
|
// Public routes.
|
||||||
|
self::Route( routeUrl: '/login', routeName: 'login', routeAction: 'loginForm', pageHeadTitle: 'Connexion' ),
|
||||||
|
|
||||||
|
// API Routes.
|
||||||
|
self::Route( routeUrl: '/api/auth', routeName: 'api->auth', routeAction: 'auth', routeMethods: ['POST'] ),
|
||||||
|
self::Route( routeUrl: '/api/auth/logout', routeName: 'api->auth->logout', routeAction: 'logout', routeMethods: ['POST'] ),
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function login(): View {
|
||||||
|
return new View( 'login' );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auth(): JSONResponse {
|
||||||
|
|
||||||
|
Request::setCORS();
|
||||||
|
|
||||||
|
$username = Request::get( 'username' );
|
||||||
|
$password = Request::get( 'password' );
|
||||||
|
|
||||||
|
// TODO : Récupération de l'utilisateur et verify_password.
|
||||||
|
|
||||||
|
$userId = 1;
|
||||||
|
Authentification::loginUser( $userId );
|
||||||
|
JSONResponse::sendSuccess( [ 'user_id' => $userId ] );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function logout(): JSONResponse {
|
||||||
|
|
||||||
|
if( !Authentification::isLoggedIn() ) {
|
||||||
|
return JSONResponse::sendError( [ 'message' => 'Alrady disconnected' ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
Authentification::destroySession();
|
||||||
|
return JSONResponse::sendSuccess( [ 'message' => 'Logged out' ] );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
49
src/Helpers/Authentification.php
Normal file
49
src/Helpers/Authentification.php
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Helpers;
|
||||||
|
|
||||||
|
class Authentification {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de démarrer la variable Session.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function startSession(): void {
|
||||||
|
session_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de supprimer la session.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function destroySession(): void {
|
||||||
|
session_destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de connecter un utilisateur.
|
||||||
|
*
|
||||||
|
* @param int $userId
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function loginUser( int $userId ){
|
||||||
|
$_SESSION['user'] = $userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO : Complete when user.
|
||||||
|
public static function getCurrentUser() {
|
||||||
|
return $_SESSION['user'] ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de savoir si un utilisateur est connecté ou pas.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function isLoggedIn(): bool {
|
||||||
|
return self::getCurrentUser() !== false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
<?php
|
|
||||||
27
src/Helpers/SanitizeTrait.php
Normal file
27
src/Helpers/SanitizeTrait.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Helpers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trait qui permet de désinfecter une variable.
|
||||||
|
*/
|
||||||
|
trait SanitizeTrait {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de désinfecter une variable
|
||||||
|
*
|
||||||
|
* @param mixed $data
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function sanitize( mixed $data ): mixed {
|
||||||
|
|
||||||
|
if( is_string( $data ) ) {
|
||||||
|
return htmlspecialchars( $data, ENT_QUOTES );
|
||||||
|
} else if( is_integer( $data ) ) {
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
51
src/Http/JSONResponse.php
Normal file
51
src/Http/JSONResponse.php
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de renvoyer une réponse de route au format JSON.
|
||||||
|
*/
|
||||||
|
class JSONResponse {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Les données ajoutés au fichier JSON.
|
||||||
|
* @var array|mixed
|
||||||
|
*/
|
||||||
|
public private(set) array $data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Le code HTML de la réponse.
|
||||||
|
* @var int|mixed
|
||||||
|
*/
|
||||||
|
public private(set) int $htmlCode;
|
||||||
|
|
||||||
|
public function __construct( $data = [], $code = 200 ){
|
||||||
|
|
||||||
|
$this->data = $data;
|
||||||
|
$this->htmlCode = $code;
|
||||||
|
|
||||||
|
$this->returnResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function returnResponse(): never {
|
||||||
|
|
||||||
|
header( 'Content-type: application/json' );
|
||||||
|
http_response_code( $this->htmlCode );
|
||||||
|
|
||||||
|
$this->data['_status'] = $this->htmlCode;
|
||||||
|
$json = json_encode( $this->data );
|
||||||
|
echo $json;
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function sendSuccess( $data = [] ): self {
|
||||||
|
$data['success'] = true;
|
||||||
|
return new self( $data, 200 );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function sendError( $data = [] ): self {
|
||||||
|
$data['success'] = false;
|
||||||
|
return new self( $data, 400 );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
53
src/Http/Request.php
Normal file
53
src/Http/Request.php
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http;
|
||||||
|
use App\Helpers\SanitizeTrait;
|
||||||
|
use App\Kernel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe utilitaire ayant plusieurs méthodes pour gérer la requête actuelle.
|
||||||
|
*/
|
||||||
|
class Request {
|
||||||
|
|
||||||
|
use SanitizeTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bloquer les CORS venant d'autres sites.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setCORS(): void {
|
||||||
|
$siteUrl = Kernel::$configs['general']['website_url'];
|
||||||
|
header("Access-Control-Allow-Origin: {$siteUrl}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet d'obtenir une variable GET et nettoyé.
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function get( string $name ): mixed {
|
||||||
|
|
||||||
|
if( !isset( $_GET[$name] ) ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::sanitize( $_GET[$name] );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet d'obtenir une variable POST et nettoyé.
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function post( string $name ): mixed {
|
||||||
|
|
||||||
|
if( !isset( $_POST[$name] ) ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::sanitize( $_POST[$name] );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -192,4 +192,8 @@ final class Router {
|
|||||||
return Kernel::$configs['general']['website_url'];
|
return Kernel::$configs['general']['website_url'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getAssetURL( string $assetPath ): string {
|
||||||
|
return Kernel::$configs['general']['website_url'] . 'assets/' . $assetPath;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -207,4 +207,14 @@ final class View {
|
|||||||
echo Router::getRouteURL( $routeName, ...$args );
|
echo Router::getRouteURL( $routeName, ...$args );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet d'obtenir l'URL vers un asset (CSS,JS,Images).
|
||||||
|
* @param string $assetPath
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function assetUrl( string $assetPath ): void {
|
||||||
|
echo Router::getAssetURL( $assetPath );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace App;
|
namespace App;
|
||||||
use App\Exceptions\ConfigFailedLoadingException;
|
use App\Exceptions\ConfigFailedLoadingException;
|
||||||
use App\Exceptions\InvalidRouteException;
|
use App\Exceptions\InvalidRouteException;
|
||||||
|
use App\Helpers\Authentification;
|
||||||
use App\Helpers\AutoLoader;
|
use App\Helpers\AutoLoader;
|
||||||
use App\Helpers\ConfigFactory;
|
use App\Helpers\ConfigFactory;
|
||||||
use App\Http\Router;
|
use App\Http\Router;
|
||||||
@@ -62,6 +63,8 @@ final class Kernel {
|
|||||||
$this->buildAutoloader();
|
$this->buildAutoloader();
|
||||||
$this->loadConfig();
|
$this->loadConfig();
|
||||||
|
|
||||||
|
Authentification::startSession();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Router::routeTo();
|
Router::routeTo();
|
||||||
} catch ( InvalidRouteException $e ){
|
} catch ( InvalidRouteException $e ){
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
<?php V::partial( 'header' ); ?>
|
<?php V::partial( 'header' ); ?>
|
||||||
|
|
||||||
<?php V::inject( 'content'); ?>
|
<div class="main-body">
|
||||||
|
<?php V::inject( 'content'); ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php V::partial( 'footer' ); ?>
|
<?php V::partial( 'footer' ); ?>
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
<?php use App\Infrastructure\View as V; ?>
|
<?php use App\Infrastructure\View as V; ?>
|
||||||
|
|
||||||
|
<footer id="footer">
|
||||||
|
<div class="src">
|
||||||
|
<a href="google.com">Une source</a>
|
||||||
|
</div>
|
||||||
|
<div class="Contact">
|
||||||
|
Front end : Bousquet Sébastien
|
||||||
|
--- Back end : Thorel Benjamin
|
||||||
|
--- Base de donné : Glaudis Jordan
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -5,5 +5,19 @@
|
|||||||
<head>
|
<head>
|
||||||
<title><?php echo V::getHeadTitle(); ?></title>
|
<title><?php echo V::getHeadTitle(); ?></title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="stylesheet" href="<?php V::assetUrl( 'css/style.css' ); ?>" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<header id="header">x
|
||||||
|
<div id="logo">
|
||||||
|
<a href="index.php">
|
||||||
|
<img src="<?php V::assetUrl( 'images/Logo.jpg' ); ?>" class="logo">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-list">
|
||||||
|
<li><a id="google" class="nav-element" href="google.com">Google</a></li>
|
||||||
|
<li><a id="unTest" class="nav-element" href="bing.com">Bing</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|||||||
20
views/recettes/index.php
Normal file
20
views/recettes/index.php
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?php use App\Infrastructure\View as V; ?>
|
||||||
|
|
||||||
|
<div class="sidebar"> une sidebar</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="recettes">
|
||||||
|
<a href="recette-en-dur.php">
|
||||||
|
<div class="recette-icone">
|
||||||
|
<img class="recette-preview-image" src="random-recette.jpg">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<div class="recette-icone"> 2 </div>
|
||||||
|
<div class="recette-icone"> 3 </div>
|
||||||
|
<div class="recette-icone"> 4 </div>
|
||||||
|
<div class="recette-icone"> 5 </div>
|
||||||
|
<div class="recette-icone"> 6 </div>
|
||||||
|
<div class="recette-icone"> 7 </div>
|
||||||
|
<div class="recette-icone"> 8 </div>
|
||||||
|
<div class="recette-icone"> 9 </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user