Ajout du support du markdown pour la description pour la question 6

This commit is contained in:
François ZHU 2023-02-07 18:00:54 +00:00
parent 76e4edc581
commit a835a4e0f4
15 changed files with 539 additions and 430 deletions

109
README.md
View File

@ -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"
```

View File

@ -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.*"
}
}

66
composer.lock generated
View File

@ -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",

View File

@ -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: ~

View File

@ -1,78 +1,80 @@
<?php
namespace App\Controller;
use App\Entity\Atelier;
use App\Form\AtelierType;
use App\Repository\AtelierRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/atelier')]
class AtelierController extends AbstractController
{
#[Route('/', name: 'app_atelier_index', methods: ['GET'])]
public function index(AtelierRepository $atelierRepository): Response
{
return $this->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);
}
}
<?php
namespace App\Controller;
use App\Entity\Atelier;
use App\Form\AtelierType;
use App\Repository\AtelierRepository;
use App\Services\MarkdownAtelier;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/atelier')]
class AtelierController extends AbstractController
{
#[Route('/', name: 'app_atelier_index', methods: ['GET'])]
public function index(AtelierRepository $atelierRepository, MarkdownAtelier $markdown): Response
{
return $this->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);
}
}

View File

@ -1,18 +1,18 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class PagesController extends AbstractController
{
#[Route('/', name: 'app_index')]
public function index(): Response
{
return $this->render('pages/index.html.twig', [
'controller_name' => 'PagesController',
]);
}
}
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class PagesController extends AbstractController
{
#[Route('/', name: 'app_index')]
public function index(): Response
{
return $this->render('pages/index.html.twig', [
'controller_name' => 'PagesController',
]);
}
}

View File

@ -1,26 +1,27 @@
<?php
namespace App\Form;
use App\Entity\Atelier;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class AtelierType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('nom')
->add('description')
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Atelier::class,
]);
}
}
<?php
namespace App\Form;
use App\Entity\Atelier;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class AtelierType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('nom')
->add('description', TextAreaType::class)
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Atelier::class,
]);
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Services;
use App\Entity\Atelier;
use cebe\markdown\Markdown;
class MarkdownAtelier
{
protected $markdown;
public function __construct(Markdown $markdown)
{
$this->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;
}
}

View File

@ -1,4 +1,4 @@
<form method="post" action="{{ path('app_atelier_delete', {'id': atelier.id}) }}" onsubmit="return confirm('Are you sure you want to delete this item?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ atelier.id) }}">
<button class="btn btn-outline-danger m-2" >Supprimer</button>
</form>
<form method="post" action="{{ path('app_atelier_delete', {'id': atelier.id}) }}" onsubmit="return confirm('Are you sure you want to delete this item?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ atelier.id) }}">
<button class="btn btn-outline-danger m-2" >Supprimer</button>
</form>

View File

@ -1,8 +1,8 @@
{{ form_start(form) }}
{{ form_widget(form) }}
<div class="d-flex flex-row">
<button class="btn btn-outline-primary m-2">{{ button_label|default('Save') }}</button>
<a class="btn btn-outline-primary m-2" href="{{ path('app_atelier_index') }}">Retour à la liste</a>
</div>
{{ form_end(form) }}
{{ form_start(form) }}
{{ form_widget(form) }}
<div class="d-flex flex-row">
<button class="btn btn-outline-primary m-2">{{ button_label|default('Save') }}</button>
<a class="btn btn-outline-primary m-2" href="{{ path('app_atelier_index') }}">Retour à la liste</a>
</div>
{{ form_end(form) }}

View File

@ -1,11 +1,11 @@
{% extends 'base.html.twig' %}
{% block title %}Modifier l'atelier{% endblock %}
{% block body %}
<h1>Modifier l'atelier</h1>
{{ 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 %}
<h1>Modifier l'atelier</h1>
{{ include('atelier/_form.html.twig', {'button_label': 'Mettre à jour'}) }}
{{ include('atelier/_delete_form.html.twig') }}
{% endblock %}

View File

@ -1,43 +1,43 @@
{% extends 'base.html.twig' %}
{% block title %}Atelier index{% endblock %}
{% block body %}
<h1>Atelier index</h1>
<table class="table">
<thead>
<tr>
<th scope="row">Id</th>
<th scope="col">Nom</th>
<th class="" scope="col">Description</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
{% for atelier in ateliers %}
<tr>
<td>{{ atelier.id }}</td>
<td>{{ atelier.nom }}</td>
<td>{{ atelier.description }}</td>
<td>
<div class="d-flex flex-row">
<a class="btn btn-outline-primary m-1"
href="{{ path('app_atelier_show', {'id': atelier.id}) }}">Afficher</a>
<a class="btn btn-outline-primary m-1"
href="{{ path('app_atelier_edit', {'id': atelier.id}) }}">Modifier</a>
</div>
</td>
</tr>
{% else %}
<tr>
<td colspan="4">no records found</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="d-flex justify-content-center">
<a class="btn btn-primary mb-3" href="{{ path('app_atelier_new') }}">Créer atelier</a>
</div>
{% endblock %}
{% extends 'base.html.twig' %}
{% block title %}Atelier index{% endblock %}
{% block body %}
<h1>Atelier index</h1>
<table class="table">
<thead>
<tr>
<th scope="row">Id</th>
<th scope="col">Nom</th>
<th class="" scope="col">Description</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
{% for atelier in ateliers %}
<tr>
<td>{{ atelier.id }}</td>
<td>{{ atelier.nom }}</td>
<td>{{ atelier.description | raw }}</td>
<td>
<div class="d-flex flex-row">
<a class="btn btn-outline-primary m-1"
href="{{ path('app_atelier_show', {'id': atelier.id}) }}">Afficher</a>
<a class="btn btn-outline-primary m-1"
href="{{ path('app_atelier_edit', {'id': atelier.id}) }}">Modifier</a>
</div>
</td>
</tr>
{% else %}
<tr>
<td colspan="4">no records found</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="d-flex justify-content-center">
<a class="btn btn-primary mb-3" href="{{ path('app_atelier_new') }}">Créer atelier</a>
</div>
{% endblock %}

View File

@ -1,9 +1,9 @@
{% extends 'base.html.twig' %}
{% block title %}Nouvel atelier{% endblock %}
{% block body %}
<h1>Créer un nouvel atelier</h1>
{{ include('atelier/_form.html.twig', {'button_label': 'Sauvegarder'}) }}
{% endblock %}
{% extends 'base.html.twig' %}
{% block title %}Nouvel atelier{% endblock %}
{% block body %}
<h1>Créer un nouvel atelier</h1>
{{ include('atelier/_form.html.twig', {'button_label': 'Sauvegarder'}) }}
{% endblock %}

View File

@ -1,31 +1,31 @@
{% extends 'base.html.twig' %}
{% block title %}Atelier{% endblock %}
{% block body %}
<h1>Atelier</h1>
<table class="table">
<tbody>
<tr>
<th>Id</th>
<td>{{ atelier.id }}</td>
</tr>
<tr>
<th>Nom</th>
<td>{{ atelier.nom }}</td>
</tr>
<tr>
<th>Description</th>
<td>{{ atelier.description }}</td>
</tr>
</tbody>
</table>
<div class="d-flex flex-row">
<a class="btn btn-outline-primary m-2" href="{{ path('app_atelier_edit', {'id': atelier.id}) }}">Modifier</a>
<a class="btn btn-outline-primary m-2" href="{{ path('app_atelier_index') }}">Retour à la liste</a>
{{ include('atelier/_delete_form.html.twig') }}
</div>
{% endblock %}
{% extends 'base.html.twig' %}
{% block title %}Atelier{% endblock %}
{% block body %}
<h1>Atelier</h1>
<table class="table">
<tbody>
<tr>
<th>Id</th>
<td>{{ atelier.id }}</td>
</tr>
<tr>
<th>Nom</th>
<td>{{ atelier.nom }}</td>
</tr>
<tr>
<th>Description</th>
<td>{{ atelier.description | raw }}</td>
</tr>
</tbody>
</table>
<div class="d-flex flex-row">
<a class="btn btn-outline-primary m-2" href="{{ path('app_atelier_edit', {'id': atelier.id}) }}">Modifier</a>
<a class="btn btn-outline-primary m-2" href="{{ path('app_atelier_index') }}">Retour à la liste</a>
{{ include('atelier/_delete_form.html.twig') }}
</div>
{% endblock %}

View File

@ -1,43 +1,43 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text></svg>">
{# 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 %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">CC34</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="{{ path('app_index') }}">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ path('app_atelier_index') }}">Atelier</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">{% block body %}{% endblock %}</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text></svg>">
{# 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 %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">CC34</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="{{ path('app_index') }}">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ path('app_atelier_index') }}">Atelier</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">{% block body %}{% endblock %}</div>
</body>
</html>