Merge branch 'backend-user'

This commit is contained in:
nox 2019-12-09 22:46:36 +01:00
commit 9096865ecb
15 changed files with 259 additions and 52 deletions

3
.gitignore vendored
View File

@ -1,4 +1,5 @@
config/config.php
config/config-backup.php
scripts/.loc_hash
.idea
public/uploads/*
@ -7,4 +8,4 @@ public/uploads/*
vendor
composer.json
composer.lock
/src/Framework/SwiftMailerFactory.php
src/Framework/SwiftMailerFactory.php

View File

@ -48,6 +48,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)
];

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 */
/******************************************************************/

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

@ -237,7 +237,7 @@ $(document).ready(function () {
$("#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 +305,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');
}
});
});
});

View File

@ -5,7 +5,7 @@ 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

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

@ -5,6 +5,7 @@ use App\Account\Action\AccountAction;
use App\Account\Action\AccountEditAction;
use App\Account\Action\ProfilAction;
use App\Account\Action\SignupAction;
use App\Auth\Action\PasswordForgetAction;
use Framework\Auth\LoggedInMiddleware;
use Framework\Module;
use Framework\Renderer\RendererInterface;
@ -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->get('/profil-utilisateur', [PasswordForgetAction::class, ProfilAction::class], 'account.profil');
$router->post('/profil-utilisateur', ProfilAction::class);
}
}

View File

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

View File

@ -1,15 +1,71 @@
{% extends 'layout.twig' %}
{% block body %}
<script type="text/javascript" src="/js/script.js"></script>
<div class="profil_user">
<h4>Profil utilisateur {{ nom_user }}</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="background-color: lightgray;opacity: 0.9;
margin-left: 0rem;margin-bottom:1rem; padding:1rem;">
<form action="/password" method="post">
{{ csrf_input() }}
{{ field('email', email, 'Votre Email', {type: 'email'}) }}
<button class="btn btn-primary">Changer de mot de passe</button>
</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;">
Paris
</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

@ -3,12 +3,15 @@ namespace App\Auth\Action;
use App\Auth\Mailer\PasswordResetMailer;
use App\Auth\UserTable;
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 +21,10 @@ class PasswordForgetAction
*/
private $renderer;
/**
* @var RouterInterface
*/
private $router;
/**
* @var UserTable
*/
private $userTable;
@ -30,14 +37,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,7 +56,8 @@ 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();
$validator = (new Validator($params))
@ -61,13 +72,21 @@ class PasswordForgetAction
'token' => $token
]);
$this->flashService->success('Un email vous a été envoyé');
return new RedirectResponse($request->getUri()->getPath());
//return new RedirectResponse($request->getUri()->getPath());
//$path = $this->router->generateUri('account.profil');
//$this->session->delete('auth.redirect');
//return new RedirectResponse($path);
$affichage_div = false;
return $this->renderer->render('@auth/password',compact('affichage_div'));
} catch (NoRecordException $e) {
$errors = ['email' => 'Aucun utilisateur ne correspond à cet email'];
//$errors = ['email' => 'Aucun utilisateur ne correspond à cet email'];
$this->flashService->error('Aucun utilisateur ne correspond à cet email');
}
} else {
$errors = $validator->getErrors();
}
return $this->renderer->render('@auth/password', compact('errors'));
$affichage_div = true;
return $this->renderer->render('@auth/password', compact('errors','affichage_div'));
}
}

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

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

View File

@ -121,6 +121,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

@ -55,11 +55,10 @@
{{ "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') }}">
<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" style="color:white;font-size: 14px;" class="btn-primary">{{ nom_user }}</button>
</form>
<form method="post" action="{{ path('auth.logout') }}">
<!-- csrf_input() }}-->
@ -69,8 +68,8 @@
<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="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() }}-->