From 40019dff72b44e2b138abd6937f44683368624c3 Mon Sep 17 00:00:00 2001 From: Olivier PARPAILLON Date: Wed, 20 Nov 2024 12:51:11 +0100 Subject: [PATCH] profile update done --- .idea/php.xml | 3 + .idea/sortir.iml | 3 + composer.json | 2 + composer.lock | 232 +++++++++++++++++- config/bundles.php | 2 + ...20092127.php => Version20241120095413.php} | 2 +- .../avatar-de-profil-673db25730c0c.png | Bin 0 -> 22654 bytes .../avatar-de-profil-673db8d59264d.png | Bin 0 -> 22654 bytes public/upload/image/profile/default.png | Bin 0 -> 9214 bytes src/Controller/ProfileController.php | 36 ++- src/DataFixtures/UserFixtures.php | 12 +- src/Form/ProfileFormType.php | 154 ++++++++++++ symfony.lock | 21 ++ templates/main/header.html.twig | 5 +- templates/profile/edit.html.twig | 36 ++- templates/profile/view.html.twig | 14 +- 16 files changed, 498 insertions(+), 24 deletions(-) rename migrations/{Version20241120092127.php => Version20241120095413.php} (92%) create mode 100644 public/upload/image/profile/avatar-de-profil-673db25730c0c.png create mode 100644 public/upload/image/profile/avatar-de-profil-673db8d59264d.png create mode 100644 public/upload/image/profile/default.png create mode 100644 src/Form/ProfileFormType.php diff --git a/.idea/php.xml b/.idea/php.xml index 3bc3bf6..91ab0f3 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -145,6 +145,9 @@ + + + diff --git a/.idea/sortir.iml b/.idea/sortir.iml index c0db0d2..0fa7baa 100644 --- a/.idea/sortir.iml +++ b/.idea/sortir.iml @@ -137,6 +137,9 @@ + + + diff --git a/composer.json b/composer.json index d81dbac..5493b47 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "doctrine/doctrine-bundle": "^2.13", "doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/orm": "^3.3", + "fzaninotto/faker": "^1.5", "phpdocumentor/reflection-docblock": "^5.6", "phpstan/phpdoc-parser": "^2.0", "symfony/asset": "6.4.*", @@ -98,6 +99,7 @@ } }, "require-dev": { + "doctrine/doctrine-fixtures-bundle": "*", "phpunit/phpunit": "^9.5", "symfony/browser-kit": "6.4.*", "symfony/css-selector": "6.4.*", diff --git a/composer.lock b/composer.lock index 8ce70f1..bf2178f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "12d1d380814a0606ceb716bdf895138d", + "content-hash": "1fd68014d63c789294bcc54a5c6d1c50", "packages": [ { "name": "composer/semver", @@ -1380,6 +1380,63 @@ ], "time": "2023-10-06T06:47:41+00:00" }, + { + "name": "fzaninotto/faker", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "suggest": { + "ext-intl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/fzaninotto/Faker/issues", + "source": "https://github.com/fzaninotto/Faker/tree/master" + }, + "abandoned": true, + "time": "2015-05-29T06:29:14+00:00" + }, { "name": "monolog/monolog", "version": "3.8.0", @@ -7768,6 +7825,179 @@ } ], "packages-dev": [ + { + "name": "doctrine/data-fixtures", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/d2ff5046b263868baf6e9b06cf4918f60096c0d0", + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1.0", + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.4 || ^8.0", + "symfony/polyfill-php80": "^1" + }, + "conflict": { + "doctrine/dbal": "<3.5 || >=5", + "doctrine/orm": "<2.14 || >=4", + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "doctrine/annotations": "^1.12 || ^2", + "doctrine/coding-standard": "^12", + "doctrine/dbal": "^3.5 || ^4", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", + "doctrine/orm": "^2.14 || ^3", + "ext-sqlite3": "*", + "fig/log-test": "^1", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6.13 || ^10.4.2", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/cache": "^5.4 || ^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6.3 || ^7" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database" + ], + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/1.8.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2024-11-04T22:36:12+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "f44a224e27573b79140197a44e68484c45fb24da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/f44a224e27573b79140197a44e68484c45fb24da", + "reference": "f44a224e27573b79140197a44e68484c45fb24da", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "^1.3", + "doctrine/doctrine-bundle": "^2.2", + "doctrine/orm": "^2.14.0 || ^3.0", + "doctrine/persistence": "^2.4|^3.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/doctrine-bridge": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" + }, + "conflict": { + "doctrine/dbal": "< 3" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10.39", + "phpunit/phpunit": "^9.6.13", + "symfony/phpunit-bridge": "^6.3.6", + "vimeo/psalm": "^5.15" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.6.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2024-11-13T07:41:29+00:00" + }, { "name": "masterminds/html5", "version": "2.9.0", diff --git a/config/bundles.php b/config/bundles.php index 2476b22..f9466c1 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -14,4 +14,6 @@ return [ Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], SymfonyCasts\Bundle\VerifyEmail\SymfonyCastsVerifyEmailBundle::class => ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\UX\Turbo\TurboBundle::class => ['all' => true], ]; diff --git a/migrations/Version20241120092127.php b/migrations/Version20241120095413.php similarity index 92% rename from migrations/Version20241120092127.php rename to migrations/Version20241120095413.php index 5d982b8..86bddab 100644 --- a/migrations/Version20241120092127.php +++ b/migrations/Version20241120095413.php @@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20241120092127 extends AbstractMigration +final class Version20241120095413 extends AbstractMigration { public function getDescription(): string { diff --git a/public/upload/image/profile/avatar-de-profil-673db25730c0c.png b/public/upload/image/profile/avatar-de-profil-673db25730c0c.png new file mode 100644 index 0000000000000000000000000000000000000000..b4972ce05c102fe6731c825544a645c16da6edf3 GIT binary patch literal 22654 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 literal 0 HcmV?d00001 diff --git a/public/upload/image/profile/avatar-de-profil-673db8d59264d.png b/public/upload/image/profile/avatar-de-profil-673db8d59264d.png new file mode 100644 index 0000000000000000000000000000000000000000..b4972ce05c102fe6731c825544a645c16da6edf3 GIT binary patch literal 22654 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 literal 0 HcmV?d00001 diff --git a/public/upload/image/profile/default.png b/public/upload/image/profile/default.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a9827378cce03f956bacf4d2e5cdaabb63079a GIT binary patch literal 9214 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 UMF52OBXo3Me_~0k@Bjb+0Pyhz`2YX_ literal 0 HcmV?d00001 diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php index 78e1d38..314b439 100644 --- a/src/Controller/ProfileController.php +++ b/src/Controller/ProfileController.php @@ -3,6 +3,7 @@ namespace App\Controller; use App\Entity\Participant; +use App\Form\ProfileFormType; use App\Service\FileUploader; use App\Form\RegistrationFormType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -20,7 +21,7 @@ class ProfileController extends AbstractController $this->profileRepo = $profileRepo; } #[Route('/profile/{uuid}', name: 'profile_view', methods: ['GET'])] - public function viewProfile(string $uuid, ParticipantRepository $profileRepo): Response + public function viewProfile(string $uuid, ParticipantRepository $profileRepo, Request $request): Response { $currentProfile = $profileRepo->findOneBy(['idParticipant' => $uuid]); return $this->render('profile/view.html.twig', [ @@ -37,7 +38,7 @@ class ProfileController extends AbstractController $this->addFlash('error', "Vous ne pouvez pas modifier un profil qui n'est pas le votre"); return $this->redirectToRoute('profile_view',['uuid' => $profile->getIdParticipant()]); } - $form = $this->createForm(RegistrationFormType::class, $profile); + $form = $this->createForm(ProfileFormType::class, $profile); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $imageFile = $form->get('image')->getData(); @@ -47,7 +48,34 @@ class ProfileController extends AbstractController $imageFilename = $this->fileUploader->upload($imageFile); $profile->setFileName($imageFilename); } else { - $profile->setFileName(''); + $profile->setFileName(null); + } + } + if ($form->has('newPassword') && $form->has('confirmPassword')) { + if ($form->get('newPassword')->getData() !== $form->get('confirmPassword')->getData()) { + $this->addFlash('error', "Les mots de passe ne correspondent pas"); + return $this->render('profile/edit.html.twig', [ + 'formProfile' => $form, + ]); + } + $profile->setPassword($form->get('newPassword')->getData()); + } + if ($form->has('pseudo')) { + $alreadyExists = $this->profileRepo->findOneBy(['pseudo' => $profile->getPseudo()]); + if ($alreadyExists && $alreadyExists !== $profile) { + $this->addFlash('error', "Ce pseudo existe déjà"); + return $this->render('profile/edit.html.twig', [ + 'formProfile' => $form, + ]); + } + } + if ($form->has('email')) { + $alreadyExists = $this->profileRepo->findOneBy(['email' => $profile->getEmail()]); + if ($alreadyExists && $alreadyExists !== $profile) { + $this->addFlash('error', "Cet email existe déjà"); + return $this->render('profile/edit.html.twig', [ + 'formProfile' => $form, + ]); } } $profileToUpdate = $this->profileRepo->update($profile); @@ -61,7 +89,7 @@ class ProfileController extends AbstractController 'formProfile' => $form, ]); } catch(\Exception $e) { - $formProfile = $this->createForm(RegistrationFormType::class, $profile); + $formProfile = $this->createForm(ProfileFormType::class, $profile); $this->addFlash('error', $e->getMessage()); return $this->render('profile/edit.html.twig', ['formProfile' => $formProfile]); } diff --git a/src/DataFixtures/UserFixtures.php b/src/DataFixtures/UserFixtures.php index 7205a72..ccbfa3f 100644 --- a/src/DataFixtures/UserFixtures.php +++ b/src/DataFixtures/UserFixtures.php @@ -9,7 +9,11 @@ use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; class UserFixtures extends Fixture { - public function load(ObjectManager $manager, UserPasswordHasherInterface $userPasswordHasher): void + private UserPasswordHasherInterface $userPasswordHasher; + public function __construct(UserPasswordHasherInterface $userPasswordHasher){ + $this->userPasswordHasher = $userPasswordHasher; + } + public function load(ObjectManager $manager): void { $olivier = new Participant(); $olivier->setPrenom('Olivier'); @@ -20,7 +24,7 @@ class UserFixtures extends Fixture $olivier->setRoles(['ROLE_USER', 'ROLE_ADMIN']); $olivier->setAdministrateur(true); $olivier->setActif(false); - $olivier->setPassword($userPasswordHasher->hashPassword($olivier, 'test-44')); + $olivier->setPassword($this->userPasswordHasher->hashPassword($olivier, 'test-44')); $manager->persist($olivier); $johan = new Participant(); @@ -32,7 +36,7 @@ class UserFixtures extends Fixture $johan->setRoles(['ROLE_USER', 'ROLE_ADMIN']); $johan->setAdministrateur(true); $johan->setActif(false); - $johan->setPassword($userPasswordHasher->hashPassword($johan, 'test-44')); + $johan->setPassword($this->userPasswordHasher->hashPassword($johan, 'test-44')); $manager->persist($johan); $marvin = new Participant(); @@ -44,7 +48,7 @@ class UserFixtures extends Fixture $marvin->setRoles(['ROLE_USER', 'ROLE_ADMIN']); $marvin->setAdministrateur(true); $marvin->setActif(false); - $marvin->setPassword($userPasswordHasher->hashPassword($marvin, 'test-44')); + $marvin->setPassword($this->userPasswordHasher->hashPassword($marvin, 'test-44')); $manager->persist($marvin); $manager->flush(); diff --git a/src/Form/ProfileFormType.php b/src/Form/ProfileFormType.php new file mode 100644 index 0000000..8442049 --- /dev/null +++ b/src/Form/ProfileFormType.php @@ -0,0 +1,154 @@ +add('nom', TextType::class, [ + 'label' => 'Nom', + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'attr' => [ + 'class' => 'w-full mb-4 px-4 py-2 border-2 border-gray-300 rounded-lg text-center focus:outline-none focus:border-blue-500', + 'placeholder' => 'Nom', + ], + ]) + ->add('prenom', TextType::class, [ + 'label' => 'Prénom', + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'attr' => [ + 'class' => 'w-full mb-4 px-4 py-2 border-2 border-gray-300 rounded-lg text-center focus:outline-none focus:border-blue-500', + 'placeholder' => 'Prénom', + ], + ]) + ->add('pseudo', TextType::class, [ + 'label' => 'Pseudo', + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'attr' => [ + 'class' => 'w-full mb-4 px-4 py-2 border-2 border-gray-300 rounded-lg text-center focus:outline-none focus:border-blue-500', + 'placeholder' => 'Pseudo', + ], + ]) + ->add('email', EmailType::class, [ + 'label' => 'Email', + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'attr' => [ + 'class' => 'w-full mb-4 px-4 py-2 border-2 border-gray-300 rounded-lg text-center focus:outline-none focus:border-blue-500', + 'placeholder' => 'Adresse e-mail', + ], + 'constraints' => [ + new NotBlank([ + 'message' => 'Please enter an email address', + ]), + ], + ]) + ->add('telephone', TextType::class, [ + 'label' => 'Numéro de téléphone', + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'attr' => [ + 'class' => 'w-full text-center mb-4 px-4 py-2 border-2 border-gray-300 rounded-lg focus:outline-none focus:border-blue-500', + 'placeholder' => 'Numéro de téléphone', + ], + ]) + ->add('newPassword', PasswordType::class, [ + 'mapped' => false, + 'label' => 'Nouveau mot de passe', + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'attr' => [ + 'autocomplete' => 'new-password', + 'class' => 'w-full text-center mb-4 px-4 py-2 border-2 border-gray-300 rounded-lg focus:outline-none focus:border-blue-500', + 'placeholder' => 'Nouveau mot de passe', + ], + 'constraints' => [ + new NotBlank([ + 'message' => 'Please enter a password', + ]), + new Length([ + 'min' => 6, + 'minMessage' => 'Your password should be at least {{ limit }} characters', + 'max' => 4096, + ]), + ], + ]) + ->add('confirmPassword', PasswordType::class, [ + 'mapped' => false, + 'label' => 'Confirmer mot de passe', + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'attr' => [ + 'autocomplete' => 'new-password', + 'class' => 'w-full text-center mb-4 px-4 py-2 border-2 border-gray-300 rounded-lg focus:outline-none focus:border-blue-500', + 'placeholder' => 'Confirmer mot de passe', + ], + 'constraints' => [ + new NotBlank([ + 'message' => 'Please enter a password', + ]), + new Length([ + 'min' => 6, + 'minMessage' => 'Your password should be at least {{ limit }} characters', + 'max' => 4096, + ]), + ], + ]) + ->add('image', FileType::class, [ + 'label' => 'Image', + 'mapped' => false, + 'required' => false, + 'attr' => [ + 'class' => 'w-full mb-4 px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:border-blue-500', + ], + 'label_attr' => ['class' => 'text-gray-700 font-bold'], + 'constraints' => [ + new File([ + 'maxSize' => '1024k', + 'mimeTypes' => [ + 'image/png', + 'image/jpeg', + ], + 'mimeTypesMessage' => 'Please upload a valid image', + ]) + ], + ]) + ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { + $profile = $event->getData(); + if ($profile && $profile->getFileName()) { + $form = $event->getForm(); + $form->add('deleteImage', CheckboxType::class, [ + 'required' => false, + 'mapped' => false, + 'label' => 'Supprimer l\'image', + 'attr' => [ + 'class' => 'w-4 h-4 mb-4 border-gray-300 rounded mx-2', + ], 'label_attr' => ['class' => 'text-gray-700 font-bold px-4'] + ]); + } + }) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Participant::class, + ]); + } +} diff --git a/symfony.lock b/symfony.lock index 8310ae4..b711fb6 100644 --- a/symfony.lock +++ b/symfony.lock @@ -13,6 +13,18 @@ "./src/Repository/.gitignore" ] }, + "doctrine/doctrine-fixtures-bundle": { + "version": "3.6", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.0", + "ref": "1f5514cfa15b947298df4d771e694e578d4c204d" + }, + "files": [ + "./src/DataFixtures/AppFixtures.php" + ] + }, "doctrine/doctrine-migrations-bundle": { "version": "3.3", "recipe": { @@ -260,6 +272,15 @@ "./config/packages/uid.yaml" ] }, + "symfony/ux-turbo": { + "version": "2.21", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "2.19", + "ref": "9dd2778a116b6e5e01e5e1582d03d5a9e82630de" + } + }, "symfony/validator": { "version": "6.4", "recipe": { diff --git a/templates/main/header.html.twig b/templates/main/header.html.twig index be9b74e..64e0336 100644 --- a/templates/main/header.html.twig +++ b/templates/main/header.html.twig @@ -27,8 +27,9 @@ {% if app.user %}
  • Mon profile
  • {% endif %} -
  • ToDo
  • -
  • À propos
  • + {% if app.user and ('ROLE_ADMIN' in app.user.roles) %} +
  • Administration
  • + {% endif %} {% if app.user %}
  • Se déconnecter
  • {% else %} diff --git a/templates/profile/edit.html.twig b/templates/profile/edit.html.twig index 251d262..f545505 100644 --- a/templates/profile/edit.html.twig +++ b/templates/profile/edit.html.twig @@ -9,13 +9,39 @@ {% endblock %} {% block content %} -
    -
    +
    +

    Modifier votre profile

    {{ form_start(formProfile) }} - {{ form_widget(formProfile) }} - {% if formProfile.vars.data.imageFilename != null %} - + {{ form_row(formProfile.pseudo) }} +
    +
    + {{ form_row(formProfile.nom) }} +
    +
    + {{ form_row(formProfile.prenom) }} +
    +
    +
    +
    + {{ form_row(formProfile.email) }} +
    +
    + {{ form_row(formProfile.telephone) }} +
    +
    +
    +
    + {{ form_row(formProfile.newPassword) }} +
    +
    + {{ form_row(formProfile.confirmPassword) }} +
    +
    + {{ form_row(formProfile.image) }} + {% if formProfile.vars.data.fileName != null %} + {{ form_row(formProfile.deleteImage) }} + image de profile {% endif %} {{ form_end(formProfile) }} diff --git a/templates/profile/view.html.twig b/templates/profile/view.html.twig index dec7138..142ced9 100644 --- a/templates/profile/view.html.twig +++ b/templates/profile/view.html.twig @@ -9,15 +9,15 @@ {% endblock %} {% block content %} -
    -
    -
    -
    -
    - -
    +
    +
    +
    +
    +
    +
    +

    {{ profile.prenom }} {{ profile.nom }}