Compare commits

...

27 Commits

Author SHA1 Message Date
poka 88072b2f8d fix 2020-10-24 02:12:28 +02:00
nox 1d9249483a Finalisation de la création des antennes dans Tableau de bord Admin 2020-02-23 02:38:32 +01:00
nox 034ceec279 Finalisation de la modification d'une antenne - Ajout des lignes de présentation de l'antenne dans la page Produits 2020-02-04 23:35:27 +01:00
nox 5aec7c62ec Correction bug sur accès au répertoire /src/Antenne/views 2020-01-27 14:12:52 +01:00
nox 600786d914 Avancement sur Modification d'une antenne - Reglage des selects imbriques 2020-01-27 03:56:05 +01:00
nox b9d7376869 Avancement sur modification d'une antenne - Champ select antenne et région 2020-01-26 01:59:59 +01:00
nox 5ebbf9d7d2 Avancement sur gestion des antennes - Formulaire de modification 2020-01-25 01:35:00 +01:00
nox bd626f62e5 Avancement sur la gestion du suivi Antennes. Ajout de la checkbox dans Produits 2020-01-15 01:08:50 +01:00
nox 0ab166726c Ajustement de la deconnexion et du desaffichage de l'utilisateur qui etait connecte 2020-01-06 01:36:42 +01:00
nox 2a01413fab Affichage de l'utilisateur connecté correct en connexion modale ou autre 2020-01-05 04:16:48 +01:00
nox 72fb941a18 Finalisation de l'affichage de l'utilisateur connecté en mode modal ou non modal 2020-01-02 22:27:28 +01:00
nox 8c32377738 Renvoi mot de passe via Profil user opérationnel et avancement sur connexion via fenêtre modale 2019-12-29 03:03:50 +01:00
nox 025d0a2cad Renvoi du mot de passe dans tableau de bord User opérationnel 2019-12-28 01:48:42 +01:00
nox bf65d62297 Gestion du statut actif/inactif des users - Ajout des sessions pour twig 2019-12-23 02:09:54 +01:00
nox 37468993f6 Avancement sur droits d'accès à l'url dashboard/user 2019-12-10 14:29:27 +01:00
nox 502586ae49 Avancement sur renvoi mot de passe dans Dashboard User 2019-12-10 04:36:49 +01:00
nox e19b374ddd Merge backend-admin sur branche master 2019-12-09 23:22:09 +01:00
nox 9096865ecb Merge branch 'backend-user' 2019-12-09 22:46:36 +01:00
nox 623b19631e Merge master sur backend-admin 2019-12-09 22:12:30 +01:00
nox af2257b796 Correction redirection suite login depuis url /login 2019-12-09 16:06:21 +01:00
nox 2b881fd7c5 Correction connexion user pour url /login 2019-12-09 16:02:52 +01:00
nox 2f0b22e26e Ajout fonction actif/inactif dans tableau de bord User 2019-12-09 15:35:12 +01:00
nox ef9e63d898 Avancement sur Tableau de bord Admin et User 2019-12-09 01:02:34 +01:00
nox 2f38ff0776 Mise en place du tableau de bord Admin - Etape 1 2019-12-02 22:49:12 +01:00
nox 55c85b29b8 Réglage en cours de l'affichage du user connecté 2019-11-30 21:18:45 +01:00
nox 85d55df6fe Merge master 2019-11-26 00:07:51 +01:00
nox 473a16c5b0 Nouvel écran profil-utilisateur 2019-11-25 23:46:20 +01:00
70 changed files with 2348 additions and 457 deletions

5
.gitignore vendored
View File

@ -1,10 +1,11 @@
config/config.php
config/config-backup.php
scripts/.loc_hash
.idea
public/uploads/*
!public/uploads/default.png
/tmp
tmp
vendor
composer.json
composer.lock
/src/Framework/SwiftMailerFactory.php
src/Framework/SwiftMailerFactory.php

View File

@ -2,6 +2,7 @@
include 'config.php';
use App\Framework\Twig\UrlExtension;
use App\Framework\Twig\VariableExtension;
use Framework\Middleware\CsrfMiddleware;
use Framework\Renderer\RendererInterface;
use Framework\Renderer\TwigRendererFactory;
@ -29,7 +30,8 @@ return [
\DI\get(FlashExtension::class),
\DI\get(FormExtension::class),
\DI\get(CsrfExtension::class),
\DI\get(UrlExtension::class)
\DI\get(UrlExtension::class),
\DI\get(VariableExtension::class)
],
SessionInterface::class => \DI\object(PHPSession::class),
CsrfMiddleware::class => \DI\object()->constructor(\DI\get(SessionInterface::class)),
@ -48,6 +50,6 @@ return [
},
// MAILER
'mail.to' => 'admin@gmarche-testmail.com',
'mail.from' => '$mail_from',
'mail.from' => "$mail_from",
Swift_Mailer::class => \DI\factory(\Framework\SwiftMailerFactory::class)
];

7
public/css/jquery-ui.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -116,12 +116,6 @@ header.header img {
border: 0px;
}
.profil_user {
height: 400px;
width: 900px;
background-color: lightgray;
text-align: center;
}
.records_content th, .records_content2 th {
background-color: lightgray;
color: rgba(0,0,0,0.85);
@ -131,6 +125,17 @@ header.header img {
margin: 5px auto;
text-align: center;
}
/******************************************************************/
/* profil.twig */
/******************************************************************/
.profil_user {
background-color: lightgray;
text-align: center;
margin-top:5px;
padding-bottom: 2rem;
padding-right: 3rem;
}
/******************************************************************/
/* signup.twig */
/******************************************************************/
@ -162,18 +167,24 @@ header.header img {
display: block;
margin: auto;
}
/******************************************************************/
/* dashboard.twig et dashboard-user.twig */
/******************************************************************/
.tab-de-bord {
background-color: brown;
padding: 1rem;
min-width: 380px;
}
/******************************************************************/
/* layout.twig */
/******************************************************************/
.mdp_oublie:hover {
background-color: deepskyblue;
}
/******************************************************************/
/* LOADING PUBKEY */
/******************************************************************/
#cle_pub {
display: none;
}
@ -195,7 +206,17 @@ body.loading .loadingPubkey {
/* POUR MOBILES */
/******************************************************************/
@media only screen and (max-width:560px) {
/******************************************************************/
/* dashboard.twig */
/******************************************************************/
.tab-de-bord {
background-color: brown;
padding: 1rem;
min-width: 290px;
}
/******************************************************************/
/* layout.twig */
/******************************************************************/
.fond {
background-color: black;
background-image: url("../images/bildreich_1275.jpg");

View File

@ -21,6 +21,7 @@ use Middlewares\Whoops;
chdir(dirname(__DIR__));
require 'vendor/autoload.php';
$chemin = $_SERVER['DOCUMENT_ROOT'];
$chemin_new = substr($chemin,0,-6);
@ -34,18 +35,14 @@ $app = (new \Framework\App( $chemin_new .'config/apply.php'))
$container = $app->getContainer();
// Pose un problème
//$container->get(\Framework\Router::class)->get('/', \App\Gmarche\Actions\RegionIndexAction::class, 'home');
$app->pipe(Whoops::class);
$app->pipe(TrailingSlashMiddleware::class);
$app->pipe(\App\Auth\ForbiddenMiddleware::class);
// admin pose problème
//$app->pipe(
// $container->get('admin.prefix'),
// $container->get(RoleMiddlewareFactory::class)->makeForRole('admin')
// );
$app->pipe(
$container->get('admin.prefix'),
$container->get(RoleMiddlewareFactory::class)->makeForRole('0','1')
);
$app->pipe(MethodMiddleware::class)
->pipe(RendererRequestMiddleware::class)

35
public/js/avatar.js Normal file
View File

@ -0,0 +1,35 @@
$(document).ready(function () {
var nom_connecte = $("#nom_connecte").text();
document.querySelector('#avatar').addEventListener('change', function() {
//alert('ok');
// alert(this.files[0].name);
});
$('#avatar').change(function(){
var fda = new FormData();
//var input = $('#avatar').files[0];
//var file = $('#avatar').files[0].name;
//alert(file);
let files_avatar = $('#avatar')[0].files[0];
fda.append('avatar',files_avatar);
fda.append('nom_user',nom_connecte);
// requête AJAX pour copier la photo et l'afficher
$.ajax({
url: '/models/upload_avatar.php',
type: 'post',
data: fda,
contentType: false,
processData: false,
success: function(response){
if(response != 0){
// Show image preview
$('#avatar_preview').html('');
$('#avatar_preview').append("<img src='"+response+"' width='140' height='140' style='display: inline-block;'>");
} else {
alert('L\'image n\'a pu être uploadée');
}
}
});
});
});

View File

@ -8,14 +8,19 @@ function connexion(nom_connecte, mdp, chemin) {
var result = JSON.parse(data);
// Afficher l'avatar et le nom du connecté sur la barre d'état ou message d'erreur
if (result.valide) {
$("#bouton-connexion").html('');
$("#bouton-connexion").append('<span><img src="/avatar_user.png" width="22" height="22" />');
$("#bouton-connexion").append('</span>');
$("#nom_connecte").css('display',"block");
$("#bouton-connexion").css('display',"none");
$("#avatar-user").css('display',"inline-block");
$("#avatar-user").html('');
$("#avatar-user").append('<span><img src="/avatar_user.png" width="22" height="22" />');
$("#avatar-user").append('</span>');
$("#user-connecte").css('display',"inline-block");
$("#contenu_bouton").html('');
$("#contenu_bouton").append(result.username);
$("#nom_connecte_bis").append(result.username);
$('#formulaire').attr('action', '/profil/user/'+result.username);
$("#deconnexion").css('display',"block");
$("#inscription").css('display',"none");
$("#nom_connecte").append(result.username);
// On recharge la page pour tenir compte de la connexion de l'utilisateur
window.location.reload(true);
} else {
$('.alert-danger').html('');

View File

@ -197,6 +197,21 @@ function UpdateProduitsDetails(nom_connecte) {
}
);
}
function UpdateSuiviAntenne(id_connecte, id_antenne, etat_suivi) {
$.post("/models/updateSuiviAntenne.php", {
id_connecte: id_connecte,
id_antenne: id_antenne,
etat_suivi: etat_suivi
},
function (data, status) {
// On recharge la page pour tenir compte de la connexion de l'utilisateur
//window.location.reload(true);
}
);
}
function UpdateRecherchesDetails(nom_connecte) {
var produit = $("#update_produit").val();
@ -227,17 +242,21 @@ function UpdateRecherchesDetails(nom_connecte) {
}
$(document).ready(function () {
//$('input:checkbox[name=mybox]').attr('checked',false);
// On récupère le nom de l'antenne dans l'url pour afficher les biens/services de celle-ci
var url = document.location.href;
var antenne_slug = url.split('/')[5];
var affichage_slug = url.split('/')[6];
var nom_connecte = $("#nom_connecte").text();
var nom_connecte = $("#contenu_bouton").text().trim();
if (nom_connecte == '') {
nom_connecte = $("#nom_connecte_bis").text();
nom_connecte = nom_connecte.trim();
}
if (affichage_slug == 'produits') {
$("#hidden_antenne_slug").val(antenne_slug);
readRecords(antenne_slug, nom_connecte);
var source = 'products';
} else {
} else if (affichage_slug == 'recherches') {
$("#hidden_antenne_slug_r").val(antenne_slug);
readRecords2(antenne_slug, nom_connecte);
var source = 'recherches';
@ -305,4 +324,47 @@ $(document).ready(function () {
}
});
});
/*function dump(obj) {
var out = '';
for (var i in obj) {
out += i + ": " + obj[i] + "\n";
}
alert(out);
// or, if you wanted to avoid alerts...
var pre = document.createElement('pre');
pre.innerHTML = out;
document.body.appendChild(pre)
}*/
$('#avatar').change(function(){
var fda = new FormData();
var nom_connecte = $("#nom_connecte").text();
//var file = $('#avatar').files[0].name;
//alert(file);
var test = document.getElementById('avatar');
//dump(test);
//var files_avatar = $('#avatar')[0].files[0];
fda.append('avatar',$('#avatar')[0].files[0]);
fda.append('nom_user',nom_connecte);
// requête AJAX pour copier l'avatar et l'afficher
$.ajax({
url: '/models/upload_avatar.php',
type: 'post',
data: fda,
contentType: false,
processData: false,
success: function(response){
if(response != 0){
// Show image preview
alert('ok');
$('#avatar_preview').html('');
$('#avatar_preview').append("<img src='"+response+"' width='140' height='140' style='display: inline-block;'>");
} else {
alert('L\'image n\'a pu être uploadée');
}
},
error: function(response) {
alert('erreur');
}
});
});
});

11
public/js/utils.js Normal file
View File

@ -0,0 +1,11 @@
// cleanArray supprime les éléments dupliqués
function cleanArray(array) {
var i, j, len = array.length, out = [], obj = {};
for (i = 0; i < len; i++) {
obj[array[i]] = 0;
}
for (j in obj) {
out.push(j);
}
return out;
}

View File

@ -1,22 +1,26 @@
<?php
if (!isset($_SESSION)) {
session_start();
}
include '../../config/config.php';
try {
$bdd = new \PDO("mysql:host=$db_server;dbname=$db_name", $db_username, $db_password);
if (isset($_POST['nom_connecte']) && isset($_POST['mdp']) != "") {
if (isset($_POST['nom_connecte']) && isset($_POST['mdp'])) {
$params["username"] = $_POST['nom_connecte'];
$requete = "SELECT username, password
$requete = "SELECT username, password, role
FROM users
WHERE username = :username";
$query = $bdd->prepare($requete);
$query->execute($params);
$row = $query->fetch(PDO::FETCH_ASSOC);
if (password_verify($_POST['mdp'],$row['password'])) {
session_start();
$_SESSION['user']=$row['username'];
$_SESSION['connecte'] = $row['username'];
$_SESSION['role'] = $row['role'];
$_SESSION['logout'] = false;
echo '{"valide":true,"username":"'.$row['username'].'"}';
} else {
echo '{"valide":false}';

View File

@ -1,21 +1,21 @@
<?php
session_start();
//session_start();
ini_set('display_errors', 0);
include '../../config/config.php';
$antenne_slug = $_GET['antenne_slug'];
$nom_connecte = $_SESSION['user'];
$nom_connecte = $_GET['nom_connecte'];
$bdd = new \PDO("mysql:host=$db_server;dbname=$db_name", $db_username, $db_password);
// Affichage des intitulés de colonnes
$data = '<table class="table table-bordered table-striped">
<tr style="color: black;">
<th>No.</th>
<th>Bien / service</th>
<th>Photo</th>
<th>Vendeur</th>
<th>Clé publique</th>
<th>Quantité</th>
<th>Prix en junes</th>';
<tr style="color: black;">
<th>No.</th>
<th>Bien / service</th>
<th>Photo</th>
<th>Vendeur</th>
<th>Clé publique</th>
<th>Quantité</th>
<th>Prix en junes</th>';
$params["antenne_slug"] = $antenne_slug;
$requete = "SELECT products.*, users.username, users.pubkey
@ -25,30 +25,31 @@
LEFT JOIN users
ON users.id = products.user_id
WHERE antennes.slug = :antenne_slug";
$stmt = $bdd->prepare($requete);
$stmt2 = $bdd->prepare($requete);
$stmt->execute($params);
$stmt2->execute($params);
$count = $stmt->rowCount();
$affich_actions = false;
while ($row2 = $stmt2->fetch(PDO::FETCH_ASSOC)) {
if ($row2['username'] == $nom_connecte) {
$affich_actions = true;
}
$stmt = $bdd->prepare($requete);
$stmt2 = $bdd->prepare($requete);
$stmt->execute($params);
$stmt2->execute($params);
$count = $stmt->rowCount();
$affich_actions = false;
while ($row2 = $stmt2->fetch(PDO::FETCH_ASSOC)) {
if ($row2['username'] == $nom_connecte) {
$affich_actions = true;
}
if ($affich_actions) {
$data .= '<th colspan="2" style="text-align: center;">Actions</th>';
$data .= '</tr>';
} else {
$data .= '</tr>';
}
if ($count > 0)
{
$number = 1;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
}
if ($affich_actions) {
$data .= '<th colspan="2" style="text-align: center;">Actions</th>';
$data .= '</tr>';
} else {
$data .= '</tr>';
}
if ($count > 0)
{
$number = 1;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$data .= "<tr style='background:lightblue;color:black;'>
$data .= "<tr style='background:lightblue;color:black;'>
<td>$number</td>";
$prix = $row['prix'];
$vendeur = $row['username'];
$quantite = $row['quantite'];
@ -103,13 +104,13 @@
$data .= '<td></td><td></td>';
}
}
$data .= '</tr>';
$number++;
}
} else {
// Il n'y a pas encore de biens/services saisis
$data .= "<tr style='background-color:lightblue;text-align:left;color:black;'><td colspan='10'>Aucun enregistrement saisi</td></tr>";
$data .= '</tr>';
$number++;
}
$data .= '</table>';
echo $data;
} else {
// Il n'y a pas encore de biens/services saisis
$data .= "<tr style='background-color:lightblue;text-align:left;color:black;'><td colspan='10'>Aucun enregistrement saisi</td></tr>";
}
$data .= '</table>';
echo $data;
?>

View File

@ -1,9 +1,9 @@
<?php
session_start();
//session_start();
ini_set('display_errors', 0);
include '../../config/config.php';
$antenne_slug = $_GET['antenne_slug'];
$nom_connecte = $_SESSION['user'];
$nom_connecte = $_GET['nom_connecte'];
$bdd = new \PDO("mysql:host=$db_server;dbname=$db_name", $db_username, $db_password);
// Affichage des intitulés de colonnes

View File

@ -0,0 +1,90 @@
<?php
error_reporting(E_ALL & ~E_NOTICE);
include '../../config/config.php';
$bdd = new \PDO("mysql:host=$db_server;dbname=$db_name", $db_username, $db_password);
if(isset($_POST)) {
$params["user_id"] = $_POST['id_connecte'];
$antenne_id = $_POST['id_antenne'];
$etat_suivi = $_POST['etat_suivi'];
$maj = true;
// On lit le champ SuiviAntenne
$requete1 = "SELECT suiviantenne FROM users WHERE id = :user_id";
$query1 = $bdd->prepare($requete1);
$ancien_suivi = $query1->execute($params);
$suivi = $ancien_suivi;
//echo "ancien=".$ancien_suivi;
/*if (strpos($ancien_suivi,'|')>0) {
echo "strpos > 0";
$tableau = explode('|', $ancien_suivi);
$antennes_suivies = '';
// On ajoute l'antenne suivie
if ($etat_suivi == 'true') {
if (count($tableau) > 0) {
foreach ($valeur as $tableau) {
$antennes_suivies .= $valeur.'|';
}
$antennes_suivies .= $antenne_id;
}
} else {
// On retire l'antenne qui n'est plus suivie
foreach($valeur2 as $tableau) {
if ($valeur2 == $antenne_id) {
$ajout = '';
} else {
$ajout = $valeur2.'|';
}
$antennes_suivies .= $ajout;
}
// On supprime le pipe inutile à la fin de la chaîne
$antennes_suivies = substr($antennes_suivies,0,-1);
}*/
// On ajoute alors qu'il n'y a qu'une antenne dans le suivi ou aucune
if ($etat_suivi == 'true') {
if ($suivi == $antenne_id) {
echo "suivi 1 =".$suivi;
echo "<br />antenne_id =".$antenne_id;
$antennes_suivies = $antenne_id;
} elseif ($suivi != $antenne_id) {
echo "suivi 2 =".$suivi;
echo "<br />antenne_id =".$antenne_id;
$antennes_suivies = $suivi . '|' . $antenne_id;
}
}
if ($etat_suivi == 'true') {
if ($suivi == '') {
echo "suivi 0 =" . $suivi;
echo "<br />antenne_id =" . $antenne_id;
$antennes_suivies = $antenne_id;
}
}
if ($etat_suivi == 'false') {
if ($suivi != $antenne_id) {
echo "ERREUR 4 =" . $suivi;
echo "<br />antenne_id =" . $antenne_id;
//$antennes_suivies = $suivi . '|' . $antenne_id;
$maj = false;
} elseif ($suivi == $antenne_id) {
echo "suivi 3 =".$suivi;
echo "<br />antenne_id =".$antenne_id;
$antennes_suivies = '';
} elseif ($suivi == '') {
echo "suivi 5 =" . $suivi;
echo "<br />antenne_id =" . $antenne_id;
$antennes_suivies = '';
}
}
// Mise à jour du champ SuiviAntenne
if ($maj) {
$requete2 = "UPDATE users SET suiviantenne = '$antennes_suivies' WHERE id = :user_id";
$query2 = $bdd->prepare($requete2);
$query2->execute($params);
$query2->closeCursor();
}
$query1->closeCursor();
}

View File

@ -0,0 +1,31 @@
<?php
// Nom du fichier image
$filename = $_FILES['avatar']['name'];
// Emplacement
$path = str_replace('\\', '/', dirname(realpath(__DIR__)));
$location = $path.'/uploads/avatars/';
// Extension du fichier
$file_extension = pathinfo($filename, PATHINFO_EXTENSION);
$file_extension = strtolower($file_extension);
// Extensions valides d'image
$image_ext = array("jpg","png","jpeg");
$nom_user = $_POST['nom_user'];
$response = 0;
if(in_array($file_extension,$image_ext)){
$directory = '/uploads/avatars';
if (file_exists($directory) === false) {
mkdir($directory, 0777, true);
}
$nom_fichier = $nom_user.'-'.uniqid("",true).'.'.$file_extension;
$location2 = '/uploads/avatars/'.$nom_fichier;
// Upload du fichier
if(move_uploaded_file($_FILES['avatar']['tmp_name'],$directory.'/'.$nom_fichier)){
$response = $location2;
}
}
echo $response;

View File

@ -6,6 +6,7 @@ use App\Account\Action\AccountEditAction;
use App\Account\Action\ProfilAction;
use App\Account\Action\SignupAction;
use Framework\Auth\LoggedInMiddleware;
use Framework\Auth\LoginModalMiddleware;
use Framework\Module;
use Framework\Renderer\RendererInterface;
use Framework\Router;
@ -24,7 +25,7 @@ class AccountModule extends Module
$router->post('/inscription', SignupAction::class);
$router->get('/mon-profil', [LoggedInMiddleware::class, AccountAction::class], 'account');
$router->post('/mon-profil', [LoggedInMiddleware::class, AccountEditAction::class]);
$router->get('/profil-utilisateur', ProfilAction::class, 'account.profil');
$router->post('/profil-utilisateur', ProfilAction::class);
$router->get('/profil/user/{user:[a-zA-Z\-0-9]+}', [LoginModalMiddleware::class, ProfilAction::class], 'account.profil');
$router->post('/profil/user/{user:[a-zA-Z\-0-9]+}', [LoginModalMiddleware::class, ProfilAction::class]);
}
}

View File

@ -0,0 +1,67 @@
<?php
namespace App\Account\Action;
use App\Auth\UserTable;
use Framework\Auth;
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Framework\Session\FlashService;
use Framework\Validator;
use Psr\Http\Message\ServerRequestInterface;
class AccountUserEditAction
{
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var Auth
*/
private $auth;
/**
* @var FlashService
*/
private $flashService;
/**
* @var UserTable
*/
private $userTable;
public function __construct(
RendererInterface $renderer,
Auth $auth,
FlashService $flashService,
UserTable $userTable
) {
$this->renderer = $renderer;
$this->auth = $auth;
$this->flashService = $flashService;
$this->userTable = $userTable;
}
public function __invoke(ServerRequestInterface $request)
{
//$user = $this->auth->getUser();
$params = $request->getParsedBody();
$url_part = explode('/',$_SERVER['HTTP_REFERER']);
$chemin = $url_part[3].'/'.$url_part[4];
$validator = (new Validator($params))
->required('firstname', 'lastname');
if ($validator->isValid()) {
$userParams = [
'firstname' => $params['firstname'],
'lastname' => $params['lastname']
];
$this->userTable->update($params['id_user'], $userParams);
$this->flashService->success("Le compte ".$params['username']." a bien été mis à jour");
return new RedirectResponse($chemin);
//return new RedirectResponse($request->getUri()->getPath());
}
$errors = $validator->getErrors();
return $this->renderer->render('@account/account', compact('user', 'errors'));
}
}

View File

@ -0,0 +1,78 @@
<?php
namespace App\Account\Action;
use App\Auth\UserTable;
use Framework\Auth;
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Framework\Router;
use Framework\Session\FlashService;
use Framework\Validator;
use Psr\Http\Message\ServerRequestInterface;
class ActiveAction
{
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var Auth
*/
private $auth;
/**
* @var FlashService
*/
private $flashService;
/**
* @var UserTable
*/
private $userTable;
public function __construct(
RendererInterface $renderer,
Auth $auth,
FlashService $flashService,
Router $router,
UserTable $userTable
) {
$this->renderer = $renderer;
$this->auth = $auth;
$this->flashService = $flashService;
$this->router = $router;
$this->userTable = $userTable;
}
public function __invoke(ServerRequestInterface $request)
{
$params = $request->getParsedBody();
$url_part = explode('/',$_SERVER['HTTP_REFERER']);
$chemin = $url_part[3].'/'.$url_part[4];
$validator = (new Validator($params))
->required('username', 'actif');
if ($validator->isValid()) {
if ($params['actif']) {
$params['actif'] = '0';
} else {
$params['actif'] = '1';
}
$userParams = [
'username' => $params['username'],
'actif' => $params['actif']
];
$this->userTable->update($params['id'], $userParams);
if (!$params['actif']) {
$this->flashService->success("L'utilisateur ".$params['username']." a bien été désactivé");
} else {
$this->flashService->success("L'utilisateur ".$params['username']." a bien été réactivé");
}
return new RedirectResponse($chemin);
}
$errors = $validator->getErrors();
return $this->renderer->render('@account/account', compact('user', 'errors'));
}
}

View File

@ -1,6 +1,8 @@
<?php
namespace App\Account\Action;
use App\Auth\UserTable;
use App\Gmarche\Table\AntenneTable;
use Framework\Auth;
use Framework\Renderer\RendererInterface;
use Psr\Http\Message\ServerRequestInterface;
@ -16,24 +18,31 @@ class ProfilAction
* @var Auth
*/
private $auth;
/**
* @var UserTable
*/
private $userTable;
public function __construct(
RendererInterface $renderer,
Auth $auth
AntenneTable $antenneTable,
Auth $auth,
UserTable $userTable
) {
$this->renderer = $renderer;
$this->antenneTable = $antenneTable;
$this->auth = $auth;
$this->userTable = $userTable;
}
public function __invoke(ServerRequestInterface $request)
{
/* Transmission du nom de l'utilistateur connecté à la vue Twig */
session_start();
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
} else {
$nom_user = '';
}
return $this->renderer->render('@account/profil', compact('nom_user'));
$listeAntennes = $this->antenneTable->findAllAntennes('');
$user_affiche = $request->getAttribute('user')->username;
$nom_avatar = $request->getAttribute('user')->avatar;
$email = $request->getAttribute('user')->email;
$suiviantenne = $request->getAttribute('user')->suiviantenne;
return $this->renderer->render('@account/profil',
compact('user_affiche', 'nom_avatar', 'email', 'listeAntennes', 'suiviantenne'));
}
}

View File

@ -60,7 +60,6 @@ class SignupAction
$validator = (new Validator($params))
->required('username', 'pubkey', 'email', 'password', 'password_confirm', 'created_at')
->length('username', 3)
->length('pubkey', 43)
->length('firstname', 0)
->length('lastname', 0)
->email('email')
@ -77,7 +76,8 @@ class SignupAction
'email' => $params['email'],
'password' => password_hash($params['password'], PASSWORD_DEFAULT),
'created_at' => $params['created_at'],
'role' => 'user'
'role' => '3',
'suiviantenne' => ''
];
$this->userTable->insert($userParams);
$user = Hydrator::hydrate($userParams, User::class);

View File

@ -17,7 +17,7 @@ class User extends \App\Auth\User
/**
* @var string
*/
private $role;
public $role;
public function getRoles(): array
{

View File

@ -1,15 +1,83 @@
{% extends 'layout.twig' %}
{% block body %}
<script type="text/javascript" src="/js/script.js"></script>
<div class="profil_user">
<h4>Profil utilisateur - {{ user_affiche }}</h4>
<div id="avatar" class="col-sm-10 card" style="text-align:left;margin-left: 1.7rem;">
<div class="card-block" style="margin-left: 1rem;">
<h5 class="card-title">Changement d'avatar</h5>
<!--<div class="col-sm-5" style="float:left;">
<div class="profil_user" style="margin-top:5px;">
<h4>Profil utilisateur {{ nom_user }}</h4>
<div>
<h5>Biens achetés</h5>
</div>
<div>
<h5>Biens vendus</h5>
</div>
</div>-->
<div class="col-sm-8" style="float:left;margin-left:0rem;">
<div class="form-group">
<form method='post' action='' enctype="multipart/form-data">
Choisir la nouvelle image : <input type='file' name='file' id='avatar' class='form-control' ><br>
</form>
<div class="col-sm-8">
<div id="avatar_preview" style="max-width:140px;max-height:140px;">
<img src="/uploads/avatars/{{ nom_avatar }}" />
</div>
</div>
</div>
</div>
</div>
</div>
<div id="mot_de_passe" class="col-sm-10 card" style="text-align: left;margin-top:0.8rem; margin-left: 1.7rem;">
<div class="card-block" style="margin-left: 1rem;margin-top:0.6rem;">
<h5 class="card-title">Changement de mot de passe</h5>
<h5 class="card-title">(via l'envoi d'un lien par mail)</h5>
<div class="container" style="color:black;background-color: lightgray;opacity: 0.9;margin:0.5rem 0.2rem;padding:0.4rem;">
<form action="{{ path('auth.password') }}" method="post">
<button class="btn btn-primary">Renvoyer un mot de passe</button>
<div style="width:0;height:0;">
{{ field('username', user_affiche, "", {type: 'hidden'}) }}
{{ field('email', email, "", {type: 'hidden'}) }}
</div>
</form>
</div>
</div>
</div>
<div id="antennes_suivies" class="col-sm-10 card" style="text-align: left;margin-top:0.8rem;margin-left: 1.7rem;">
<div class="card-block" style="margin-left: 1rem;">
<h5 class="card-title">Antennes suivies</h5>
<div>
<div class="row" style="margin-left: 2rem;">
<ul class="list-group list-group-flush">
{% set antenne_suivie = suiviantenne|split('|') %}
{% for antenn in antenne_suivie %}
<li class="liste_antennes list-group-item" style="padding: .2rem 1.25rem;">
{% for item in listeAntennes %}
{% if (item.id == antenn) %}
{{ item.antenneName }}
{% endif %}
{% endfor %}
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
<div id="prochains_gmarches" class="col-sm-10 card" style="text-align: left;margin-top:0.8rem;margin-left: 1.7rem;">
<div class="card-block" style="margin-left: 1rem;">
<h5 class="card-title">Prochains Ğ-Marchés</h5>
<div>
</div>
</div>
</div>
<div class="col-sm-10 card" style="text-align: left;margin-left: 1.7rem;margin-top:0.8rem;">
<div class="card-block" style="margin-left: 1rem;">
<h5 class="card-title">Statistiques diverses</h5>
<div>
<h6 style="margin-left: 1rem;">Biens achetés</h6>
</div>
<div>
<h6 style="margin-left: 1rem;">Biens vendus</h6>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -2,8 +2,12 @@
namespace App\Admin;
use App\Product\Actions\ProductIndexAction;
use App\Product\Actions\ProductCrudAction;
use App\Account\Action\AccountUserAction;
use App\Account\Action\AccountUserEditAction;
use App\Account\Action\ActiveAction;
use App\Antenne\Actions\AntenneEditAction;
use App\Antenne\Actions\AntenneCrudAction;
use Framework\Auth\LoggedInMiddleware;
use Framework\Module;
use Framework\Renderer\RendererInterface;
use Framework\Renderer\TwigRenderer;
@ -11,7 +15,6 @@ use Framework\Router;
class AdminModule extends Module
{
const DEFINITIONS = __DIR__ . '/config.php';
public function __construct(
@ -19,13 +22,23 @@ class AdminModule extends Module
Router $router,
AdminTwigExtension $adminTwigExtension,
string $prefix
) {
$renderer->addPath('admin', __DIR__ . '/views');
//$router->get('/machin', ProductCrudAction::class, 'machin.bidule'); // ProductIndexAction
/*if ($renderer instanceof TwigRenderer) {
)
{
$chemin = str_replace('Admin','Antenne',__DIR__);
$renderer->addPath('antenne', $chemin . '/views');
$router->get('/dashboard/{user:[a-zA-Z\-0-9]+}', [LoggedInMiddleware::class, DashboardAction::class], 'dashboard');
$router->get('/dashboard/details/{user:[a-zA-Z\-0-9]+}', [LoggedInMiddleware::class, DashboardUserAction::class], 'dashboard.user');
$router->get('/activation', [LoggedInMiddleware::class, ActiveAction::class], 'account.active');
$router->post('/activation', ActiveAction::class);
$router->get('/profil-user', [LoggedInMiddleware::class, AccountUserEditAction::class], 'account.user');
$router->post('/profil-user', [LoggedInMiddleware::class, AccountUserEditAction::class]);
//$router->get('/antenne/new', [LoggedInMiddleware::class, AntenneCrudAction::class], 'antenne.create');
$router->crud('/antenne', [LoggedInMiddleware::class, AntenneCrudAction::class],'antenne');
$router->get('/antenne/edit', [LoggedInMiddleware::class, AntenneEditAction::class], 'antenne.edit');
$router->post('/antenne/edit', [LoggedInMiddleware::class, AntenneEditAction::class]);
if ($renderer instanceof TwigRenderer) {
$renderer->getTwig()->addExtension($adminTwigExtension);
}*/
// $renderer->getTwig()->addExtension($variableExtension);
}
}
}

View File

@ -0,0 +1,75 @@
<?php
namespace App\Admin;
if (!isset($_SESSION)) {
session_start();
}
use App\Admin\Table\UserTable;
use App\Gmarche\Table\AntenneTable;
use Framework\Renderer\RendererInterface;
use Framework\Session\SessionInterface;
use Psr\Http\Message\ServerRequestInterface;
class DashboardAction
{
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var AntenneTable
*/
private $antenneTable;
/**
* @var SessionInterface
*/
private $session;
/**
* @var UserTable
*/
private $userTable;
public function __construct(
RendererInterface $renderer,
AntenneTable $antenneTable,
SessionInterface $session,
UserTable $userTable)
{
$this->renderer = $renderer;
$this->antenneTable = $antenneTable;
$this->session = $session;
$this->userTable = $userTable;
}
/**
* @param ServerRequestInterface $request
* @return string
*/
public function __invoke(ServerRequestInterface $request)
{
if ($request->getMethod() === 'GET') {
$role = $this->session->get('role', []);
$username = $this->session->get('username', []);
$this->renderer->addPath('admin', __DIR__ . '/views');
$page = $params['p'] ?? 1; // Si la page n'est pas définie, on l'initialise à 1
$liste_adminGeneral = $this->userTable->findAdminUsers('1');
$liste_adminAntenne = $this->userTable->findAdminUsers('2');
$liste_users_suivi = $this->userTable->findUsers('3');
$listeAntennes = $this->antenneTable->findAllAntennes('',false,'');
if ($this->session->get('username')) {
$this->session->delete('role');
$this->session->delete('username');
$this->session->set('role',$role);
$this->session->set('username',$username);
} else {
$this->session->set('username',$username);
$this->session->set('role',$role);
}
$sess = $_SESSION;
return $this->renderer->render('@admin/dashboard',
compact('sess','username','liste_adminGeneral', 'liste_users_suivi',
'liste_adminAntenne', 'listeAntennes'));
}
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Admin;
if (!isset($_SESSION)) {
session_start();
}
use App\Auth\UserTable;
use App\Admin\Table\UserTable as UserTableAdmin;
use App\Gmarche\Table\AntenneTable;
use Framework\Auth;
use Framework\Renderer\RendererInterface;
use Psr\Http\Message\ServerRequestInterface;
class DashboardUserAction
{
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var Auth
*/
private $auth;
/**
* @var AntenneTable
*/
private $antenneTable;
/**
* @var UserTable
*/
private $userTable;
public function __construct(
RendererInterface $renderer,
Auth $auth,
AntenneTable $antenneTable,
UserTable $userTable,
UserTableAdmin $userTableAdmin)
{
$this->renderer = $renderer;
$this->auth = $auth;
$this->antenneTable = $antenneTable;
$this->userTable = $userTable;
$this->userTableAdmin = $userTableAdmin;
}
/**
* @param ServerRequestInterface $request
* @return string
*/
public function __invoke(ServerRequestInterface $request)
{
if ($request->getMethod() === 'GET') {
$this->renderer->addPath('admin', __DIR__ . '/views');
$liste_users_suivi = $this->userTableAdmin->findUsers('3');
$url_part = explode('/',$_SERVER['REQUEST_URI']);
$user_affiche = $url_part[3];
$user = $this->userTable->findBy('username', $user_affiche);
$id_affiche = $user->id;
$actif_affiche = $user->actif;
$listeAntennes = $this->antenneTable->findAllAntennes('');
$sess = $_SESSION;
return $this->renderer->render('@admin/dashboard_user',
compact('sess','user_affiche','id_affiche', 'actif_affiche', 'user','liste_users_suivi','listeAntennes'));
}
}
}

35
src/Admin/Entity/User.php Normal file
View File

@ -0,0 +1,35 @@
<?php
namespace App\Admin\Entity;
class User
{
public $id;
public $username;
public $email;
public $password;
public $firstname;
public $lastname;
public $created_at;
public $role;
public $password_reset;
public $password_reset_at;
public $pubkey;
public $avatar;
public $suiviantenne;
public $actif;
}

View File

@ -0,0 +1,74 @@
<?php
namespace App\Admin\Table;
use App\Admin\Entity\User;
use App\Gmarche\Table\AntenneTable;
use Framework\Database\Query;
use Framework\Database\Table;
class UserTable extends Table
{
protected $entity = User::class;
protected $table = 'users';
public function findList(): array
{
$results = $this->pdo
->query("SELECT id, name FROM {$this->table}")
->fetchAll(\PDO::FETCH_NUM);
$list = [];
foreach ($results as $result) {
$list[$result[0]] = $result[1];
}
return $list;
}
public function findAntennebyId(int $id_antenne): Query
{
$antenne = new AntenneTable($this->pdo);
return $this->makeQuery()
->select('a.name as nameAntenne')
->where("a.id = $id_antenne");
}
public function findUsers($role): Query
{
return $this->makeQuery()
->select('u.*')
->where("u.role = '" . $role . "'")
->order('u.username ASC');
}
/*public function findUsersSuivi($role): Query
{
$antenne = new AntenneTable($this->pdo);
return $this->makeQuery()
->join($antenne->getTable() . ' as a', 'substring(u.suiviantenne,1,1) = a.id')
->select('u.*,a.name as nameAntenne')
->where("u.role = '".$role."'")
->order('u.username, nameAntenne ASC');
}*/
public function findAdminUsers($role): Query
{
return $this->makeQuery()
->select('u.*')
->where("u.role = $role")
->order('u.username ASC');
}
public function findRole($username): Query
{
return $this->makeQuery()
->select('u.role')
->where("u.username = '" . $username . "'");
}
public function findRole2($username)
{
return $this->pdo
->query("SELECT role FROM {$this->table} WHERE username='".$username."'")
->fetch();
}
}

View File

@ -1,12 +1,10 @@
<?php
use App\Admin\AdminModule;
use App\Admin\DashboardAction;
return [
'admin.prefix' => '/admin',
'admin.widgets' => [],
\App\Admin\AdminTwigExtension::class => \DI\object()->constructor(\DI\get('admin.widgets')),
AdminModule::class => \DI\object()->constructorParameter('prefix', \DI\get('admin.prefix'))
//DashboardAction::class => \DI\object()->constructorParameter('widgets', \DI\get('admin.widgets'))
];

View File

@ -0,0 +1,112 @@
{% extends 'layout.twig' %}
{% block title "Ğ1-Marché - Tableau de bord" %}
{% block body %}
<div class="container" style="color:floralwhite;background-color: #333333;padding: 1rem;">
<div class="container tab-de-bord">
<h3 style="display:inline-block;">Tableau de bord - </h3>
<h4 style="display:inline-block;">
{% if (sess.role == 0) %} Super Admin{% endif %}
{% if (sess.role == 1) %} Admin général{% endif %}
{% if (sess.role == 2) %} Admin Antenne{% endif %}
</h4>
</h3>
</div>
<p></p>
{% if (sess.role == 0) %}
<h4>Liste des admins généraux</h4>
<ul class="list-group list-group-flush">
{% for admin_gen in liste_adminGeneral %}
<a style="color:black;" href="" title="{{ admin_gen.username }}">
<li class="liste_antennes list-group-item" style="padding: .2rem 1.25rem;">
{{ admin_gen.username }}
</li>
</a>
{% endfor %}
</ul>
{% endif %}
<p></p>
{% if (sess.role==0 or sess.role==1) %}
<h4>Liste des admins Antenne</h4>
<ul class="list-group list-group-flush">
{% for admin_ant in liste_adminAntenne %}
<a style="color:black;" href="" title="{{ admin_ant.username }}">
<li class="liste_antennes list-group-item" style="padding: .2rem 1.25rem;">
{{ admin_ant.username }}
</li>
</a>
{% endfor %}
</ul>
{% endif %}
<p></p>
{% if (sess.role==0 or sess.role==1 or sess.role==2) %}
<h4>Gérer les antennes</h4>
<button class="btn btn-primary" style="max-width: 6rem;margin-top:0rem;margin-bottom:0.7rem;height:2rem;">
<a class="nav-link" href="{{ path('antenne.edit') }}" style="padding-left:0.2rem;margin-top:-0.4rem;color:white;font-size:14px;">MODIFIER</a>
</button>
{% if (sess.role==0 or sess.role==1) %}
<button class="btn btn-primary" style="margin-top:0rem;margin-bottom:0.7rem;height:2rem;padding-left:-1rem;">
<a class="nav-link" href="{{ path('antenne.create') }}" style="margin-top:-0.4rem;color:white;font-size:14px;">CREER</a>
</button>
<button class="btn btn-primary" style="max-width:6.4rem;margin-top:0rem;margin-bottom:0.7rem;height:2rem;">
<a class="nav-link" href="{{ path('antenne.edit') }}" style="padding-left:0rem;margin-top:-0.4rem;color:white;font-size:14px;">SUPPRIMER</a>
</button>
{% endif %}
<h4>Liste des régions/antennes</h4>
<ul class="list-group list-group-flush">
{% set region = '' %}
{% for item in listeAntennes %}
{% if (item.regionName != region) %}
<li class="liste_antennes list-group-item" style="color:black;
background-color:lightgoldenrodyellow;padding: .2rem 1.25rem;">
{{ item.regionName }}
</li>
<a style="color:black;" href="" title="{{ item.regionName }}">
<li class="liste_antennes list-group-item" style="background-color:#8fbc8f;padding: .2rem 1.25rem;">
{{ item.antenneName }}
</li>
</a>
{% else %}
<a style="color:black;" href="" title="{{ item.regionName }}">
<li class="liste_antennes list-group-item" style="background-color:#8fbc8f;padding: .2rem 1.25rem;">
{{ item.antenneName }}
</li>
</a>
{% endif %}
{% set region = item.regionName %}
{% endfor %}
</ul>
{% endif %}
<p></p>
{% if (sess.role==0 or sess.role==1 or sess.role==2) %}
<h4>Liste des utilisateurs</h4>
<ul class="list-group list-group-flush">
{% for item2 in liste_users_suivi %}
<a style="color:black;" href="{{ path('dashboard.user',{user:item2.username}) }}" title="{{ item2.username }}">
<li class="liste_antennes list-group-item" style="padding: .2rem 1.25rem;">
{{ item2.username }}
{% set antenne_suivie = item2.suiviantenne|split('|') %}
{% for antenn in antenne_suivie %}
{% for item in listeAntennes %}
{% if (item.id == antenn) %}
- {{ item.antenneName }}
{% endif %}
{% endfor %}
{% endfor %}
{% if not (item2.actif) %}
<button class="btn btn-primary">DESACTIVE</button>
{% endif %}
</li>
</a>
{% endfor %}
</ul>
{% endif %}
<p></p>
<div class="row">
{{ widgets | raw }}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,78 @@
{% extends 'layout.twig' %}
{% block title "Ğ1-Marché - Tableau bord User" %}
{% block body %}
<div class="container" style="padding:1rem; margin:1rem;">
<div class="container" style="color:floralwhite;background-color: #333333;padding: 0.8rem;">
<div style="text-align:center;padding: 0.8rem 0.8rem 0.1rem 0.8rem;"" class="container tab-de-bord">
<h3 style="display:inline-block;">Tableau de bord Utilisateur</h3>
<h4>{{ user_affiche }}</h4>
</div>
<ul class="list-group list-group-flush">
<div class="container" style="color:black;background-color: lightgray;opacity:0.9;margin-top:0.5rem;padding:0.7rem;">
<form action="{{ path('account.active') }}" method="post">
{% if actif_affiche %}
<button class="btn btn-primary">Désactiver l'utilisateur</button>
{% else %}
<button class="btn btn-primary">Activer l'utilisateur</button>
{% endif %}
<div style="width:0;height:0;"> {{ field('actif', actif_affiche, "", {type: 'hidden'}) }}
{{ field('username', user_affiche, "", {type: 'hidden'}) }}
{{ field('id', id_affiche, "", {type: 'hidden'}) }}
</div>
</form>
</div>
</ul>
<p></p>
<h4>Profil</h4>
<ul class="list-group list-group-flush">
<div class="container" style="color:black;background-color: lightgray;opacity: 0.9;padding:1rem;">
<form action="{{ path('account.user') }}" method="post">
<!-- csrf_input() -->
{{ field('firstname', user.firstname, 'Prénom') }}
{{ field('lastname', user.lastname, 'Nom') }}
Adresse mail {{ user.email }}<p></p>
Clé publique {{ user.pubkey }}
<div style="width:0;height:0;">
{{ field('id_user', id_affiche, "", {type: 'hidden'}) }}
{{ field('username', user_affiche, "", {type: 'hidden'}) }}
</div>
<p></p>
<button class="btn btn-primary">Modifier les informations</button>
</form>
</div>
</ul>
<ul class="list-group list-group-flush">
<div class="container" style="color:black;background-color: lightgray;opacity: 0.9;margin-top:0.5rem;padding:1rem;">
<form action="{{ path('auth.password') }}" method="post">
<button class="btn btn-primary">Renvoyer un mot de passe</button>
<div style="width:0;height:0;">
{{ field('email', user.email, "", {type: 'hidden'}) }}
</div>
</form>
</div>
</ul>
<p></p>
<h4>Liste des antennes suivies</h4>
<ul class="list-group list-group-flush">
<li class="liste_antennes list-group-item" style="color:black;padding: .2rem 1.25rem;">
{% set antenne_suivie = user.suiviantenne|split('|') %}
{% for antenne in antenne_suivie %}
{% for item in listeAntennes %}
{% if (item.id == antenne) %}
<li class="liste_antennes list-group-item" style="padding: .2rem 1.25rem;">
<a style="color:black;" href="" title="{{ item.antenneName }}">
{{ item.antenneName }}
</a>
</li>
{% endif %}
{% endfor %}
{% endfor %}
</li>
</ul>
<p></p>
</div>
</div>
{% endblock %}

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>{% block title "Mon site " %}</title>
<title>{% block title "Ğ1-Marché - Administration" %}</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/3.0.7/flatpickr.css">
<style>
@ -13,17 +13,49 @@
<body>
<nav class="navbar fixed-top navbar-expand-sm navbar-dark bg-dark">
<a class="navbar-brand" href="{{ path(routePrefix) }}">Ğ1-Marché</a>
<a class="navbar-brand" href="{{ path('gmarche.index') }}">Ğ1-Marché</a>
<ul class="navbar-nav mr-auto">
{{ admin_menu() }}
</ul>
<div class="navbar-nav">
<form class="nav-item active" method="post" action="{{ path('auth.logout') }}">
{{ csrf_input() }}
<button class="btn-primary btn-danger">Se déconnecter</button>
</form>
</div>
<ul class="navbar-nav mr-auto" style="color: white;">
<!-- admin_menu() -->
role = {{ role }}
</ul>
<div class="navbar-nav">
<div class="navbar-text" style="color:lightgray;margin-right:15px; margin-top:3px;">
{{ "now"|date('d/m/y') }}
affiche_username = {{ affiche_username() }} /affiche_username
</div>
{% if affiche_username()!= '' %}
<form method="post" style="margin-top:5px;" action="{{ path('account.profil') }}">
<span><img src="\avatar_user.png" width="22" height="22" />
affiche_username = {{ affiche_username() }} /affiche_username</span>
<button style="color:white;font-size: 14px;" class="btn-primary">user = {{ name_user }}</button>
<button style="color:white;font-size: 14px;" class="btn-primary">user2 = {{ name_user2 }}</button>
</form>
<form method="post" action="{{ path('auth.logout') }}">
<!-- csrf_input() }}-->
<button class="btn btn-danger" style="margin-left: 7px; font-size:14px;">Se déconnecter</button>
</form>
{% else %}
<span style="color:white;">
name_user = {{ name_user }}
name_user2 = {{ name_user2 }}</span>
<div class="nav-item" id="bouton-connexion">
<button style="color:white; font-size: 14px;" class="btn btn-primary" data-toggle="modal" data-target="#connexion_modal">Se connecter</button>
</div>
<div id="nom_connecte" style="display:none;margin-left:10px;margin-top:6px;margin-right:8px;">
</div>
<div id="deconnexion" style="display:none;">
<form method="post" action="{{ path('auth.logout') }}">
<!-- csrf_input() }}-->
<button class="btn btn-danger" style="font-size:14px;">Se déconnecter</button>
</form>
</div>
<div class="nav-item" id="inscription">
<a class="nav-link" href="{{ path('account.signup') }}" style="font-size:14px;">S'inscrire</a>
</div>
{% endif %}
</div>
</nav>
<div class="container">
@ -49,12 +81,13 @@
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/3.0.7/flatpickr.js"></script>
<script>
flatpickr('.datepicker', {
enableTime: true,
altInput: true,
altFormat: 'j F Y, H:i',
dateFormat: 'Y-m-d H:i:S'
})
flatpickr('.datepicker', {
enableTime: true,
altInput: true,
altFormat: 'j F Y, H:i',
dateFormat: 'Y-m-d H:i:S'
})
</script>
</body>
</html>

View File

@ -0,0 +1,160 @@
<?php
namespace App\Antenne\Actions;
if (!isset($_SESSION)) {
session_start();
}
use App\Gmarche\Entity\Antenne;
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
use Framework\Actions\CrudAction;
use Framework\Actions\RouterAwareAction;
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Framework\Router;
use Framework\Session\FlashService;
use Framework\Validator;
use Psr\Http\Message\ServerRequestInterface as Request;
class AntenneCrudAction extends CrudAction
{
protected $viewPath = "@antenne";
protected $routePrefix = "antenne";
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var RegionTable
*/
protected $regionTable;
/**
* @var AntenneTable
*/
protected $antenneTable;
/**
* @var FlashService
*/
private $flashService;
use RouterAwareAction;
public function __construct(
RendererInterface $renderer,
Router $router,
AntenneTable $antenneTable,
RegionTable $regionTable,
FlashService $flash
) {
parent::__construct($renderer, $router, $antenneTable, $regionTable, $flash);
$this->renderer = $renderer;
$this->regionTable = $regionTable;
$this->antenneTable = $antenneTable;
$this->flashService = $flash;
}
public function delete(Request $request)
{
$antenne = $this->antenneTable->find($request->getAttribute('id'));
// $this->postUpload->delete($post->image);
return parent::delete($request);
}
protected function formParams(array $params): array
{
return $params;
}
protected function getNewEntity()
{
$antenne = new Antenne();
$antenne->created_at = new \DateTime();
return $antenne;
}
/**
* @param Request $request
* @param Antenne $antenne
* @return array
*/
protected function prePersist(Request $request, $antenne): array
{
$params = $request->getParsedBody();
$params = array_filter($params, function ($key) {
return in_array($key, ['region_id', 'name', 'slug', 'created_at', 'listeRegions']);
}, ARRAY_FILTER_USE_KEY);
return array_merge($params, ['test' => $test, 'updated_at' => date('Y-m-d H:i:s')]);
}
protected function getValidator(Request $request)
{
$validator = parent::getValidator($request)
->required('region_id', 'name', 'slug', 'created_at')
->length('name', 2, 250)
->dateTime('created_at')
->slug('slug');
/*if (is_null($request->getAttribute('id'))) {
$validator->uploaded('image');
}*/
return $validator;
}
public function __invoke(Request $request)
{
if ($request->getMethod() === 'POST') {
$params = $request->getParsedBody();
$date = $params['datepicker'];
$time = '00:00:00';
$date_us = substr($date,6,4).'-'.substr($date,3,2).'-'.substr($date,0,2);
$date_us .= ' '.$time;
$madate = date("Y-m-d H:i:s", strtotime($date_us));
$text = $params['antenne'];
// replace non letter or digits by -
$text = preg_replace('~[^\pL\d]+~u', '-', $text);
// transliterate
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
// remove unwanted characters
$text = preg_replace('~[^-\w]+~', '', $text);
// trim
$text = trim($text, '-');
// remove duplicate -
$text = preg_replace('~-+~', '-', $text);
// lowercase
$slug = strtolower($text);
$admin = '';
$content = '';
$image = '';
$created_at = date("Y-m-d H:i:s");
$validator = (new Validator($params))
->required('antenne', 'region');
if ($validator->isValid()) {
$antenneParams = [
'id' => $antenne_id,
'name' => $params['antenne'],
'slug' => $slug,
'admin' => $admin,
'content' => $content,
'image' => $image,
'created_at' => $created_at,
'region_id' => $params['region'],
'gmarcheAt' => $madate,
'edito1' => $params['contenu1'],
'edito2' => $params['contenu2'],
'edito3' => $params['contenu3'],
'edito4' => $params['contenu4']
];
$this->antenneTable->insert($antenneParams);
$this->flashService->success("L'antenne ".$params['antenne']." a bien été créée.");
return new RedirectResponse($request->getUri()->getPath());
}
}
//$errors = $validator->getErrors();
$listeRegions = $this->regionTable->findAll();
$role = $_SESSION['role'];
return $this->renderer->render('@antenne/create', compact('listeRegions','role'));
}
}

View File

@ -0,0 +1,118 @@
<?php
namespace App\Antenne\Actions;
if (!isset($_SESSION)) {
session_start();
}
use App\Admin\Table\UserTable;
use App\Framework\Response\RedirectBackResponse;
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
use Framework\Actions\RouterAwareAction;
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Framework\Session\FlashService;
use Framework\Validator;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
class AntenneEditAction
{
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var RegionTable
*/
private $regionTable;
/**
* @var AntenneTable
*/
private $antenneTable;
/**
* @var FlashService
*/
private $flashService;
use RouterAwareAction;
public function __construct(
RendererInterface $renderer,
RegionTable $regionTable,
AntenneTable $antenneTable,
UserTable $userTable,
FlashService $flashService,
ContainerInterface $container
) {
$this->renderer = $renderer;
$this->regionTable = $regionTable;
$this->antenneTable = $antenneTable;
$this->userTable = $userTable;
$this->flashService = $flashService;
$this->container = $container;
}
public function __invoke(Request $request)
{
$role = $request->getAttribute('user')->role;
$user_id = $request->getAttribute('user')->id;
if ($role < 3) {
if ($request->getMethod() === 'GET') {
// $username = $this->session->get('username', []);
if ($role == 2) {
$antennes_suivies = $request->getAttribute('user')->suiviantenne;
$liste_ant_suiv = str_replace('|',',',$antennes_suivies);
$listeAntennes = $this->antenneTable->findAnyAntennes('tri_alpha',$liste_ant_suiv);
} else {
$listeAntennes = $this->antenneTable->findAllAntennes('tri_alpha');
}
$listeRegions = $this->regionTable->findAll();
}
$params = $request->getQueryParams();
// On récupère l'id de la région cliquée
$slug = $request->getAttribute('slug') ?: $_SESSION['connecte'];
//$region_id = $this->regionTable->findBy('slug', $slug)->id ?: 1;
$page = $params['p'] ?? 1; // Si la page n'est pas définie, on l'initialise à 1
$sess = $_SESSION;
if ($request->getMethod() === 'POST') {
$params = $request->getParsedBody();
$antenne_id = strstr( $params['antenne'], '|', true);
$date = $params['datepicker'];
$time = '00:00:00';
$date_us = substr($date,6,4).'-'.substr($date,3,2).'-'.substr($date,0,2);
$date_us .= ' '.$time;
$madate = date("Y-m-d H:i:s", strtotime($date_us));
$validator = (new Validator($params))
->required('antenne', 'region');
if ($validator->isValid()) {
$antenneParams = [
'id' => $antenne_id,
'region_id' => $params['region'],
'gmarcheAt' => $madate,
'edito1' => $params['contenu1'],
'edito2' => $params['contenu2'],
'edito3' => $params['contenu3'],
'edito4' => $params['contenu4']
];
$this->antenneTable->update($antenne_id, $antenneParams);
$this->flashService->success("L'antenne a bien été mise à jour");
return new RedirectResponse($request->getUri()->getPath());
}
$errors = $validator->getErrors();
}
return $this->renderer->render('@antenne/edit', compact('sess', 'page', 'listeRegions',
'listeAntennes'));
} else {
$this->flashService->success("Vous n'avez pas accès à cette fonction");
return new RedirectBackResponse($request);
}
}
}

View File

@ -0,0 +1,83 @@
{% extends 'layout.twig' %}
{% block title "Ğ1-Marché - Créer Antennes" %}
{% block body %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/3.0.7/flatpickr.js"></script>
<link rel="stylesheet" href="/css/jquery-ui.min.css">
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>
<script type="text/javascript">
$.datepicker.setDefaults(
{
altField: "#datepicker",
closeText: 'Fermer',
prevText: 'Précédent',
nextText: 'Suivant',
currentText: 'Aujourd\'hui',
monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
monthNamesShort: ['Janv.', 'Févr.', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'],
dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
dayNamesShort: ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'],
dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
weekHeader: 'Sem.',
dateFormat: 'dd-mm-yy'
}
);
</script>
<script>
$( function() {
$( "#datepicker" ).datepicker();
});
</script>
<div class="container_main">
<div id="la_page">
<span style="color:white;font-size:1.4rem;">
CREATION D'UNE ANTENNE
</span>
<div class="container" style="color:white;padding:3rem; width:55rem;border:1px solid white;margin:auto;">
<form action="" method="post">
{{ csrf_input }}
<div class="row">
<div class="col-md-4">
{{ field('antenne', item.name, "Nom de l'antenne") }}
</div>
<div class="col-md-4" style="max-width: 15rem;">
<span style="margin-left:1rem;">REGION</span>
<select id="region_select" name="region" class="form-control">
<option class="list-group-item list-group-item-action" value="0">
Sélectionnez une région
</option>
{% for item in listeRegions %}
<option class="list-group-item list-group-item-action" value="{{ item.id }}">
{{ item.name }}
</option>
{% endfor %}
</select>
</div>
{{ field('updated_at', item.updatedAt, "", {type: 'hidden'}) }}
{{ field('created_at', date(), "", {type: 'hidden'}) }}
<div class="col-md-3">
<div style="margin-top:-0.4rem;float:left;min-width: 13rem;">
{{ field('datepicker', item.gmarcheAt, "Date Prochain G-marché", {class: 'datepicker'}) }}
</div>
</div>
</div>
<div style="clear:both;">
<div class="row" style="color:white;">
<div class="col-md-12" style="margin-top:1rem;height:auto;">
<div class="form-group">
<label for="comment">Annonce de présentation de l'antenne</label><p></p>
Ligne 1 <textarea id="edito1" class="form-control" rows="2" name="contenu1"></textarea>
Ligne 2 <textarea id="edito2" class="form-control" rows="2" name="contenu2"></textarea>
Ligne 3 <textarea id="edito3" class="form-control" rows="2" name="contenu3"></textarea>
Ligne 4 <textarea id="edito4" class="form-control" rows="2" name="contenu4"></textarea>
</div>
</div>
</div>
<button class="btn btn-primary" type="submit">Enregistrer</button>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

173
src/Antenne/views/edit.twig Normal file
View File

@ -0,0 +1,173 @@
{% extends 'layout.twig' %}
{% block title "Ğ1-Marché - Modifier Antennes" %}
{% block body %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/3.0.7/flatpickr.js"></script>
<link rel="stylesheet" href="/css/jquery-ui.min.css">
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>
<script type="text/javascript">
$.datepicker.setDefaults(
{
altField: "#datepicker",
closeText: 'Fermer',
prevText: 'Précédent',
nextText: 'Suivant',
currentText: 'Aujourd\'hui',
monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
monthNamesShort: ['Janv.', 'Févr.', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'],
dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
dayNamesShort: ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'],
dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
weekHeader: 'Sem.',
dateFormat: 'dd-mm-yy'
}
);
</script>
<script>
$( function() {
$( "#datepicker" ).datepicker();
});
</script>
<div class="container_main">
<div id="la_page">
<span style="color:white;font-size:1.4rem;">
MODIFICATION D'UNE ANTENNE
</span>
<div class="container" style="padding:3rem; width:55rem;border:1px solid white;margin:auto;">
<!--{ path('antenne.edit', { id: item.id, region: explodeUrl()[2]}) }}-->
<form action="" method="post">
<!--{ csrf_input }}-->
<div class="row" style="color:white;">
<div class="col-md-4" style="max-width: 15rem;">
<span style="margin-left:1rem;">ANTENNE</span>
<select id="antenne_select" name="antenne" class="form-control">
<option class="list-group-item list-group-item-action" value="0">
Sélectionnez l'antenne
</option>
{% for item in listeAntennes %}
<option class="list-group-item list-group-item-action" value="{{ item.id }}|{{ item.regionId }}">
{{ item.antenneName }}
</option>
{% endfor %}
</select>
</div>
{% set j=0 %}
{% for item in listeAntennes %}
{% set j=j+1 %}
{% set name = 'region_name'~j %}
<span style="width:0;height:0;">{{ field(name,item.regionName,"", {type:'hidden'}) }}</span>
{% endfor %}
{% set k=0 %}
{% for item in listeAntennes %}
{% set k=k+1 %}
{% set name = 'edito1_'~k %}
<span style="width:0;height:0;">{{ field(name,item.edito1,"", {type:'hidden'}) }}</span>
{% set name = 'edito2_'~k %}
<span style="width:0;height:0;">{{ field(name,item.edito2,"", {type:'hidden'}) }}</span>
{% set name = 'edito3_'~k %}
<span style="width:0;height:0;">{{ field(name,item.edito3,"", {type:'hidden'}) }}</span>
{% set name = 'edito4_'~k %}
<span style="width:0;height:0;">{{ field(name,item.edito4,"", {type:'hidden'}) }}</span>
{% set name = 'gmAt_'~k %}
<span style="width:0;height:0;">{{ field(name,item.gmarcheAt,"", {type:'hidden'}) }}</span>
{% endfor %}
<div class="col-md-4" style="min-width:15rem;">
<div style="float:left; text-align:left;margin-left:2rem;margin-bottom: 1rem;">
<span style="margin-left:1rem;">REGION</span>
<select id="region" name="region" class="form-control">
<option class="list-group-item list-group-item-action" value="0"></option>
</select>
</div>
</div>
<div class="col-md-3">
<div style="margin-top:-0.4rem;float:left;" style="min-width: 13rem;">
{{ field('datepicker', item.gmarcheAt, "Prochain G-marché", {class: 'datepicker'}) }}
</div>
</div>
</div>
<div style="clear:both;">
<div class="row" style="color:white;">
<div class="col-md-12" style="margin-top:1rem;height:auto;">
<div class="form-group">
<label for="comment">Annonce de présentation de l'antenne</label><p></p>
Ligne 1 <textarea id="edito1" class="form-control" rows="2" name="contenu1"></textarea>
Ligne 2 <textarea id="edito2" class="form-control" rows="2" name="contenu2"></textarea>
Ligne 3 <textarea id="edito3" class="form-control" rows="2" name="contenu3"></textarea>
Ligne 4 <textarea id="edito4" class="form-control" rows="2" name="contenu4"></textarea>
</div>
</div>
</div>
<button class="btn btn-primary" type="submit">Enregistrer</button>
</div>
</form>
</div>
</div>
</div>
<script>
/* Lorsqu'on sélectione une antenne */
document.querySelector("#antenne_select").addEventListener("change", function() {
/* On vide si besoin la zone select des régions */
if (document.getElementById("region").hasChildNodes()) {
var child = document.getElementById("region");
while (child.hasChildNodes()) {
child.removeChild(child.firstChild);
}
}
/* if (document.querySelector("#antenne_select").options[0].text=="Sélectionnez l'antenne") {
// document.querySelector("#antenne_select").removeChild( document.querySelector("#antenne_select").firstChild);
}*/
var x = document.querySelector("#antenne_select").selectedIndex,
y = document.querySelector("#antenne_select").options,
select = document.getElementById('region'),
nom_zone = "region_name"+x,
region_nom = document.getElementById(nom_zone).value;
//region_id = document.getElementById(nom_zone).text;
/* Affichage de la date du gmarché et des éditos en fonction de l'antenne sélectionnée */
var gmAt = document.getElementById('datepicker'),
nom_zone_gmAt = "gmAt_"+x,
valeur_gmAt = document.getElementById(nom_zone_gmAt).value;
gmAt.value = valeur_gmAt;
var edito1 = document.getElementById('edito1'),
nom_zone_edito1 = "edito1_"+x,
valeur_edito1 = document.getElementById(nom_zone_edito1).value;
edito1.value = valeur_edito1;
var edito2 = document.getElementById('edito2'),
nom_zone_edito2 = "edito2_"+x,
valeur_edito2 = document.getElementById(nom_zone_edito2).value;
edito2.value = valeur_edito2;
var edito3 = document.getElementById('edito3'),
nom_zone_edito3 = "edito3_"+x,
valeur_edito3 = document.getElementById(nom_zone_edito3).value;
edito3.value = valeur_edito3;
var edito4 = document.getElementById('edito4'),
nom_zone_edito4 = "edito4_"+x,
valeur_edito4 = document.getElementById(nom_zone_edito4).value;
edito4.value = valeur_edito4;
/* Affichage des régions */
var tableau = new Array("Auvergne-Rhône-Alpes", "Bourgogne-Franche-Comté", "Bretagne",
"Centre-Val de Loire", "Corse", "Grand Est", "Hauts-de-France", "Ile-de-France", "Normandie",
"Nouvelle-Aquitaine", "Occitanie", "Pays de la Loire", "Provence-Alpes-Côte d'Azur");
for (var i = 0; i<tableau.length; i++){
opt = document.createElement('option')
var valeurs_antenne = y[x].value.split("|")
var deuxieme_valeur = valeurs_antenne[1]
opt.value = deuxieme_valeur
opt.innerHTML = tableau[i]
if (region_nom == tableau[i]) {
opt.selected = "selected"
}
select.appendChild(opt)
}
});
</script>
<script>
document.getElementById("region").addEventListener("click", function() {
$(document).ready(function () {
//
});
});
</script>
<script src="/js/utils.js"></script>
{% endblock %}

View File

@ -0,0 +1,35 @@
{{ csrf_input }}
<div class="row">
<div class="col-md-4">
{{ field('name', item.name, "Nom du produit") }}
</div>
<div class="col-md-4">
{{ field('quantite', item.quantite, "Quantité") }}
</div>
<div class="col-md-4">
{{ field('prix', item.prix, "Prix") }}
</div>
</div>
<div class="row">
<div class="col-md-8">
{{ field('image', item.slug, "Image", {type: 'file'}) }}
</div>
<div class="col-md-4">
{% if item.image %}
<img src="{{ item.thumb }}" alt="" style="width:100%;">
{% endif %}
</div>
<!-- <div class="col-md-4">
field('slug', item.slug, "Lien")
</div>-->
</div>
{{ field('content', item.content, "Description", {type: 'textarea'}) }}
{{ field('updated_at', item.updatedAt, "", {type: 'hidden'}) }}
{{ field('created_at', date(), "", {type: 'hidden'}) }}
{{ field('antenne_id', explodeUrl()[4], "", {type: 'hidden'}) }}

View File

@ -0,0 +1,81 @@
{% extends 'layout.twig' %}
{% block title "Ğ1-Marché - Créer Antennes" %}
{% block body %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/3.0.7/flatpickr.js"></script>
<link rel="stylesheet" href="/css/jquery-ui.min.css">
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>
<script type="text/javascript">
$.datepicker.setDefaults(
{
altField: "#datepicker",
closeText: 'Fermer',
prevText: 'Précédent',
nextText: 'Suivant',
currentText: 'Aujourd\'hui',
monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
monthNamesShort: ['Janv.', 'Févr.', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'],
dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
dayNamesShort: ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'],
dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
weekHeader: 'Sem.',
dateFormat: 'dd-mm-yy'
}
);
</script>
<script>
$( function() {
$( "#datepicker" ).datepicker();
});
</script>
<div class="container_main">
<div id="la_page" style="color:white;">
<span style="color:white;font-size:1.4rem;">
CREATION D'UNE ANTENNE
</span>
<div class="container" style="padding:3rem; width:55rem;border:1px solid white;margin:auto;">
<form action="" method="post">
{{ csrf_input }}
<div class="row">
<div class="col-md-4">
{{ field('antenne', item.name, "Nom de l'antenne") }}
</div>
<div class="col-md-4" style="max-width: 15rem;">
<span style="margin-left:1rem;">REGION</span>
<select id="region_select" name="region" class="form-control">
<option class="list-group-item list-group-item-action" value="0">
Sélectionnez une région
</option>
{% for item in listeRegions %}
<option class="list-group-item list-group-item-action" value="{{ item.id }}">
{{ item.name }}
</option>
{% endfor %}
</select>
</div>
<div class="col-md-3">
<div style="margin-top:-0.4rem;float:left;" style="min-width: 13rem;">
{{ field('datepicker', item.gmarcheAt, "Prochain G-marché", {class: 'datepicker'}) }}
</div>
</div>
</div>
<div style="clear:both;">
<div class="row" style="color:white;">
<div class="col-md-12" style="margin-top:1rem;height:auto;">
<div class="form-group">
<label for="comment">Annonce de présentation de l'antenne</label><p></p>
Ligne 1 <textarea id="edito1" class="form-control" rows="2" name="contenu1"></textarea>
Ligne 2 <textarea id="edito2" class="form-control" rows="2" name="contenu2"></textarea>
Ligne 3 <textarea id="edito3" class="form-control" rows="2" name="contenu3"></textarea>
Ligne 4 <textarea id="edito4" class="form-control" rows="2" name="contenu4"></textarea>
</div>
</div>
</div>
<button class="btn btn-primary" type="submit">Enregistrer</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,6 +1,8 @@
<?php
namespace App\Auth\Action;
if (!isset($_SESSION)) {
session_start();
}
use Framework\Renderer\RendererInterface;
use Psr\Http\Message\ServerRequestInterface;
@ -19,6 +21,14 @@ class LoginAction
public function __invoke(ServerRequestInterface $request)
{
return $this->renderer->render('@auth/login');
if ($_SESSION['connecte']) {
$_SESSION['logout'] = false;
//echo "session co = valeur";
//die();
} else {
//echo "session co = vide";
//die();
}
return $this->renderer->render('@auth/login', ['sess' => $_SESSION]);
}
}

View File

@ -1,16 +1,21 @@
<?php
namespace App\Auth\Action;
if (!isset($_SESSION)) {
session_start();
}
use App\Admin\Table\UserTable;
use App\Auth\DatabaseAuth;
use Framework\Actions\RouterAwareAction;
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Framework\Router;
use Framework\Session\ArraySession;
use Framework\Session\FlashService;
use Framework\Session\SessionInterface;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Expressive\Router\RouterInterface;
class LoginAttemptAction
{
@ -37,29 +42,64 @@ class LoginAttemptAction
RendererInterface $renderer,
DatabaseAuth $auth,
Router $router,
SessionInterface $session
SessionInterface $session,
UserTable $userTable
) {
$this->renderer = $renderer;
$this->auth = $auth;
$this->router = $router;
$this->session = $session;
$this->userTable = $userTable;
}
public function __invoke(ServerRequestInterface $request)
{
$params = $request->getParsedBody();
$user = $this->auth->login($params['username'], $params['password']);
if ($user) {
if(!isset($_SESSION)) {
session_start();
}
$nom_user = $_SESSION['user'] = $params['username'];
$path = $this->session->get('auth.redirect') ?? $this->router->generateUri('gmarche.index');
$this->session->delete('auth.redirect');
return new RedirectResponse($path);
$this->test_user($user, $params);
$_SESSION['logout']= false;
return $this->renderer->render('@gmarche/index');
} else {
(new FlashService($this->session))->error('Identifiant ou mot de passe incorrect');
return $this->redirect('auth.login');
}
}
public function test_user($user, $params) {
$role = $this->userTable->findBy('username', $params['username'])->role;
echo "params_username=".$params['username'];
echo "<br />role=".$role;
// die();
$path = $this->session->get('auth.redirect') ?: $this->router->generateUri('gmarche.index');
$this->session->delete('auth.redirect');
//$path = $this->router->generateUri('gmarche.index');
//return new RedirectResponse('/');
if ($this->session->get('username')) {
$this->session->delete('role');
$this->session->delete('username');
$this->session->set('username',$params['username']);
$this->session->set('role',$role);
} else {
$this->session->set('username',$params['username']);
$this->session->set('role',$role);
}
$_SESSION['connecte'] = $params['username'];
$_SESSION['role'] = $role;
echo "<br />role2=".$role;
// die();
//$this->renderer->addGlobal('user', $user);
//$this->renderer->addGlobal('role', $role);
}
private function show($role)
{
// $path = $this->router->generateUri('gmarche.index');
return $this->renderer->render('@gmarche/index');
}
}

View File

@ -1,10 +1,14 @@
<?php
namespace App\Auth\Action;
if (!isset($_SESSION)) {
session_start();
}
use App\Auth\DatabaseAuth;
use App\Framework\Response\RedirectBackResponse;
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Framework\Session\FlashService;
use Framework\Session\SessionInterface;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
@ -31,21 +35,25 @@ class LogoutAction
private $container;
public function __construct(RendererInterface $renderer, DatabaseAuth $auth, FlashService $flashService
, ContainerInterface $container)
, ContainerInterface $container, SessionInterface $session)
{
$this->renderer = $renderer;
$this->auth = $auth;
$this->flashService = $flashService;
$this->container = $container;
$this->session = $session;
}
public function __invoke(ServerRequestInterface $request)
{
$gmarchePrefix = $this->container->get('gmarche.prefix');
session_start();
unset($_SESSION['user']);
$_SESSION['connecte']='---';
$_SESSION['logout']=true;
if ($this->session->get('username')) {
$this->session->delete('username');
}
$this->auth->logout();
$this->flashService->success('Vous êtes maintenant déconnecté');
return new RedirectResponse("$gmarchePrefix");
return new RedirectBackResponse($request);
}
}

View File

@ -3,12 +3,16 @@ namespace App\Auth\Action;
use App\Auth\Mailer\PasswordResetMailer;
use App\Auth\UserTable;
use App\Framework\Response\RedirectBackResponse;
use Framework\Actions\RouterAwareAction;
use Framework\Database\NoRecordException;
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Framework\Router;
use Framework\Session\FlashService;
use Framework\Validator;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Expressive\Router\RouterInterface;
class PasswordForgetAction
{
@ -18,6 +22,10 @@ class PasswordForgetAction
*/
private $renderer;
/**
* @var RouterInterface
*/
private $router;
/**
* @var UserTable
*/
private $userTable;
@ -30,14 +38,17 @@ class PasswordForgetAction
*/
private $flashService;
use RouterAwareAction;
public function __construct(
RendererInterface $renderer,
Router $router,
UserTable $userTable,
PasswordResetMailer $mailer,
FlashService $flashService
) {
$this->renderer = $renderer;
$this->router = $router;
$this->userTable = $userTable;
$this->mailer = $mailer;
$this->flashService = $flashService;
@ -46,28 +57,36 @@ class PasswordForgetAction
public function __invoke(ServerRequestInterface $request)
{
if ($request->getMethod() === 'GET') {
return $this->renderer->render('@auth/password');
$affichage_div = true;
return $this->renderer->render('@auth/password',compact('affichage_div'));
}
$params = $request->getParsedBody();
//$url_part = explode('/',$request->getServerParams()['HTTP_REFERER'] ?? '/');
//$chemin = $url_part[3].'/'.$url_part[4];
$validator = (new Validator($params))
->notEmpty('email')
->email('email');
if ($validator->isValid()) {
try {
$user = $this->userTable->findBy('email', $params['email']);
if ($user = $this->userTable->findBy('email', $params['email'])) {
$token = $this->userTable->resetPassword($user->id);
$this->mailer->send($user->email, [
'id' => $user->id,
'token' => $token
]);
$this->flashService->success('Un email vous a été envoyé');
return new RedirectResponse($request->getUri()->getPath());
} catch (NoRecordException $e) {
$errors = ['email' => 'Aucun utilisateur ne correspond à cet email'];
$this->flashService->success("Un email a été envoyé à l'utilisateur");
$affichage_div = false;
return new RedirectBackResponse($request);
} else {
$this->flashService->error('Aucun utilisateur ne correspond à cet email');
}
} else {
$errors = $validator->getErrors();
}
return $this->renderer->render('@auth/password', compact('errors'));
$affichage_div = true;
$email = $params['email'];
return $this->renderer->render('@auth/password', compact('email','errors','affichage_div'));
}
}

View File

@ -52,7 +52,7 @@ class ForbiddenMiddleware implements MiddlewareInterface
public function redirectLogin(ServerRequestInterface $request): ResponseInterface
{
$this->session->set('auth.redirect', $request->getUri()->getPath());
(new FlashService($this->session))->error('Vous devez posséder un compte pour accéder à cette page');
//(new FlashService($this->session))->error('Vous devez posséder un compte pour accéder à cette page');
return new RedirectResponse($this->loginPath);
}
}

View File

@ -4,7 +4,7 @@ Site Ğ1-Marché
<p>
Vous avez demandé la réinitialisation de votre mot de passe.
<br />
Veuillez pour se faire, cliquer sur le lien ci-dessous :
Veuillez pour ce faire, cliquer sur le lien ci-dessous :
</p>
<p>
<a href="{{ domain }}{{ path('auth.reset', {id: id, token: token}) }}">{{ domain }}{{ path('auth.reset', {id: id, token: token}) }}</a>

View File

@ -2,6 +2,6 @@ Site Ğ1-Marché
Vous avez demandé la réinitialisation de votre mot de passe.
Veuillez pour se faire, cliquer sur le lien ci-dessous :
Veuillez pour ce faire, cliquer sur le lien ci-dessous :
{{ domain }}{{ path('auth.reset', {id: id, token: token}) }}

View File

@ -1,24 +1,25 @@
{% extends 'layout.twig' %}
{% block body %}
{% if flash('error') %}
<div class="alert alert-danger">
{{ flash('error') }}
</div>
{% endif %}
<!-- if flash('success') %}
<div class="alert alert-success">
flash('success')
</div>
endif -->
{% if flash('error') %}
<div class="alert alert-danger">
{{ flash('error') }}
</div>
{% endif %}
<!-- if flash('success') %}
<div class="alert alert-success">
flash('success')
</div>
endif -->
<div class="container" style="background-color: lightgray;opacity: 0.9;margin: 1rem;padding:1rem;">
<form action="" method="post">
{{ csrf_input() }}
{{ field('email', null, 'Email', {type: 'email'}) }}
<button class="btn btn-primary">Réinitialiser mon mot de passe</button>
</form>
</div>
{% if affichage_div %}
<div id="password" class="container" style="background-color: lightgray;opacity: 0.9;margin: 1rem;padding:1rem;">
<form action="" method="post">
<!-- csrf_input() -->
{{ field('email', null, 'Votre Email', {type: 'email'}) }}
<button class="btn btn-primary">Réinitialiser mon mot de passe</button>
</form>
</div>
{% endif %}
{% endblock %}

View File

@ -1,6 +1,8 @@
<?php
namespace App\Contact;
if (!isset($_SESSION)) {
session_start();
}
use Framework\Renderer\RendererInterface;
use Framework\Response\RedirectResponse;
use Psr\Http\Message\ServerRequestInterface;
@ -26,13 +28,23 @@ class ContactAction
public function __invoke(ServerRequestInterface $request)
{
if ($request->getMethod() === 'GET') {
session_start();
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
if (isset($_SESSION['connecte'])) {
$nom_user = $_SESSION['connecte'];
$role = $_SESSION['role'];
} else {
$nom_user = '';
$role = '3';
}
return $this->renderer->render('@contact/contact',compact('nom_user'));
if ($_SESSION['logout']) {
//echo "logout";
//die();
$sess = null;
} else {
//echo "non logout";
//die();
$sess = $_SESSION;
}
return $this->renderer->render('@contact/contact',compact('sess','nom_user','role'));
}
}
}

View File

@ -3,14 +3,6 @@
{% block title "Ğ1-Marché - Contact" %}
{% block body %}
<style>
/*body .fond {
background-image: url("../../images/background_contacts.jpg");
background-repeat: no-repeat;
background-attachment:fixed;
background-position: center;
background-size: 100% auto;
font-family: Bree serif,"Helvetica Neue", Helvetica, Arial, sans-serif;
}*/
.main {
width: 900px;
font-family: "Bree Serif", Arial;

View File

@ -2,13 +2,12 @@
namespace Framework\Actions;
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
use Framework\Database\Hydrator;
use Framework\Database\Table;
use Framework\Renderer\RendererInterface;
use Framework\Router;
use Framework\Session\FlashService;
use Framework\Validator;
use App\Product\Entity\Product;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -26,14 +25,9 @@ class CrudAction
private $router;
/**
* @var Table
*/
protected $table;
/**
* @var AntenneTable
*/
protected $table2;
protected $antenneTable;
/**
* @var FlashService
@ -54,9 +48,9 @@ class CrudAction
* @var string
*/
protected $messages = [
'create' => "L'élément truc a bien été créé", /* truc sera remplacé par le vrai nom ensuite */
'edit' => "L'élément truc a bien été modifié", /* truc sera remplacé par le vrai nom ensuite */
'delete' => "L'élément truc a bien été supprimé" /* truc sera remplacé par le vrai nom ensuite */
'create' => "L'antenne truc a bien été créée", /* truc sera remplacé par le vrai nom ensuite */
'edit' => "L'antenne truc a bien été modifiée", /* truc sera remplacé par le vrai nom ensuite */
'delete' => "L'antenne truc a bien été supprimée" /* truc sera remplacé par le vrai nom ensuite */
];
/**
@ -69,12 +63,14 @@ class CrudAction
public function __construct(
RendererInterface $renderer,
Router $router,
Table $table,
AntenneTable $antenneTable,
RegionTable $regionTable,
FlashService $flash
) {
$this->renderer = $renderer;
$this->router = $router;
$this->table = $table;
$this->antenneTable = $antenneTable;
$this->regionTable = $regionTable;
$this->flash = $flash;
}

View File

@ -1,7 +1,15 @@
<?php
namespace Framework\Auth;
if (!isset($_SESSION)) {
session_start();
}
error_reporting(E_ALL & ~E_NOTICE);
use App\Auth\UserTable;
use Framework\Auth;
use Framework\Response\RedirectResponse;
use Framework\Router;
use Framework\Session\FlashService;
use Framework\Session\SessionInterface;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface;
use Psr\Http\Message\ResponseInterface;
@ -14,17 +22,55 @@ class LoggedInMiddleware implements MiddlewareInterface
* @var Auth
*/
private $auth;
/**
* @var Router
*/
private $router;
/**
* @var SessionInterface
*/
private $session;
public function __construct(Auth $auth)
public function __construct(Auth $auth, Router $router, UserTable $userTable, SessionInterface $session)
{
$this->auth = $auth;
$this->router = $router;
$this->userTable = $userTable;
$this->session = $session;
}
public function process(ServerRequestInterface $request, DelegateInterface $delegate): ResponseInterface
{
$user = $this->auth->getUser();
if (is_null($user)) {
throw new ForbiddenException();
// echo "<pre>";
// var_dump($request);
// var_dump($_SESSION);
// echo "</pre>";
// die();
$user = $request->getAttribute('user');
if ($user != '' && $user != '---' && $_SESSION['connecte'] != '---') {
$_SESSION['connecte']=$user;
} else {
if ($_SESSION['connecte'] != '---') {
$username = $_SESSION['connecte'];
} else {
$url_part = explode('/', $request->getServerParams()['HTTP_REFERER'] ?? '/');
$username = $url_part[5];
}
if (!$_SESSION['logout']) {
if (is_null($username)) {
if (is_null($user)) {
$user = $this->auth->getUser();
} else {
$user = $this->userTable->findBy('username', $user);
}
} else {
$user = $this->auth->getUser() ?: $this->userTable->findBy('username', $username);
}
}
if (is_null($user) or $_SESSION['logout'] or $_SESSION['connecte'] == '---') {
(new FlashService($this->session))->error('Vous devez vous connecter pour accéder à cette page');
return new RedirectResponse($this->router->generateUri('auth.login'));
}
}
return $delegate->process($request->withAttribute('user', $user));
}

View File

@ -0,0 +1,64 @@
<?php
namespace Framework\Auth;
if (!isset($_SESSION)) {
session_start();
}
error_reporting(E_ALL & ~E_NOTICE);
use App\Auth\UserTable;
use Framework\Auth;
use Framework\Response\RedirectResponse;
use Framework\Router;
use Framework\Session\FlashService;
use Framework\Session\SessionInterface;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class LoginModalMiddleware implements MiddlewareInterface
{
/**
* @var Auth
*/
private $auth;
/**
* @var Router
*/
private $router;
/**
* @var SessionInterface
*/
private $session;
public function __construct(Auth $auth, Router $router, UserTable $userTable, SessionInterface $session)
{
$this->auth = $auth;
$this->router = $router;
$this->userTable = $userTable;
$this->session = $session;
}
public function process(ServerRequestInterface $request, DelegateInterface $delegate): ResponseInterface
{
$url_part = explode('/',$request->getServerParams()['PHP_SELF'] ?? '/');
$username = $url_part[4];
if (is_null($username)) {
$user = $this->auth->getUser() ?: $this->userTable->findBy('username', $request->getAttribute('user'));
} else {
$user = $this->auth->getUser() ?: $this->userTable->findBy('username', $username);
}
if (is_null($user)) {
(new FlashService($this->session))->error('Vous devez vous connecter pour accéder à cette page');
return new RedirectResponse($this->router->generateUri('auth.login'));
} else {
$this->session->set('username',$user->username);
$this->session->set('role',$user->role);
$_SESSION['connecte'] = $user->username;
$_SESSION['role'] = $user->role;
}
return $delegate->process($request->withAttribute('user', $user));
}
}

View File

@ -19,16 +19,26 @@ class RoleMiddleware implements MiddlewareInterface
*/
private $role;
public function __construct(Auth $auth, string $role)
public function __construct(Auth $auth, string $role, string $role2)
{
$this->auth = $auth;
$this->role = $role;
$this->role2 = $role2;
}
public function process(ServerRequestInterface $request, DelegateInterface $delegate): ResponseInterface
{
$user = $this->auth->getUser();
if ($user === null || !in_array($this->role, $user->getRoles())) {
//if (array_key_exists('premier', $search_array))
$non_admin = true;
if (!in_array($this->role, [$_SESSION['role']])) {
$non_admin = false;
}
if (!in_array($this->role2, [$_SESSION['role']])) {
$non_admin = false;
}
if ($user === null || $non_admin ) {
//if ($user === null || !array_key_exists($chaine_user,$this->role)) {
throw new ForbiddenException();
}
return $delegate->process($request);

View File

@ -17,8 +17,8 @@ class RoleMiddlewareFactory
$this->auth = $auth;
}
public function makeForRole($role): RoleMiddleware
public function makeForRole($role, $role2): RoleMiddleware
{
return new RoleMiddleware($this->auth, $role);
return new RoleMiddleware($this->auth, $role, $role2);
}
}

View File

@ -172,7 +172,7 @@ class Query implements \IteratorAggregate
{
$record = $this->fetch();
if ($record === false) {
throw new NoRecordException();
// throw new NoRecordException();
}
return $record;
}

View File

@ -81,6 +81,7 @@ class Table
public function findBy(string $field, string $value)
{
// echo "field = ".$field;
// echo "<br />value = ".$value;
// die();
return $this->makeQuery()->where("$field = :field")->params(["field" => $value])->fetchOrFail();
}

View File

@ -20,6 +20,7 @@ class TwigRendererFactory
'auto_reload' => $debug
]);
$twig->addExtension(new DebugExtension());
//$twig->addGlobal('session', $_SESSION);
if ($container->has('twig.extensions')) {
foreach ($container->get('twig.extensions') as $extension) {
$twig->addExtension($extension);

View File

@ -0,0 +1,16 @@
<?php
namespace App\Framework\Response;
use Framework\Response\RedirectResponse;
use Psr\Http\Message\ServerRequestInterface;
class RedirectBackResponse extends RedirectResponse
{
public function __construct(ServerRequestInterface $request)
{
parent::__construct($request->getServerParams()['HTTP_REFERER'] ?? '/');
}
}

View File

@ -72,27 +72,16 @@ class Router
* @param $callable
* @param string $prefixName
*/
/* public function crud(string $prefixPath, $callable, string $prefixName)
public function crud(string $prefixPath, $callable, string $prefixName)
{
$this->get("$prefixPath", $callable, "$prefixName.index");
$this->get("$prefixPath/new", $callable, "$prefixName.create");
$this->post("$prefixPath/new", $callable);
$this->get("$prefixPath/{id:\d+}", $callable, "$prefixName.edit");
$this->post("$prefixPath/{id:\d+}", $callable);
// $this->get("$prefixPath/{id:\d+}", $callable, "$prefixName.edit");
// $this->post("$prefixPath/{id:\d+}", $callable);
$this->delete("$prefixPath/{id:\d+}", $callable, "$prefixName.delete");
}*/
}
/* public function crud_product(string $prefixPath, $callable, string $prefixName)
{
$this->get("$prefixPath", $callable, "$prefixName.index");
$this->get("$prefixPath/new", $callable, "$prefixName.create");
$this->post("$prefixPath/new", $callable);
$this->get("$prefixPath/{id:\d+}", $callable, "$prefixName.edit");
$this->post("$prefixPath/{id:\d+}", $callable);
$this->delete("$prefixPath/{id:\d+}", $callable, "$prefixName.delete");
}*/
/**
* @param ServerRequestInterface $request
* @return Route|null

View File

@ -9,6 +9,7 @@ class SwiftMailerFactory
public function __invoke(ContainerInterface $container): \Swift_Mailer
{
if ($container->get('env') === 'production') {
//$transport = new \Swift_SmtpTransport('localhost', 1025);
$transport = new \Swift_SendmailTransport();
} else {
$transport = new \Swift_SmtpTransport('localhost', 1025);

View File

@ -1,98 +0,0 @@
<?php
namespace App\Framework\Twig;
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
use App\Product\Table\ProductTable;
use Framework\Actions\RouterAwareAction;
use Framework\Database\Table;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
class AntenneExtension extends \Twig_Extension
{
/**
* @var table
*/
private $table;
private $productTable;
private $regionTable;
private $antenneTable;
private $container;
// use RouterAwareAction;
// private $antenne_slug;
public function __construct(AntenneTable $antenneTable = null)
{
// $this->antenne_slug = $antenne_slug;
$this->table = $table;
$this->productTable = $productTable;
$this->regionTable = $regionTable;
$this->antenneTable = $antenneTable;
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('current_antenne', [$this, 'currentAntenne'])
];
}
/* public function pathFor(string $path, array $params = []): string
{
return $this->router->generateUri($path, $params);
}*/
/**
* @return \PDO
*/
public function getPdo(): \PDO
{
return $this->pdo;
}
public function currentAntenne(?\PDO $pdo = null, string $antenne_slug): int
{
//echo "antenne_slug=".$antenne_slug;
// die();
//$params = $request->getQueryParams();
echo "pdo";
var_dump($pdo);
die();
if (self::getPdo()) {
echo 'PDO true';
die();
} else {
echo 'PDO false';
die();
}
$region_id = $this->antenneTable->findBy('slug', 'paris')->id;
echo 'region_id';
var_dump($region_id);
// $test = $this->antenneTable->findWithAntenne('paris');
//$test2 = $this->table->findAllbyRegion(8);
$test1 = $this->productTable;
echo 'test1';
var_dump($test1);
$test2 = $this->table;
echo 'test2';
var_dump($test2);
die();
$test = $this->productTable->findBy('slug', 'badge');
echo 'test = ';
var_dump($test);
die();
echo 'test2 = '.var_dump($test2);
die();
//return $this->antenneTable->findBy('slug', 'paris')->id;
// return(1);
}
}

View File

@ -19,7 +19,7 @@ class UrlExtension extends \Twig_Extension
{
return [
//new \Twig_SimpleFunction('url', [$this, 'getUrl']),
new \Twig_SimpleFunction('explodeUrl', [$this, 'explodeUrl'])
new \Twig_SimpleFunction('explodeUrl', [$this, 'explodUrl'])
];
}
@ -27,7 +27,7 @@ class UrlExtension extends \Twig_Extension
{
return $_SERVER['REQUEST_URI'] ?? '/';
}*/
public function explodeUrl(): array
public function explodUrl(): array
{
$url = $_SERVER['REQUEST_URI'] ?? '/';
$url_parts = explode('/', $url);

View File

@ -0,0 +1,48 @@
<?php
namespace App\Framework\Twig;
use Framework\Session\SessionInterface;
class VariableExtension extends \Twig_Extension
{
/**
* @var SessionInterface
*/
private $session;
/**
* @var string
*/
//private $url;
public function __construct(SessionInterface $session)
{
$this->session = $session;
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('affiche_username', [$this, 'affich_usrname']),
new \Twig_SimpleFunction('affiche_role', [$this, 'affich_role']),
new \Twig_SimpleFunction('affiche_mail', [$this, 'affich_mail'])
];
}
public function affich_role(): ?string
{
$retour_aff = $this->session->get('role') ?: '';
return $retour_aff;
}
public function affich_usrname(): ?string
{
$retour_aff = $this->session->get('username') ?: '';
return $retour_aff;
}
public function affich_mail(): ?string
{
$retour_aff = $this->session->get('email') ?: '';
return $retour_aff;
}
}

View File

@ -1,14 +1,14 @@
<?php
namespace App\Gmarche\Actions;
if (!isset($_SESSION)) {
session_start();
}
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
use Framework\Actions\RouterAwareAction;
use Framework\Renderer\RendererInterface;
use Framework\Router;
use GuzzleHttp\Psr7\Response;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
class AntenneShowAction
@ -45,27 +45,28 @@ class AntenneShowAction
public function __invoke(Request $request)
{
$params = $request->getQueryParams();
$gmarchePrefix = $this->container->get('gmarche.prefix');
// On récupère l'id de la région cliquée
$region_id = $this->regionTable->findBy('slug', $request->getAttribute('slug'))->id;
$slug = $request->getAttribute('slug');
$page = $params['p'] ?? 1; // Si la page n'est pas définie, on l'initialise à 1
$antennes = $this->antenneTable->findAllbyRegion($region_id)->paginate(25, $page);
if ($request->getMethod() === 'GET') {
$params = $request->getQueryParams();
$gmarchePrefix = $this->container->get('gmarche.prefix');
// On récupère l'id de la région cliquée
$region_id = $this->regionTable->findBy('slug', $request->getAttribute('slug'))->id ?: 1;
$slug = $request->getAttribute('slug');
$page = $params['p'] ?? 1; // Si la page n'est pas définie, on l'initialise à 1
$antennes = $this->antenneTable->findAllbyRegion($region_id)->paginate(25, $page);
$region=$this->regionTable->findBy('slug', $request->getAttribute('slug'));
/*if ($region->slug !== $slug) {
return $this->redirect('gmarche.show', [
'slug' => $region->slug,
'id' => $region->id
]);
}*/
session_start();
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
} else {
$nom_user = '';
$region = $this->regionTable->findBy('slug', $request->getAttribute('slug'));
$var_test = 'test';
//var_dump($antennes);
//die();
/*if ($region->slug !== $slug) {
return $this->redirect('gmarche.show', [
'slug' => $region->slug,
'id' => $region->id
]);
}*/
$sess = $_SESSION;
return $this->renderer->render('@gmarche/antenne', compact('sess','page', 'gmarchePrefix','region', 'antennes'));
}
return $this->renderer->render('@gmarche/antenne', compact('nom_user','slug', 'region', 'gmarchePrefix','antennes', 'page'));
}
}

View File

@ -1,8 +1,12 @@
<?php
namespace App\Gmarche\Actions;
if (!isset($_SESSION)) {
session_start();
}
use App\Admin\Table\UserTable;
use Framework\Actions\RouterAwareAction;
use Framework\Renderer\RendererInterface;
use Psr\Http\Message\ServerRequestInterface;
class RegionIndexAction
{
@ -14,18 +18,28 @@ class RegionIndexAction
use RouterAwareAction;
public function __construct(
RendererInterface $renderer
RendererInterface $renderer,
UserTable $userTable
) {
$this->renderer = $renderer;
$this->userTable = $userTable;
}
public function __invoke()
public function __invoke(ServerRequestInterface $request)
{
session_start();
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
} else {
$nom_user = '';
/*$userId = $this->session->get('auth.user');*/
if ($request->getMethod() === 'GET') {
$accueil = true;
if (isset($_SESSION['connecte'])) {
$nom_user = $_SESSION['connecte'];
$role = $_SESSION['role'];
} else {
$nom_user = '';
$role = '3';
}
$sess = $_SESSION;
return $this->renderer->render('@gmarche/index', compact('sess','nom_user', 'accueil', 'role'));
}
return $this->renderer->render('@gmarche/index', compact('nom_user'));
}
}

View File

@ -20,6 +20,10 @@ class Antenne
public $createdAt;
public $regionId;
public $edito1;
public $edito2;
public $edito3;
public $edito4;
public function setCreatedAt($datetime)
{

View File

@ -12,7 +12,6 @@ class AntenneTable extends Table
protected $table = 'antennes';
public function findAllbyRegion(int $region_id): Query
{
$region = new RegionTable($this->pdo);
@ -22,22 +21,45 @@ class AntenneTable extends Table
->where("a.region_id = $region_id")
->order('a.name ASC');
}
/* public function getAntenne(string $antenne_slug): Query
public function findAllRegions(): Query
{
//$antenne = new AntenneTable($this->pdo);
return $this->makeQuery()
->select('a.*')
->where("a.slug = $antenne_slug")
->order('a.name ASC');
}
public function findPublic(): Query
{
return $this->findAll();
//$region = new RegionTable($this->pdo);
$table = 'regions';
return $this->makeQuery()
->select('r.*')
->order('r.name ASC');
}
public function findWithAntenne(int $antenne_slug): Antenne
public function findAnyAntennes(string $tri, $antennes_select): Query
{
return $this->findPublic()->where("a.slug = $antenne_slug")->fetch();
}*/
$region = new RegionTable($this->pdo);
if ($tri == 'tri_alpha') {
$order = 'a.name ASC';
} else {
$order = 'r.name, a.name ASC';
}
return $this->makeQuery()
->join($region->getTable() . ' as r', 'region_id = r.id')
->select('a.id, region_id as regionId, r.name as regionName, a.name as antenneName,
r.slug as regionSlug, a.slug as antenneSlug, edito1, edito2, edito3, edito4, gmarcheAt')
->where("a.id IN ($antennes_select)")
->order($order);
}
public function findAllAntennes(string $tri): Query
{
$region = new RegionTable($this->pdo);
if ($tri == 'tri_alpha') {
$order = 'a.name ASC';
} else {
$order = 'r.name, a.name ASC';
}
return $this->makeQuery()
->join($region->getTable() . ' as r', 'region_id = r.id')
->select('a.id, region_id as regionId, r.name as regionName, a.name as antenneName,
r.slug as regionSlug, a.slug as antenneSlug, edito1, edito2, edito3, edito4, gmarcheAt')
->order($order);
}
}

View File

@ -4,19 +4,23 @@
Ğ1-Marché : Régions {% if page > 1 %}, page {{ page }} {% endif %}
{% endblock %}
{% block body %}
{% if flash('error') %}
<div class="alert alert-danger">
{{ flash('error') }}
</div>
{% endif %}
<div class="container home">
<img id="logo_home" src="\images\logo_home.jpg"/>
<ul class="list-group list-group-flush">
<div class="mapcontainer">
<div class="map">
<span>Alternative content for the map</span>
</div>
<div class="areaLegend"></div>
<div class="plotLegend"></div>
<ul class="list-group list-group-flush">
<div class="mapcontainer">
<div class="map">
<span>Alternative content for the map</span>
</div>
</ul>
</div>
<div class="areaLegend"></div>
<div class="plotLegend"></div>
</div>
</ul>
</div>
<script type="text/javascript">
$(".container").mapael({

View File

@ -1,6 +1,8 @@
<?php
namespace App\Product\Actions;
if (!isset($_SESSION)) {
session_start();
}
use App\Auth\UserTable;
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
@ -45,26 +47,35 @@ class ProductIndexAction
{
$params = $request->getQueryParams();
$gmarchePrefix = $this->container->get('gmarche.prefix');
$antenne_slug =$request->getAttribute('slug');
$region_slug =$request->getAttribute('region');
$antenne_slug = $request->getAttribute('slug');
$region_slug = $request->getAttribute('region');
$requete = $this->antenneTable->findBy('slug', $antenne_slug);
$antenne_name = $requete->name;
$antenne_id = $requete->id;
$edito1 = $requete->edito1;
$edito2 = $requete->edito2;
$edito3 = $requete->edito3;
$edito4 = $requete->edito4;
$requete_region = $this->regionTable->findBy('slug', $region_slug);
$region_name = $requete_region->name;
$page = $params['p'] ?? 1;
$viewPath = '@product/admin/products';
$items = $this->productTable->findByAntenneId('antenne_id', $antenne_id)->paginate(20, $page);
session_start();
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
if (isset($_SESSION['connecte']) && $_SESSION['connecte'] != '---') {
$nom_user = $_SESSION['connecte'];
$requete_user = $this->userTable->findBy('username', $nom_user);
$user_id = $requete_user->id;
$suiviantenne = $requete_user->suiviantenne;
} else {
$nom_user = '';
$user_id = '';
$nom_user = '';
$user_id = '';
$suiviantenne = '';
}
return $this->renderer->render($viewPath.'/index', compact('nom_user','user_id', 'antenne_slug','gmarchePrefix','region_name','region_slug','antenne_id','antenne_name','viewPath', 'items' ));
$sess = $_SESSION;
return $this->renderer->render($viewPath.'/index', compact('sess','nom_user','user_id',
'antenne_slug','gmarchePrefix','region_name','region_slug','antenne_id','antenne_name','viewPath',
'items', 'suiviantenne','edito1', 'edito2','edito3','edito4' ));
}
}

View File

@ -1,6 +1,8 @@
<?php
namespace App\Product\Actions;
if (!isset($_SESSION)) {
session_start();
}
use App\Auth\UserTable;
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
@ -51,22 +53,27 @@ class RechIndexAction
$requete = $this->antenneTable->findBy('slug', $antenne_slug);
$antenne_name = $requete->name;
$antenne_id = $requete->id;
$edito1 = $requete->edito1;
$edito2 = $requete->edito2;
$edito3 = $requete->edito3;
$edito4 = $requete->edito4;
$requete_region = $this->regionTable->findBy('slug', $region_slug);
$region_name = $requete_region->name;
$page = $params['p'] ?? 1;
//$routePrefix = 'product.admin';
//$routePrefix = 'product.index';
$viewPath = '@product/admin/recherches';
$items = $this->rechTable->findByAntenneId('antenne_id', $antenne_id)->paginate(20, $page);
session_start();
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
if (isset($_SESSION['connecte']) && $_SESSION['connecte'] != '---') {
$nom_user = $_SESSION['connecte'];
$requete_user = $this->userTable->findBy('username', $nom_user);
$user_id = $requete_user->id;
} else {
$nom_user = '';
$user_id = '';
}
return $this->renderer->render($viewPath.'/index', compact('nom_user','user_id','antenne_slug','gmarchePrefix','region_name','region_slug','antenne_id','antenne_name','viewPath', 'items' ));
$sess = $_SESSION;
return $this->renderer->render($viewPath.'/index', compact('sess','nom_user','user_id',
'antenne_slug','gmarchePrefix','region_name','region_slug','antenne_id','antenne_name','viewPath',
'items', 'edito1', 'edito2','edito3','edito4' ));
}
}

View File

@ -2,7 +2,6 @@
{% extends 'layout.twig' %}
{% block title "Ğ1-Marché - Produits" %}
{% block body %}
<script type="text/javascript" src="/js/script.js"></script>
<div class="container_main">
@ -13,7 +12,6 @@
<li class="breadcrumb-item"><a href="{{ gmarchePrefix }}">France</a></li>
<li class="breadcrumb-item"><a href="{{ gmarchePrefix }}france/{{ region_slug }}">{{ region_name }}</a></li>
<li class="breadcrumb-item active">G-Marché de {{ antenne_name }}</li>
<div class="toggle_radio">
<input type="radio" checked class="toggle_option" id="first_toggle" name="toggle_option">
<input style="color:black;" type="radio" class="toggle_option" id="second_toggle" name="toggle_option">
@ -26,43 +24,59 @@
<div class="toggle_option_slider">
</div>
</div>
ant={{ antenne_id }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<li class="breadcrumb-item">
<div class="custom-control custom-checkbox">
{% set checked = '' %}
{% set antenne_suivie = suiviantenne|split('|') %}
{% for antenn in antenne_suivie %}
{% if (antenn == antenne_id) %}
<script type="text/javascript">
$(document).ready(function(){
$('input:checkbox[id=suivi]').attr('checked',true);
});
</script>
{% endif %}
{% endfor %}
<input type="checkbox" class="custom-control-input pull-right" id="suivi"
onclick="UpdateSuiviAntenne('{{ user_id }}','{{ antenne_id }}',
document.getElementById('suivi').checked)">
<label class="custom-control-label" for="suivi">SUIVI</label>
</div>
</li>
</ol>
</nav>
</div>
<div id="la_page">
{% if antenne_name == 'Paris' %}
<script type="text/javascript">
$('.fond').css('background-image', "url('/images/toureiffel.jpeg')");
$(".fond").css("background-image", "url('/images/toureiffel.jpeg')");
</script>
{% endif %}
{% endif %}
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="container" style="font-size:18px; color:white;line-height:1.4rem;">
<div>Tous les mois, la Toile Francilienne organise des rencontres entre utilisateurs de la Monnaie Libre.</div>
C'est l'occasion rêvée d'échanger avec d'autres membres !
{{ annonce_ligne1 }}
{{ annonce_ligne2 }}
{{ annonce_ligne3 }}
<p></p>
<div>Consultez, rajoutez, modifiez vos propositions dans la liste du mois.</div>
Mettez bien le pseudo, la clé publique, le bien ou service, et le prix en june.
<div class="row">
<div class="col-md-12">
<div class="container" style="font-size:18px; color:white;line-height:1.4rem;">
<div>
{{ edito1 }}
<p>{{ edito2 }}</p>
{{ edito3 }}
<p>{{ edito4 }}</p>
</div>
<p>
{% if affiche_username() != '' or (sess.connecte != '' and sess.connecte != '---') %}
<button style="color:white; font-size: 14px;" class="btn btn-primary" data-toggle="modal" data-target="#add_new_record_modal">Ajouter un bien ou service
{% else %}
<p>
<span style="color:lightgray;">Veuillez vous identifier dans la barre à droite
ci-dessus pour ajouter/modifier/supprimer des éléments</span>
</p>
{% endif %}
</button>
</p>
<div class="records_content"></div>
</div>
<p>
{% if nom_user != '' %}
<button style="color:white; font-size: 14px;" class="btn btn-primary" data-toggle="modal" data-target="#add_new_record_modal">Ajouter un bien ou service
{% else %}
<p>
<span style="color:lightgray;">Veuillez vous identifier dans la barre à droite
ci-dessus pour ajouter/modifier/supprimer des éléments</span>
</p>
{% endif %}
</button>
</p>
<div class="records_content"></div>
</div>
</div>
</div>
<div class="modal fade" id="add_new_record_modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
@ -121,6 +135,9 @@
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
</div>
<div class="modal-body">
<form method='post' action='' enctype="multipart/form-data">
Choisir la nouvelle image : <input type='file' name='file' id='avatar' class='form-control' ><br>
</form>
<div class="form-group">
<label for="update_vendeur">Vendeur</label>
<input type="input" disabled="disabled" id="update_vendeur" placeholder="Vendeur" class="form-control"/>

View File

@ -39,23 +39,20 @@
<div class="row">
<div class="col-md-12">
<div class="container" style="font-size:18px; color:white;line-height:1.4rem;">
<div>Tous les mois, la Toile Francilienne organise des rencontres entre utilisateurs de la Monnaie Libre.</div>
C'est l'occasion rêvée d'échanger avec d'autres membres !
{{ annonce_ligne1 }}
{{ annonce_ligne2 }}
{{ annonce_ligne3 }}
<p></p>
<div>Consultez, rajoutez, modifiez vos propositions dans la liste du mois.</div>
Mettez bien le pseudo, la clé publique, le bien ou service, et le prix en june.
<div>
{{ edito1 }}
<p>{{ edito2 }}</p>
{{ edito3 }}
<p>{{ edito4 }}</p>
</div>
<p>
{% if nom_user != '' %}
<button style="color:white; font-size: 14px;" class="btn btn-primary" data-toggle="modal" data-target="#add_new_record_modal">Ajouter un bien ou service
{% else %}
<p>
<span style="color:lightgray;">Veuillez vous identifier dans la barre à droite
{% if affiche_username() != '' or (sess.connecte != '' and sess.connecte != '---') %}
<button style="color:white; font-size: 14px;" class="btn btn-primary" data-toggle="modal" data-target="#add_new_record_modal">Ajouter un bien ou service
{% else %}
<p>
<span style="color:lightgray;">Veuillez vous identifier dans la barre à droite
ci-dessus pour ajouter/modifier/supprimer des éléments</span>
</p>
</p>
{% endif %}
</button>
</p>

View File

@ -10,6 +10,9 @@
<link rel="stylesheet" href="/css/mapael.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/products.css">
<!-- <link rel="stylesheet" href="/css/jquery-ui.css">-->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/3.0.7/flatpickr.css">
<style>
body {
padding-top: 5rem;
@ -30,11 +33,14 @@
}
</style>
<script type="text/javascript" src="/js/jquery-3.4.1.min.js"></script>
<!-- <script type="text/javascript" src="/js/jquery-ui.js"></script>-->
<script type="text/javascript" src="/js/connex.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js" charset="utf-8"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.7/raphael.min.js" charset="utf-8"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-mapael/2.1.0/js/jquery.mapael.min.js" charset="utf-8"></script>
<script type="text/javascript" src="https://rawgit.com/neveldo/mapael-maps/master/france/france_regions_2016.js" charset="utf-8"></script>
<!--<script type="text/javascript" src="/js/datepicker-fr.js"></script>-->
</head>
<body class="fond page">
<div class="site">
@ -42,39 +48,67 @@
<a class="navbar-brand" href="#">Ğ1-Marché</a>
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link {% if regions %} active{% endif %}" style="font-size:14px;"
<a class="nav-link {% if accueil %} active{% endif %}" style="font-size:14px;"
href="{{ path('gmarche.index') }}">Accueil</a>
</li>
{% if (affiche_role()==0 or affiche_role()==1 or affiche_role()==2) and (affiche_username() !=''
or (sess.connecte != '' and sess.connecte != '---')) %}
<li class="nav-item">
{% if affiche_username() !='' %}
<a class="nav-link {% if explodeUrl()[1]=='dashboard' %} active{% endif %}" style="font-size:14px;"
href="{{ path('dashboard',{user:affiche_username()}) }}">Administration</a>
{% else %}
{% if (sess.connecte != '' and sess.connecte != '---') %}
<a class="nav-link {% if explodeUrl()[1]=='dashboard' %} active{% endif %}" style="font-size:14px;"
href="{{ path('dashboard',{user:sess.connecte}) }}">Administration</a>
{% endif %}
{% endif %}
</li>
{% endif %}
<li class="nav-item">
<a class="nav-link {% if explodeUrl()[1]=='contact' %} active{% endif %}" style="font-size:14px;"
href="{{ path('contact') }}">Qui sommes-nous ?</a>
href="{{ path('contact') }}">Qui sommes-nous ?
</a>
</li>
</ul>
<div class="navbar-nav">
<div class="navbar-text" style="color:lightgray;margin-right:15px; margin-top:3px;">
{{ "now"|date('d/m/y') }}
</div>
{% if nom_user != '' %}
<!-- <button style="background-color: transparent;padding:0;border:0;" -->
<form method="post" style="margin-top:5px;" action="{{ path('account.profil') }}">
{% if affiche_username() != '' or (sess.connecte != '' and sess.connecte != '---') %}
<form method="post" style="margin-top:5px;" action="{{ path('account.profil',{user:affiche_username()}) }}">
<span><img src="\avatar_user.png" width="22" height="22" /></span>
<!--<span id="nom_connecte"> nom_user </span>-->
<button style="color:white;font-size: 14px;" class="btn-primary">{{ nom_user }}</button>
<button id="nom_connecte_bis" style="color:white;font-size: 14px;" class="btn-primary">
{% if affiche_username() != '' %}
{{ affiche_username() }}
{% else %}
{{ sess.connecte }}
{% endif %}
</button>
<div style="width:0;height:0;">
{{ field('email', affiche_mail(), "", {type: 'hidden'}) }}
</div>
</form>
<form method="post" action="{{ path('auth.logout') }}">
<!-- csrf_input() }}-->
<button class="btn btn-danger" style="margin-left: 7px; font-size:14px;">Se déconnecter</button>
</form>
{% else %}
<form id="formulaire" method="post" style="margin-top:5px;" action="{{ path('account.profil',{user:''}) }}">
<div class="nav-item" id="avatar-user" style="display:none;padding-top:0.1rem;margin-right:0.4rem;">
</div>
<div class="nav-item" id="user-connecte" style="display:none;padding-top:0.1rem;">
<button id="contenu_bouton" style="color:white; font-size: 14px;" class="btn-primary">
</button>
</div>
</form>
<div class="nav-item" id="bouton-connexion">
<button style="color:white; font-size: 14px;" class="btn btn-primary" data-toggle="modal" data-target="#connexion_modal">Se connecter</button>
</div>
<div id="nom_connecte" style="display:none;margin-left:10px;margin-top:6px;margin-right:8px;">
<button style="color:white; font-size: 14px;" class="btn btn-primary" data-toggle="modal" data-target="#connexion_modal">SE CONNECTER</button>
</div>
<div id="deconnexion" style="display:none;">
<form method="post" action="{{ path('auth.logout') }}">
<!-- csrf_input() }}-->
<button class="btn btn-danger" style="font-size:14px;">Se déconnecter</button>
<button class="btn btn-danger" style="font-size:14px;margin-left:0.5rem;">Se déconnecter</button>
</form>
</div>
<div class="nav-item" id="inscription">
@ -103,7 +137,7 @@
<div class="modal-body">
<div class="form-group">
<label for="pseudo">Pseudo</label>
<input type="text" id="pseudo" placeholder="{{ nom_user }}" class="form-control"/>
<input type="text" id="pseudo" placeholder="Saisir votre pseudo SVP" class="form-control"/>
</div>
<div class="form-group">
<label for="mdp">Mot de passe</label>
@ -123,8 +157,6 @@
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js"></script>
</div>