ok
This commit is contained in:
parent
303075c495
commit
240492d94f
11 changed files with 325 additions and 36 deletions
|
@ -1,10 +1,55 @@
|
|||
<?php
|
||||
if($_SESSION['USER']->isLoggedIn()) {
|
||||
$accomodationType = ['Hôtel', 'Gîte','Camping','Villa en location'];
|
||||
$alert = '';
|
||||
if(isset($path[1])) {
|
||||
switch ($path[1]) {
|
||||
case 'add':
|
||||
if(!$_SESSION['USER']->getAccomodationId())
|
||||
{
|
||||
/*
|
||||
* Creating Accomodation
|
||||
*/
|
||||
if(isset(
|
||||
$_POST['accomodationName'],
|
||||
$_POST['postalCode'],
|
||||
$_POST['address'],
|
||||
$_POST['accomodationType']
|
||||
)){
|
||||
$availableServices = AccomodationServices::getAll();
|
||||
$re_name = '/^[a-zA-Z -\'?*éàèôê0-9"()+&]{1,}$/';
|
||||
$re_cp = '/[0-9]{5}/';
|
||||
/*
|
||||
* Checking inputs
|
||||
*/
|
||||
|
||||
|
||||
if(!preg_match($re_name, $_POST['accomodationName']) || !preg_match($re_cp, $_POST['postalCode']) || ((isset($_POST["accomodationService"]) && gettype($_POST['accomodationService']) === 'array' && array_diff($_POST["accomodationService"], $availableServices))))
|
||||
{
|
||||
$alert = alert('danger','Le formulaire est invalide');
|
||||
}else{
|
||||
if(Accomodation::insertUser($_SESSION['USER'], array(
|
||||
"name" => $_POST['accomodationName'],
|
||||
"address" => $_POST['address'],
|
||||
"postalCode" => $_POST['postalCode'],
|
||||
"type" => $_POST['accomodationType'])) != false){
|
||||
/*
|
||||
* Update users information
|
||||
*/
|
||||
$_SESSION['USER']->update();
|
||||
/*
|
||||
* Insert ok
|
||||
*/
|
||||
$accomodation = Accomodation::fetchByUser($_SESSION['USER']);
|
||||
$accomodation->setServices($_POST["accomodationService"]);
|
||||
$alert = alert('success','Ajout du logement réussi.');
|
||||
}else{
|
||||
$alert = alert('danger','Erreur lors de l\'insertion du logement.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$services = AccomodationServices::fetch();
|
||||
require_once(VIEW_PATH.$path[1] . '_' . $path[0].'.php');
|
||||
}else{
|
||||
|
@ -14,6 +59,8 @@ if($_SESSION['USER']->isLoggedIn()) {
|
|||
case 'edit':
|
||||
if($_SESSION['USER']->getAccomodationId())
|
||||
{
|
||||
$accomodation = Accomodation::fetchByuser($_SESSION['USER']);
|
||||
$services = AccomodationServices::fetch();
|
||||
require_once(VIEW_PATH.$path[1] . '_' . $path[0].'.php');
|
||||
}else{
|
||||
redirect();
|
||||
|
|
|
@ -13,7 +13,6 @@ if(!$_SESSION['USER']->isLoggedIn() && !isset($path[1])) {
|
|||
/*
|
||||
* Successful login
|
||||
*/
|
||||
|
||||
$_SESSION['USER'] = $userArray[0]; // Pass the returned User type data into Session
|
||||
redirect();
|
||||
}else{
|
||||
|
|
|
@ -20,6 +20,19 @@ class Accomodation extends Model
|
|||
}
|
||||
return $this;
|
||||
}
|
||||
public static function insertUser(User $user, $data): bool
|
||||
{
|
||||
$inserted = Accomodation::insert($data);
|
||||
if($inserted !== false){
|
||||
/*
|
||||
* User foreign key
|
||||
*/
|
||||
$query = 'UPDATE User SET AccomodationId=? WHERE email=?;';
|
||||
$q = Accomodation::$db->prepare($query);
|
||||
return ($q->execute([Accomodation::$db->lastInsertId(), $user->getEmail()]) == true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function fetchByUser(User $user)
|
||||
{
|
||||
|
@ -31,4 +44,73 @@ class Accomodation extends Model
|
|||
}
|
||||
return false;
|
||||
}
|
||||
public static function fetchById(int $id)
|
||||
{
|
||||
$data = Accomodation::fetch(array(['id','=', $id]));
|
||||
if(count($data) === 1){
|
||||
return $data[0];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return $this->data['name'];
|
||||
}
|
||||
public function getAddress()
|
||||
{
|
||||
return $this->data['address'];
|
||||
}
|
||||
public function getPostalCode()
|
||||
{
|
||||
return $this->data['postalCode'];
|
||||
}
|
||||
public function getType()
|
||||
{
|
||||
return $this->data['type'];
|
||||
}
|
||||
public function getServices()
|
||||
{
|
||||
$out = [];
|
||||
if(isset($this->data['id'])){
|
||||
$query = 'SELECT AccomodationServicesName FROM _AccomodationServices WHERE AccomodationId = ?;';
|
||||
$q = Accomodation::$db->prepare($query);
|
||||
$q->execute([$this->data['id']]);
|
||||
forEach($q->fetchAll(PDO::FETCH_ASSOC) as $item){
|
||||
$out[] = $item['AccomodationServicesName'];
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public function setServices(array $names)
|
||||
{
|
||||
/*
|
||||
* Clear & Add
|
||||
*/
|
||||
if(isset($this->data['id'])){
|
||||
$query = 'DELETE FROM _AccomodationServices WHERE AccomodationId = ?;';
|
||||
$q = Accomodation::$db->prepare($query);
|
||||
if($q->execute([$this->data['id']])){
|
||||
/*
|
||||
* Add
|
||||
*/
|
||||
if(!empty($names)){
|
||||
$args = [];
|
||||
$insertquery = 'INSERT INTO _AccomodationServices VALUES ';
|
||||
$s = array_fill(0, count($names), '(?,?)');
|
||||
$insertquery .= join(',', $s) . ';';
|
||||
forEach($names as $name){
|
||||
$args[] = $this->data['id'];
|
||||
$args[] = $name;
|
||||
}
|
||||
$q = Accomodation::$db->prepare($insertquery);
|
||||
return ($q->execute($args) == true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -20,6 +20,14 @@ class AccomodationServices extends Model
|
|||
}
|
||||
return $this;
|
||||
}
|
||||
public static function getAll(): array
|
||||
{
|
||||
$out = [];
|
||||
forEach(AccomodationServices::fetch() as $item){
|
||||
$out[] = $item->getName();
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
public function getName(): string
|
||||
{
|
||||
|
|
34
src/func.php
34
src/func.php
|
@ -1,4 +1,19 @@
|
|||
<?php
|
||||
/*
|
||||
* Getters
|
||||
*/
|
||||
function getGet($name, $default = NULL){
|
||||
if(isset($_GET[$name])){
|
||||
return $_GET[$name];
|
||||
}
|
||||
return $default;
|
||||
}
|
||||
function getPost($name, $default = NULL){
|
||||
if(isset($_POST[$name])){
|
||||
return $_POST[$name];
|
||||
}
|
||||
return $default;
|
||||
}
|
||||
/*
|
||||
* URL & Redirection
|
||||
*/
|
||||
|
@ -15,10 +30,27 @@ function redirect($route = WEBSITE_DEFAULT_PATH){
|
|||
function assetsPath($path, $level = 0){
|
||||
return str_repeat('../', $level) . $path;
|
||||
}
|
||||
# Alert generator
|
||||
function alert($status , $msg){
|
||||
switch($status){
|
||||
case 'primary':
|
||||
case 'secondary':
|
||||
case 'success':
|
||||
case 'danger':
|
||||
case 'warning':
|
||||
case 'info':
|
||||
case 'light':
|
||||
case 'dark':
|
||||
return "<div class='alert alert-" .$status. "' role='alert'>" .htmlspecialchars($msg). "</div>";
|
||||
break;
|
||||
default:
|
||||
throw new \Exception("Status d'alerte invalide");
|
||||
}
|
||||
}
|
||||
# Navbar button render
|
||||
function navItem($name, $path){
|
||||
$acc = '';
|
||||
if(($_SERVER['REDIRECT_URL'] === WEBSITE_PATH . $path) || ($path === ($_SERVER["REQUEST_SCHEME"] . '://' . $_SERVER["SERVER_NAME"] . $_SERVER["REDIRECT_URL"]))){
|
||||
if(($_SERVER['REQUEST_URI'] === WEBSITE_PATH . $path) || ($path === ($_SERVER["REQUEST_SCHEME"] . '://' . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]))){
|
||||
$acc = 'active';
|
||||
}
|
||||
return '<li class="nav-item"><a class="nav-link ' .$acc. '" aria-current="page" href="' .htmlspecialchars($path). '">' .htmlspecialchars($name). '</a></li>';
|
||||
|
|
|
@ -18,12 +18,12 @@ class Model {
|
|||
Model::$db = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD);
|
||||
Model::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
} catch(Exception $e){
|
||||
var_dump($e);
|
||||
die($e);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* GET/SELECT Query
|
||||
* Fetch
|
||||
*/
|
||||
public static function fetch($filters = []): array
|
||||
{
|
||||
|
@ -55,6 +55,35 @@ class Model {
|
|||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert
|
||||
*/
|
||||
public static function insert($data){
|
||||
$query = 'INSERT INTO ' . get_called_class() . ' (';
|
||||
$_col = get_called_class()::getColumns();
|
||||
$c = 0;
|
||||
$args = [];
|
||||
if($data !== null){
|
||||
forEach($data as $key=>$value){
|
||||
if(!key_exists($key, $_col)){
|
||||
throw new Exception('Invalid data entry: ' . $key);
|
||||
}else{
|
||||
$args[] = $value;
|
||||
if($c+1 === sizeof($data)){
|
||||
$query .= $key . ') VALUES ( ' . join(',',array_fill(0, sizeof($data), '?')) . ' );';
|
||||
}else{
|
||||
$query .= $key . ', ';
|
||||
}
|
||||
$c++;
|
||||
}
|
||||
}
|
||||
$q = Model::$db->prepare($query);
|
||||
return ($q->execute($args) == true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function getColumns(): array
|
||||
{
|
||||
if(!isset(get_called_class()::$column[get_called_class()])) {
|
||||
|
|
|
@ -8,31 +8,34 @@ require_once('template/head.php');
|
|||
<div class="container-fluid section">
|
||||
<form action="" method="POST">
|
||||
<div class="row justify-content-md-center">
|
||||
<?=$alert?>
|
||||
<div class="col col-lg-3">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Donnez un nom à votre hebergement</label>
|
||||
<input type="text" class="form-control" name="accomodationName" id="accomodationName" aria-describedby="accomodationName" placeholder="Enter a name">
|
||||
<small id="accomodationName" class="form-text text-muted">We'll never share your email with anyone else.</small>
|
||||
<input type="text" class="form-control" name="accomodationName" id="accomodationName" aria-describedby="accomodationName" placeholder="Le X" value="<?=htmlspecialchars(getPost('accomodationName'))?>">
|
||||
<!-- <small id="accomodationName" class="form-text text-muted">We'll never share your email with anyone else.</small> -->
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="exampleInputPassword1">Password</label>
|
||||
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
|
||||
<label for="exampleInputPassword1">Code Postal</label>
|
||||
<input type="text" class="form-control" name="postalCode" id="postalCode" placeholder="69100" value="<?=htmlspecialchars(getPost('postalCode'))?>">
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="exampleCheck1">
|
||||
<label class="form-check-label" for="exampleCheck1">Check me out</label>
|
||||
<div class="form-group">
|
||||
<label for="exampleInputPassword1">Adresse</label>
|
||||
<input type="text" class="form-control" name="address" id="address" placeholder="" value="<?=htmlspecialchars(getPost('address'))?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-auto"></div>
|
||||
<div class="col col-lg-3">
|
||||
<div class="form-group">
|
||||
<label for="typeSelect">Sélectionnez un type d'hébergement</label>
|
||||
<select class="form-control" id="typeSelect">
|
||||
<option>Hôtel</option>
|
||||
<option>2</option>
|
||||
<option>3</option>
|
||||
<option>4</option>
|
||||
<option>5</option>
|
||||
<select class="form-control" name="accomodationType" id="typeSelect">
|
||||
<?php
|
||||
foreach ($accomodationType as $type){
|
||||
?>
|
||||
<option><?=$type?></option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
|
@ -42,13 +45,13 @@ require_once('template/head.php');
|
|||
foreach ($services as $service){
|
||||
$c++;
|
||||
?><div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="checkbox" id="inlineCheckbox<?=$c?>" value="<?=htmlspecialchars($service->getName())?>">
|
||||
<input class="form-check-input" type="checkbox" name='accomodationService[]' id="inlineCheckbox<?=$c?>" value="<?=htmlspecialchars($service->getName())?>">
|
||||
<label class="form-check-label" for="inlineCheckbox<?=$c?>"><?=htmlspecialchars($service->getName())?></label>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div><br>
|
||||
<button type="submit" class="btn btn-primary">Ajouter</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,7 +1,62 @@
|
|||
<?php
|
||||
require_once('template/head.php');
|
||||
?>
|
||||
|
||||
<div class="container-fluid section">
|
||||
<h1>Bienvenue M. <?=htmlspecialchars(strtoupper($_SESSION['USER']->getLastName()))?>,</h1>
|
||||
<h2>Ici vous pouvez éditer votre hébérgement.</h2>
|
||||
</div>
|
||||
<div class="container-fluid section">
|
||||
<form action="" method="POST">
|
||||
<div class="row justify-content-md-center">
|
||||
<?=$alert?>
|
||||
<div class="col col-lg-3">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Donnez un nom à votre hebergement</label>
|
||||
<input type="text" class="form-control" name="accomodationName" id="accomodationName" aria-describedby="accomodationName" placeholder="Le X" value="<?=htmlspecialchars($accomodation->getName())?>">
|
||||
<!-- <small id="accomodationName" class="form-text text-muted">We'll never share your email with anyone else.</small> -->
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="exampleInputPassword1">Code Postal</label>
|
||||
<input type="text" class="form-control" name="postalCode" id="postalCode" placeholder="69100" value="<?=htmlspecialchars($accomodation->getPostalCode())?>">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="exampleInputPassword1">Adresse</label>
|
||||
<input type="text" class="form-control" name="address" id="address" placeholder="" value="<?=htmlspecialchars($accomodation->getAddress())?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-auto"></div>
|
||||
<div class="col col-lg-3">
|
||||
<div class="form-group">
|
||||
<label for="typeSelect">Sélectionnez un type d'hébergement</label>
|
||||
<select class="form-control" name="accomodationType" id="typeSelect">
|
||||
<?php
|
||||
foreach ($accomodationType as $type){
|
||||
?>
|
||||
<option<?php if($type === $accomodation->getType()){ echo ' selected="selected"'; } ?>><?=$type?></option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="typeSelect">Quels services proposez-vous ?</label><br>
|
||||
<?php
|
||||
$c = 0;
|
||||
foreach ($services as $service){
|
||||
$c++;
|
||||
?><div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="checkbox" name='accomodationService[]' id="inlineCheckbox<?=$c?>" value="<?=htmlspecialchars($service->getName())?>">
|
||||
<label class="form-check-label" for="inlineCheckbox<?=$c?>"><?=htmlspecialchars($service->getName())?></label>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div><br>
|
||||
<button type="submit" class="btn btn-primary">Ajouter</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
require_once('template/footer.php');
|
||||
?>
|
|
@ -1,5 +1,6 @@
|
|||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
|
||||
integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
|
||||
crossorigin="anonymous"></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.js"
|
||||
></script>
|
||||
</body>
|
||||
</html>
|
|
@ -6,8 +6,21 @@
|
|||
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<link rel="stylesheet" href="<?=assetsPath("assets/css/main.css", $assetsLevel);?>">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
|
||||
integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
||||
<!-- Font Awesome -->
|
||||
<link
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<!-- Google Fonts -->
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<!-- MDB -->
|
||||
<link
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<title> - <?= WEBSITE_NAME ?></title>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
?>
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="#"><?= WEBSITE_NAME; ?></a>
|
||||
<a class="navbar-brand" href="<?=genURL('index');?>"><?= WEBSITE_NAME; ?></a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarText"
|
||||
aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
|
@ -17,6 +17,7 @@
|
|||
if(!$_SESSION['USER']->getAccomodationId()){
|
||||
echo navItem('Ajout Hebergement',genURL('accomodation/add'));
|
||||
} else {
|
||||
echo navItem('Gestion des disponibilités', genURL('accomodation/date'));
|
||||
echo navItem('Edition de l\'hebergement', genURL('accomodation/edit'));
|
||||
}
|
||||
break;
|
||||
|
@ -28,17 +29,36 @@
|
|||
echo navItem('Login',genURL('login'));
|
||||
}
|
||||
?>
|
||||
|
||||
</ul>
|
||||
<span class="navbar-text">
|
||||
<?php
|
||||
if($_SESSION['USER']->isLoggedIn()){
|
||||
?>
|
||||
M. <?=htmlspecialchars(strtoupper($_SESSION['USER']->getLastName()))?> <?=htmlspecialchars($_SESSION['USER']->getFirstName())?>
|
||||
<a href="<?=genURL('logout')?>">Déconnexion</a>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</span>
|
||||
<?php
|
||||
if($_SESSION['USER']->isLoggedIn()){
|
||||
?>
|
||||
<ul class="navbar-nav d-flex flex-row">
|
||||
<li class="nav-item me-3 me-lg-0 dropdown">
|
||||
<a
|
||||
class="nav-link dropdown-toggle"
|
||||
href="#"
|
||||
id="navbarDropdown"
|
||||
role="button"
|
||||
data-mdb-toggle="dropdown"
|
||||
aria-expanded="false"
|
||||
>
|
||||
<i class="fas fa-user"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
|
||||
<li><h6 class="dropdown-header"><?=htmlspecialchars(strtoupper($_SESSION['USER']->getLastName()))?> <?=htmlspecialchars($_SESSION['USER']->getFirstName())?></h6></li>
|
||||
<!-- <li><h6 class="dropdown-header"><?=htmlspecialchars(strtoupper($_SESSION['USER']->getType()))?></h6></li> -->
|
||||
<li><hr class="dropdown-divider" /></li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="<?=genURL('logout')?>">Déconnexion</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
Reference in a new issue