diff --git a/README.md b/README.md index 3b3e1ee..1c424bb 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,58 @@ -# CC34 -## Membres -- Ayoub ZIANI -- François ZHU -- Zakarya BEN JABALLAH -- Aymeric SERRA - -## Questions -### Question 1 -#### Création du projet -```bash -symfony new cc34 --webapp # Création du projet -``` - -#### Création d'un controlleur -```bash -symfony console make:controller pages -``` - -#### Bootsrap et Wepback Encore -```bash -symfony composer require symfony/webpack-encore-bundle -npm install -npm install bootstrap -npm install bootstrap-icons -# Modifier asset/app.js et config/package/twig.yaml -npm run dev -``` - -### Question 2 -```bash -symfony console doctrine:database:create # Création de la base de donnée -symfony console make:entity Atelier # Création d'une entité Atelier -symfony console make:migration # Création d'une migration -symfony console doctrine:migrations:migrate # On lance la migration -``` - -### Question 3 -```bash -symfony composer require fakerphp/faker -symfony composer require orm-fixtures --dev -symfony console doctrine:fixtures:load -``` - -### Question 4 -```bash -symfony console make:crud Atelier -``` - -### Question 5 -```bash -npm run dev +# CC34 +## Membres +- Ayoub ZIANI +- François ZHU +- Zakarya BEN JABALLAH +- Aymeric SERRA + +## Questions +### Question 1 +#### Création du projet +```bash +symfony new cc34 --webapp # Création du projet +``` + +#### Création d'un controlleur +```bash +symfony console make:controller pages +``` + +#### Bootsrap et Wepback Encore +```bash +symfony composer require symfony/webpack-encore-bundle +npm install +npm install bootstrap +npm install bootstrap-icons +# Modifier asset/app.js et config/package/twig.yaml +npm run dev +``` + +### Question 2 +```bash +symfony console doctrine:database:create # Création de la base de donnée +symfony console make:entity Atelier # Création d'une entité Atelier +symfony console make:migration # Création d'une migration +symfony console doctrine:migrations:migrate # On lance la migration +``` + +### Question 3 +```bash +symfony composer require fakerphp/faker +symfony composer require orm-fixtures --dev +symfony console doctrine:fixtures:load +``` + +### Question 4 +```bash +symfony console make:crud Atelier +``` + +### Question 5 +```bash +npm run dev +``` + +### Question 6 +```bash +symfony composer require cebe/markdown "~1.2.0" ``` \ No newline at end of file diff --git a/composer.json b/composer.json index 7776a7c..e106791 100644 --- a/composer.json +++ b/composer.json @@ -1,106 +1,107 @@ -{ - "type": "project", - "license": "proprietary", - "minimum-stability": "stable", - "prefer-stable": true, - "require": { - "php": ">=8.1", - "ext-ctype": "*", - "ext-iconv": "*", - "doctrine/annotations": "^1.0", - "doctrine/doctrine-bundle": "^2.8", - "doctrine/doctrine-migrations-bundle": "^3.2", - "doctrine/orm": "^2.14", - "fakerphp/faker": "^1.21", - "phpdocumentor/reflection-docblock": "^5.3", - "phpstan/phpdoc-parser": "^1.16", - "sensio/framework-extra-bundle": "^6.1", - "symfony/asset": "6.2.*", - "symfony/console": "6.2.*", - "symfony/doctrine-messenger": "6.2.*", - "symfony/dotenv": "6.2.*", - "symfony/expression-language": "6.2.*", - "symfony/flex": "^2", - "symfony/form": "6.2.*", - "symfony/framework-bundle": "6.2.*", - "symfony/http-client": "6.2.*", - "symfony/intl": "6.2.*", - "symfony/mailer": "6.2.*", - "symfony/mime": "6.2.*", - "symfony/monolog-bundle": "^3.0", - "symfony/notifier": "6.2.*", - "symfony/process": "6.2.*", - "symfony/property-access": "6.2.*", - "symfony/property-info": "6.2.*", - "symfony/runtime": "6.2.*", - "symfony/security-bundle": "6.2.*", - "symfony/serializer": "6.2.*", - "symfony/string": "6.2.*", - "symfony/translation": "6.2.*", - "symfony/twig-bundle": "6.2.*", - "symfony/validator": "6.2.*", - "symfony/web-link": "6.2.*", - "symfony/webpack-encore-bundle": "^1.16", - "symfony/yaml": "6.2.*", - "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" - }, - "config": { - "allow-plugins": { - "symfony/flex": true, - "symfony/runtime": true - }, - "sort-packages": true - }, - "autoload": { - "psr-4": { - "App\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "App\\Tests\\": "tests/" - } - }, - "replace": { - "symfony/polyfill-ctype": "*", - "symfony/polyfill-iconv": "*", - "symfony/polyfill-php72": "*", - "symfony/polyfill-php73": "*", - "symfony/polyfill-php74": "*", - "symfony/polyfill-php80": "*", - "symfony/polyfill-php81": "*" - }, - "scripts": { - "auto-scripts": { - "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd" - }, - "post-install-cmd": [ - "@auto-scripts" - ], - "post-update-cmd": [ - "@auto-scripts" - ] - }, - "conflict": { - "symfony/symfony": "*" - }, - "extra": { - "symfony": { - "allow-contrib": false, - "require": "6.2.*" - } - }, - "require-dev": { - "doctrine/doctrine-fixtures-bundle": "^3.4", - "phpunit/phpunit": "^10.0", - "symfony/browser-kit": "6.2.*", - "symfony/css-selector": "6.2.*", - "symfony/debug-bundle": "6.2.*", - "symfony/maker-bundle": "^1.0", - "symfony/phpunit-bridge": "^6.2", - "symfony/stopwatch": "6.2.*", - "symfony/web-profiler-bundle": "6.2.*" - } -} +{ + "type": "project", + "license": "proprietary", + "minimum-stability": "stable", + "prefer-stable": true, + "require": { + "php": ">=8.1", + "ext-ctype": "*", + "ext-iconv": "*", + "cebe/markdown": "~1.2.0", + "doctrine/annotations": "^1.0", + "doctrine/doctrine-bundle": "^2.8", + "doctrine/doctrine-migrations-bundle": "^3.2", + "doctrine/orm": "^2.14", + "fakerphp/faker": "^1.21", + "phpdocumentor/reflection-docblock": "^5.3", + "phpstan/phpdoc-parser": "^1.16", + "sensio/framework-extra-bundle": "^6.1", + "symfony/asset": "6.2.*", + "symfony/console": "6.2.*", + "symfony/doctrine-messenger": "6.2.*", + "symfony/dotenv": "6.2.*", + "symfony/expression-language": "6.2.*", + "symfony/flex": "^2", + "symfony/form": "6.2.*", + "symfony/framework-bundle": "6.2.*", + "symfony/http-client": "6.2.*", + "symfony/intl": "6.2.*", + "symfony/mailer": "6.2.*", + "symfony/mime": "6.2.*", + "symfony/monolog-bundle": "^3.0", + "symfony/notifier": "6.2.*", + "symfony/process": "6.2.*", + "symfony/property-access": "6.2.*", + "symfony/property-info": "6.2.*", + "symfony/runtime": "6.2.*", + "symfony/security-bundle": "6.2.*", + "symfony/serializer": "6.2.*", + "symfony/string": "6.2.*", + "symfony/translation": "6.2.*", + "symfony/twig-bundle": "6.2.*", + "symfony/validator": "6.2.*", + "symfony/web-link": "6.2.*", + "symfony/webpack-encore-bundle": "^1.16", + "symfony/yaml": "6.2.*", + "twig/extra-bundle": "^2.12|^3.0", + "twig/twig": "^2.12|^3.0" + }, + "config": { + "allow-plugins": { + "symfony/flex": true, + "symfony/runtime": true + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php73": "*", + "symfony/polyfill-php74": "*", + "symfony/polyfill-php80": "*", + "symfony/polyfill-php81": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "6.2.*" + } + }, + "require-dev": { + "doctrine/doctrine-fixtures-bundle": "^3.4", + "phpunit/phpunit": "^10.0", + "symfony/browser-kit": "6.2.*", + "symfony/css-selector": "6.2.*", + "symfony/debug-bundle": "6.2.*", + "symfony/maker-bundle": "^1.0", + "symfony/phpunit-bridge": "^6.2", + "symfony/stopwatch": "6.2.*", + "symfony/web-profiler-bundle": "6.2.*" + } +} diff --git a/composer.lock b/composer.lock index 57fa2ad..dfc25b1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,72 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bc632d4e0ebaf53085b8673163075690", + "content-hash": "04a6abe7b394e2037e82619227d2a76e", "packages": [ + { + "name": "cebe/markdown", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown.git", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown/zipball/9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "shasum": "" + }, + "require": { + "lib-pcre": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "4.1.*" + }, + "bin": [ + "bin/markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" + ], + "support": { + "issues": "https://github.com/cebe/markdown/issues", + "source": "https://github.com/cebe/markdown" + }, + "time": "2018-03-26T11:24:36+00:00" + }, { "name": "doctrine/annotations", "version": "1.14.3", diff --git a/config/services.yaml b/config/services.yaml index 2d6a76f..d44d6a8 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -22,3 +22,5 @@ services: # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + + cebe\markdown\Markdown: ~ diff --git a/src/Controller/AtelierController.php b/src/Controller/AtelierController.php index 1e16b43..8e6ee25 100644 --- a/src/Controller/AtelierController.php +++ b/src/Controller/AtelierController.php @@ -1,78 +1,80 @@ -render('atelier/index.html.twig', [ - 'ateliers' => $atelierRepository->findAll(), - ]); - } - - #[Route('/new', name: 'app_atelier_new', methods: ['GET', 'POST'])] - public function new(Request $request, AtelierRepository $atelierRepository): Response - { - $atelier = new Atelier(); - $form = $this->createForm(AtelierType::class, $atelier); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $atelierRepository->save($atelier, true); - - return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER); - } - - return $this->renderForm('atelier/new.html.twig', [ - 'atelier' => $atelier, - 'form' => $form, - ]); - } - - #[Route('/{id}', name: 'app_atelier_show', methods: ['GET'])] - public function show(Atelier $atelier): Response - { - return $this->render('atelier/show.html.twig', [ - 'atelier' => $atelier, - ]); - } - - #[Route('/{id}/edit', name: 'app_atelier_edit', methods: ['GET', 'POST'])] - public function edit(Request $request, Atelier $atelier, AtelierRepository $atelierRepository): Response - { - $form = $this->createForm(AtelierType::class, $atelier); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $atelierRepository->save($atelier, true); - - return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER); - } - - return $this->renderForm('atelier/edit.html.twig', [ - 'atelier' => $atelier, - 'form' => $form, - ]); - } - - #[Route('/{id}', name: 'app_atelier_delete', methods: ['POST'])] - public function delete(Request $request, Atelier $atelier, AtelierRepository $atelierRepository): Response - { - if ($this->isCsrfTokenValid('delete'.$atelier->getId(), $request->request->get('_token'))) { - $atelierRepository->remove($atelier, true); - } - - return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER); - } -} +render('atelier/index.html.twig', [ + 'ateliers' => $markdown->parseArray($atelierRepository->findAll()), + ]); + } + + #[Route('/new', name: 'app_atelier_new', methods: ['GET', 'POST'])] + public function new(Request $request, AtelierRepository $atelierRepository): Response + { + $atelier = new Atelier(); + $form = $this->createForm(AtelierType::class, $atelier); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $atelierRepository->save($atelier, true); + + return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->renderForm('atelier/new.html.twig', [ + 'atelier' => $atelier, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_atelier_show', methods: ['GET'])] + public function show(Atelier $atelier, MarkdownAtelier $markdownAtelier): Response + { + return $this->render('atelier/show.html.twig', [ + 'atelier' => $markdownAtelier->parse($atelier), + ]); + } + + #[Route('/{id}/edit', name: 'app_atelier_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Atelier $atelier, AtelierRepository $atelierRepository): Response + { + $form = $this->createForm(AtelierType::class, $atelier); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $atelierRepository->save($atelier, true); + + return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->renderForm('atelier/edit.html.twig', [ + 'atelier' => $atelier, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_atelier_delete', methods: ['POST'])] + public function delete(Request $request, Atelier $atelier, AtelierRepository $atelierRepository): Response + { + if ($this->isCsrfTokenValid('delete'.$atelier->getId(), $request->request->get('_token'))) { + $atelierRepository->remove($atelier, true); + } + + return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/PagesController.php b/src/Controller/PagesController.php index 277b38c..e069853 100644 --- a/src/Controller/PagesController.php +++ b/src/Controller/PagesController.php @@ -1,18 +1,18 @@ -render('pages/index.html.twig', [ - 'controller_name' => 'PagesController', - ]); - } -} +render('pages/index.html.twig', [ + 'controller_name' => 'PagesController', + ]); + } +} diff --git a/src/Form/AtelierType.php b/src/Form/AtelierType.php index 928e385..e275ef2 100644 --- a/src/Form/AtelierType.php +++ b/src/Form/AtelierType.php @@ -1,26 +1,27 @@ -add('nom') - ->add('description') - ; - } - - public function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults([ - 'data_class' => Atelier::class, - ]); - } -} +add('nom') + ->add('description', TextAreaType::class) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Atelier::class, + ]); + } +} diff --git a/src/Services/MarkdownAtelier.php b/src/Services/MarkdownAtelier.php new file mode 100644 index 0000000..cc63b27 --- /dev/null +++ b/src/Services/MarkdownAtelier.php @@ -0,0 +1,34 @@ +markdown = $markdown; + } + + public function parse(Atelier $atelier) : Atelier + { + $parseAtelier = $atelier; + $parseAtelier->setDescription($this->markdown->parse($atelier->getDescription())); + return $parseAtelier; + } + + public function parseArray(array $ateliers) : array + { + $parsedAteliers = []; + foreach ($ateliers as $atelier) { + $parseAtelier = $atelier; + $parseAtelier->setDescription($this->markdown->parse($atelier->getDescription())); + $parsedAteliers[] = $parseAtelier; + } + return $parsedAteliers; + } +} \ No newline at end of file diff --git a/templates/atelier/_delete_form.html.twig b/templates/atelier/_delete_form.html.twig index 0402463..0c706e2 100644 --- a/templates/atelier/_delete_form.html.twig +++ b/templates/atelier/_delete_form.html.twig @@ -1,4 +1,4 @@ -
- - -
+
+ + +
diff --git a/templates/atelier/_form.html.twig b/templates/atelier/_form.html.twig index a92724f..0e173b7 100644 --- a/templates/atelier/_form.html.twig +++ b/templates/atelier/_form.html.twig @@ -1,8 +1,8 @@ -{{ form_start(form) }} - {{ form_widget(form) }} -
- - - Retour à la liste -
-{{ form_end(form) }} +{{ form_start(form) }} + {{ form_widget(form) }} +
+ + + Retour à la liste +
+{{ form_end(form) }} diff --git a/templates/atelier/edit.html.twig b/templates/atelier/edit.html.twig index 1ce67c6..33b875a 100644 --- a/templates/atelier/edit.html.twig +++ b/templates/atelier/edit.html.twig @@ -1,11 +1,11 @@ -{% extends 'base.html.twig' %} - -{% block title %}Modifier l'atelier{% endblock %} - -{% block body %} -

Modifier l'atelier

- - {{ include('atelier/_form.html.twig', {'button_label': 'Mettre à jour'}) }} - - {{ include('atelier/_delete_form.html.twig') }} -{% endblock %} +{% extends 'base.html.twig' %} + +{% block title %}Modifier l'atelier{% endblock %} + +{% block body %} +

Modifier l'atelier

+ + {{ include('atelier/_form.html.twig', {'button_label': 'Mettre à jour'}) }} + + {{ include('atelier/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/atelier/index.html.twig b/templates/atelier/index.html.twig index f4867a2..9a4449b 100644 --- a/templates/atelier/index.html.twig +++ b/templates/atelier/index.html.twig @@ -1,43 +1,43 @@ -{% extends 'base.html.twig' %} - -{% block title %}Atelier index{% endblock %} - -{% block body %} -

Atelier index

- - - - - - - - - - - - {% for atelier in ateliers %} - - - - - - - {% else %} - - - - {% endfor %} - -
IdNomDescriptionActions
{{ atelier.id }}{{ atelier.nom }}{{ atelier.description }} - -
no records found
- -
- Créer atelier -
-{% endblock %} +{% extends 'base.html.twig' %} + +{% block title %}Atelier index{% endblock %} + +{% block body %} +

Atelier index

+ + + + + + + + + + + + {% for atelier in ateliers %} + + + + + + + {% else %} + + + + {% endfor %} + +
IdNomDescriptionActions
{{ atelier.id }}{{ atelier.nom }}{{ atelier.description | raw }} + +
no records found
+ +
+ Créer atelier +
+{% endblock %} diff --git a/templates/atelier/new.html.twig b/templates/atelier/new.html.twig index a442ac7..b793fb0 100644 --- a/templates/atelier/new.html.twig +++ b/templates/atelier/new.html.twig @@ -1,9 +1,9 @@ -{% extends 'base.html.twig' %} - -{% block title %}Nouvel atelier{% endblock %} - -{% block body %} -

Créer un nouvel atelier

- - {{ include('atelier/_form.html.twig', {'button_label': 'Sauvegarder'}) }} -{% endblock %} +{% extends 'base.html.twig' %} + +{% block title %}Nouvel atelier{% endblock %} + +{% block body %} +

Créer un nouvel atelier

+ + {{ include('atelier/_form.html.twig', {'button_label': 'Sauvegarder'}) }} +{% endblock %} diff --git a/templates/atelier/show.html.twig b/templates/atelier/show.html.twig index 84c1878..51a1e4f 100644 --- a/templates/atelier/show.html.twig +++ b/templates/atelier/show.html.twig @@ -1,31 +1,31 @@ -{% extends 'base.html.twig' %} - -{% block title %}Atelier{% endblock %} - -{% block body %} -

Atelier

- - - - - - - - - - - - - - - - -
Id{{ atelier.id }}
Nom{{ atelier.nom }}
Description{{ atelier.description }}
- -
- Modifier - Retour à la liste - {{ include('atelier/_delete_form.html.twig') }} -
-{% endblock %} - +{% extends 'base.html.twig' %} + +{% block title %}Atelier{% endblock %} + +{% block body %} +

Atelier

+ + + + + + + + + + + + + + + + +
Id{{ atelier.id }}
Nom{{ atelier.nom }}
Description{{ atelier.description | raw }}
+ +
+ Modifier + Retour à la liste + {{ include('atelier/_delete_form.html.twig') }} +
+{% endblock %} + diff --git a/templates/base.html.twig b/templates/base.html.twig index 7c62423..34f4226 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -1,43 +1,43 @@ - - - - - {% block title %}Welcome!{% endblock %} - - - {# Run `composer require symfony/webpack-encore-bundle` to start using Symfony UX #} - {% block stylesheets %} - {{ encore_entry_link_tags('app') }} - {% endblock %} - - {% block javascripts %} - {{ encore_entry_script_tags('app') }} - {% endblock %} - - - -
{% block body %}{% endblock %}
- - - - + + + + + {% block title %}Welcome!{% endblock %} + + + {# Run `composer require symfony/webpack-encore-bundle` to start using Symfony UX #} + {% block stylesheets %} + {{ encore_entry_link_tags('app') }} + {% endblock %} + + {% block javascripts %} + {{ encore_entry_script_tags('app') }} + {% endblock %} + + + +
{% block body %}{% endblock %}
+ + + +