Merge backend-admin sur branche master

This commit is contained in:
nox 2019-12-09 23:22:09 +01:00
commit e19b374ddd
30 changed files with 715 additions and 224 deletions

4
.gitignore vendored
View File

@ -4,8 +4,8 @@ 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

55
config/config-backup.php Normal file
View File

@ -0,0 +1,55 @@
<?php
use App\Framework\Twig\UrlExtension;
use Framework\Middleware\CsrfMiddleware;
use Framework\Renderer\RendererInterface;
use Framework\Renderer\TwigRendererFactory;
use Framework\Router;
use Framework\Router\RouterFactory;
use Framework\Router\RouterTwigExtension;
use Framework\Session\PHPSession;
use Framework\Session\SessionInterface;
use Framework\Twig\{
CsrfExtension, FlashExtension, FormExtension, PagerFantaExtension, TextExtension, TimeExtension
};
include 'conf.php';
return [
'env' => \DI\env('ENV', 'production'),
/*'env' => \DI\env('ENV', 'development'),*/
'database.host' => $host,
//'database.username' => 'guser',
'database.username' => $username,
//'database.password' => 'kptgT81U7nzYWHBdQ9',
'database.password' => $password,
'database.name' => $database_name,
'views.path' => dirname(__DIR__) . '/views',
'twig.extensions' => [
\DI\get(RouterTwigExtension::class),
\DI\get(PagerFantaExtension::class),
\DI\get(TextExtension::class),
\DI\get(TimeExtension::class),
\DI\get(FlashExtension::class),
\DI\get(FormExtension::class),
\DI\get(CsrfExtension::class),
\DI\get(UrlExtension::class)
],
SessionInterface::class => \DI\object(PHPSession::class),
CsrfMiddleware::class => \DI\object()->constructor(\DI\get(SessionInterface::class)),
Router::class => \DI\factory(RouterFactory::class),
RendererInterface::class => \DI\factory(TwigRendererFactory::class),
\PDO::class => function (\Psr\Container\ContainerInterface $c) {
return new PDO(
'mysql:host='. $c->get('database.host') . ';dbname=' . $c->get('database.name'),
$c->get('database.username'),
$c->get('database.password'),
[
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
);
},
// MAILER
'mail.to' => 'mailto@admin.fr',
'mail.from' => 'no-reply@admin.fr',
Swift_Mailer::class => \DI\factory(\Framework\SwiftMailerFactory::class)
];

View File

@ -167,18 +167,24 @@ header.header img {
display: block;
margin: auto;
}
/******************************************************************/
/* dashboard.twig */
/******************************************************************/
.tab-de-bord {
background-color: brown;
padding: 1rem;
min-width: 350px;
}
/******************************************************************/
/* layout.twig */
/******************************************************************/
.mdp_oublie:hover {
background-color: deepskyblue;
}
/******************************************************************/
/* LOADING PUBKEY */
/******************************************************************/
#cle_pub {
display: none;
}
@ -200,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: 280px;
}
/******************************************************************/
/* layout.twig */
/******************************************************************/
.fond {
background-color: black;
background-image: url("../images/bildreich_1275.jpg");

View File

@ -34,18 +34,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)

View File

@ -8,7 +8,7 @@ try {
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);
@ -17,6 +17,7 @@ try {
if (password_verify($_POST['mdp'],$row['password'])) {
session_start();
$_SESSION['user']=$row['username'];
$_SESSION['role']=$row['role'];
echo '{"valide":true,"username":"'.$row['username'].'"}';
} else {
echo '{"valide":false}';

View File

@ -8,14 +8,14 @@
// 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

@ -0,0 +1,70 @@
<?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 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,
UserTable $userTable
) {
$this->renderer = $renderer;
$this->auth = $auth;
$this->flashService = $flashService;
$this->userTable = $userTable;
}
public function __invoke(ServerRequestInterface $request)
{
$user = $this->auth->getUser();
var_dump($user);
die();
$params = $request->getParsedBody();
$validator = (new Validator($params))
->required('username', 'actif');
if ($validator->isValid()) {
$userParams = [
'username' => $params['username'],
'actif' => $params['actif']
];
$this->userTable->update($user->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($request->getUri()->getPath());
}
$errors = $validator->getErrors();
return $this->renderer->render('@account/account', compact('user', 'errors'));
}
}

View File

@ -2,8 +2,7 @@
namespace App\Admin;
use App\Product\Actions\ProductIndexAction;
use App\Product\Actions\ProductCrudAction;
use App\Account\Action\ActiveAction;
use Framework\Module;
use Framework\Renderer\RendererInterface;
use Framework\Renderer\TwigRenderer;
@ -11,7 +10,6 @@ use Framework\Router;
class AdminModule extends Module
{
const DEFINITIONS = __DIR__ . '/config.php';
public function __construct(
@ -19,13 +17,14 @@ 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) {
)
{
$router->get('/dashboard', DashboardAction::class, 'dashboard');
$router->get('/dashboard/{user:[a-zA-Z\-0-9]+}', DashboardUserAction::class, 'dashboard.user');
$router->get('/activation', ActiveAction::class, 'account.active');
$router->post('/activation', ActiveAction::class);
if ($renderer instanceof TwigRenderer) {
$renderer->getTwig()->addExtension($adminTwigExtension);
}*/
}
}
}

View File

@ -0,0 +1,66 @@
<?php
namespace App\Admin;
use App\Admin\Table\UserTable;
use App\Gmarche\Table\AntenneTable;
use Framework\Renderer\RendererInterface;
use Psr\Http\Message\ServerRequestInterface;
class DashboardAction
{
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var AntenneTable
*/
private $antenneTable;
/**
* @var UserTable
*/
private $userTable;
public function __construct(
RendererInterface $renderer,
AntenneTable $antenneTable,
UserTable $userTable)
{
$this->renderer = $renderer;
$this->antenneTable = $antenneTable;
$this->userTable = $userTable;
}
/**
* @param ServerRequestInterface $request
* @return string
*/
public function __invoke(ServerRequestInterface $request)
{
if ($request->getMethod() === 'GET') {
$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();
if (!isset($_SESSION)) {
session_start();
}
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
$role = $_SESSION['role'];
} else {
$nom_user = '';
$role = '3';
}
return $this->renderer->render('@admin/dashboard',
compact('nom_user','role', 'liste_adminGeneral', 'liste_users_suivi',
'liste_adminAntenne', 'listeAntennes'));
}
}
}

View File

@ -0,0 +1,76 @@
<?php
namespace App\Admin;
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');
$username = $request->getAttribute('user');
$profil_user = $this->userTable->findBy('username', $username);
// var_dump($profil_user);
// die();
$listeAntennes = $this->antenneTable->findAllAntennes();
if (!isset($_SESSION)) {
session_start();
}
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
$role = $_SESSION['role'];
} else {
$nom_user = '';
$role = '3';
}
return $this->renderer->render('@admin/dashboard_user',
compact('nom_user','role','username','profil_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,65 @@
<?php
namespace App\Admin\Table;
use App\Admin\Entity\User;
use App\Gmarche\Table\AntenneTable;
use App\Gmarche\Table\RegionTable;
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");
}
}

View File

@ -0,0 +1,105 @@
{% 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 role == '0' %} Super Admin{% endif %}
{% if role == '1' %} Admin général{% endif %}
{% if role == '2' %} Admin Antenne{% endif %}
</h4>
</h3>
</div>
<p></p>
{% if 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 (role == '0' or 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 (role == '0' or role == '1' or role == '2') %}
<h4>Liste des régions/antennes</h4>
<ul class="list-group list-group-flush">
{% set antenne = '' %}
{% 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 antenne = item.antenneName %}
{% set region = item.regionName %}
{% endfor %}
</ul>
{% endif %}
<p></p>
{% if (role == '0' or role == '1' or 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 %}
</li>
</a>
{% endfor %}
</ul>
{% endif %}
<p></p>
{% if (role == '0' or role == '1') %}
<h4>Gestion d'une antenne</h4>
{% endif %}
<p></p>
{% if (role == '0' or role == '1' or role == '2') %}
<h4>Gestion d'un G-Marché</h4>
{% endif %}
<div class="row">
{{ widgets | raw }}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,65 @@
{% extends 'layout.twig' %}
{% block title "Ğ1-Marché - Tableau de bord User" %}
{% 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 User - {{ username }}</h3>
</div>
<ul class="list-group list-group-flush">
<div class="container" style="color:black;background-color: lightgray;opacity: 0.9;margin: 1rem;padding:1rem;">
<form action="{{ path('account.active') }}" method="post">
<button class="btn btn-primary">Désactiver l'utilisateur</button>
{{ field('actif', false, "", {type: 'hidden'}) }}
{{ field('username', username, "", {type: 'hidden'}) }}
</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;margin: 1rem;padding:1rem;">
<form action="" method="post">
<!-- csrf_input() -->
{{ field('firstname', profil_user.firstname, 'Prénom') }}
{{ field('lastname', profil_user.lastname, 'Nom') }}
Adresse mail {{ profil_user.email }}<p></p>
Clé publique {{ profil_user.pubkey }}
<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: 1rem;padding:1rem;">
<form action="" method="post">
<button class="btn btn-primary">Renvoyer un mot de passe</button>
</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 = profil_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>
{% 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,46 @@
<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') }}
</div>
{% if name_user != '' %}
<form method="post" style="margin-top:5px;" action="{{ path('account.profil') }}">
<span><img src="\avatar_user.png" width="22" height="22" /></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">
@ -47,14 +76,6 @@
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
<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'
})
</script>
</body>
</html>

View File

@ -1,6 +1,7 @@
<?php
namespace App\Auth\Action;
use App\Admin\Table\UserTable;
use App\Auth\DatabaseAuth;
use Framework\Actions\RouterAwareAction;
use Framework\Renderer\RendererInterface;
@ -37,12 +38,14 @@ 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)
@ -53,7 +56,7 @@ class LoginAttemptAction
if(!isset($_SESSION)) {
session_start();
}
$nom_user = $params['username'];
$_SESSION['role'] = $this->userTable->findRole($params['username']);
$_SESSION['user'] = $params['username'];
$path = $this->session->get('auth.redirect') ?: $this->router->generateUri('gmarche.index');
$this->session->delete('auth.redirect');

View File

@ -42,7 +42,9 @@ class LogoutAction
public function __invoke(ServerRequestInterface $request)
{
$gmarchePrefix = $this->container->get('gmarche.prefix');
session_start();
if(!isset($_SESSION)) {
session_start();
}
unset($_SESSION['user']);
$this->auth->logout();
$this->flashService->success('Vous êtes maintenant déconnecté');

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

@ -26,13 +26,17 @@ class ContactAction
public function __invoke(ServerRequestInterface $request)
{
if ($request->getMethod() === 'GET') {
session_start();
if (!isset($_SESSION)) {
session_start();
}
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
$role = $_SESSION['role'];
} else {
$nom_user = '';
$role = '3';
}
return $this->renderer->render('@contact/contact',compact('nom_user'));
return $this->renderer->render('@contact/contact',compact('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;
@ -91,6 +83,7 @@
</script>
{% endif %}
<div class="main" style="background:none;">
nom_user = {{ nom_user }}
<div class="header">
<img class="img_header" src="/images/logo_contacts.jpg" style="width: 294px;height: 294px;" alt="Ğ1-Marché" title="Logo Contact" />
</div>

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

@ -9,8 +9,8 @@ class SwiftMailerFactory
public function __invoke(ContainerInterface $container): \Swift_Mailer
{
if ($container->get('env') === 'production') {
//$transport = new \Swift_SendmailTransport();
$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

@ -60,7 +60,9 @@ class AntenneShowAction
'id' => $region->id
]);
}*/
session_start();
if (!isset($_SESSION)) {
session_start();
}
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
} else {

View File

@ -20,12 +20,17 @@ class RegionIndexAction
}
public function __invoke()
{
session_start();
if (!isset($_SESSION)) {
session_start();
}
$accueil = true;
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
$role = $_SESSION['role'];
} else {
$nom_user = '';
$role = '3';
}
return $this->renderer->render('@gmarche/index', compact('nom_user'));
return $this->renderer->render('@gmarche/index', compact('nom_user','accueil','role'));
}
}

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,12 @@ class AntenneTable extends Table
->where("a.region_id = $region_id")
->order('a.name ASC');
}
/* public function getAntenne(string $antenne_slug): Query
public function findAllAntennes(): Query
{
//$antenne = new AntenneTable($this->pdo);
return $this->makeQuery()
->select('a.*')
->where("a.slug = $antenne_slug")
->order('a.name ASC');
$region = new RegionTable($this->pdo);
return $this->makeQuery()
->join($region->getTable() . ' as r', 'a.region_id = r.id')
->select('a.id, r.name as regionName, a.name as antenneName')
->order('r.name, a.name ASC');
}
public function findPublic(): Query
{
return $this->findAll();
}
public function findWithAntenne(int $antenne_slug): Antenne
{
return $this->findPublic()->where("a.slug = $antenne_slug")->fetch();
}*/
}

View File

@ -56,7 +56,9 @@ class ProductIndexAction
$page = $params['p'] ?? 1;
$viewPath = '@product/admin/products';
$items = $this->productTable->findByAntenneId('antenne_id', $antenne_id)->paginate(20, $page);
session_start();
if (!isset($_SESSION)) {
session_start();
}
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
$requete_user = $this->userTable->findBy('username', $nom_user);

View File

@ -58,7 +58,9 @@ class RechIndexAction
//$routePrefix = 'product.index';
$viewPath = '@product/admin/recherches';
$items = $this->rechTable->findByAntenneId('antenne_id', $antenne_id)->paginate(20, $page);
session_start();
if (!isset($_SESSION)) {
session_start();
}
if (isset($_SESSION['user'])) {
$nom_user = $_SESSION['user'];
$requete_user = $this->userTable->findBy('username', $nom_user);

View File

@ -42,12 +42,19 @@
<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 role=='0' or role=='1' or role=='2' %}
<li class="nav-item">
<a class="nav-link {% if explodeUrl()[1]=='dashboard' %} active{% endif %}" style="font-size:14px;"
href="{{ path('dashboard') }}">Administration</a>
</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">
@ -57,7 +64,6 @@
{% if nom_user != '' %}
<form method="post" style="margin-top:5px;" action="{{ path('account.profil') }}">
<span><img src="\avatar_user.png" width="22" height="22" /></span>
<!--<span id="nom_connecte"> nom_user </span>-->
<button id="nom_connecte" style="color:white;font-size: 14px;" class="btn-primary">{{ nom_user }}</button>
</form>
<form method="post" action="{{ path('auth.logout') }}">