namespace Lc\ShopBundle\Controller; | namespace Lc\ShopBundle\Controller; | ||||
use Doctrine\ORM\EntityManagerInterface; | |||||
use Lc\ShopBundle\Context\CreditHistoryInterface; | |||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as SfAbstractController; | use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as SfAbstractController; | ||||
use Symfony\Component\HttpFoundation\Request; | |||||
use Symfony\Component\HttpFoundation\Response; | |||||
class AbstractController extends SfAbstractController | |||||
abstract class AbstractController extends SfAbstractController | |||||
{ | { | ||||
/** | /** | ||||
* @var \Doctrine\Persistence\ObjectManager | * @var \Doctrine\Persistence\ObjectManager | ||||
*/ | */ | ||||
protected $em; | protected $em; | ||||
/** | |||||
* @var object|string | |||||
* User currently connected | |||||
*/ | |||||
protected $user; | |||||
public $class; | |||||
public $type; | |||||
public $template; | |||||
public $routePrefix; | |||||
public $repos; | |||||
public function __construct() | |||||
public function __construct(EntityManagerInterface $entityManager) | |||||
{ | { | ||||
$this->em = $entityManager; | |||||
$metadata = $this->em->getClassMetadata($this->class); | |||||
$this->class = $metadata->getName(); | |||||
$this->repo = $this->em->getRepository($this->class); | |||||
$this->em = $this->getDoctrine()->getManager(); | |||||
$this->user = $this->get('security.token_storage')->getToken()->getUser(); | |||||
} | } | ||||
public function indexAction(): Response | |||||
{ | |||||
$repo = $this->em->getRepository($this->class); | |||||
return $this->render('LcShopBundle:' . $this->template . ':index.html.twig', [ | |||||
'entities' => $repo->findAll(), | |||||
'routePrefix'=> $this->routePrefix | |||||
]); | |||||
} | |||||
public function showAction($id): Response | |||||
{ | |||||
$enity = $this->repo->find($id); | |||||
return $this->render('LcShopBundle:'.$this->template.':show.html.twig', [ | |||||
'entity' => $enity, | |||||
'routePrefix'=> $this->routePrefix | |||||
]); | |||||
} | |||||
public function editAction(Request $request, $id): Response | |||||
{ | |||||
if ($id == 'new') { | |||||
$entity = new $this->class; | |||||
} else { | |||||
$repo = $this->em->getRepository($this->class); | |||||
$entity = $repo->find($id); | |||||
} | |||||
$form = $this->createForm($this->type, $entity); | |||||
$form->handleRequest($request); | |||||
if ($form->isSubmitted() && $form->isValid()) { | |||||
$this->em->persist($entity); | |||||
$this->getDoctrine()->getManager()->flush(); | |||||
return $this->redirectToRoute($this->routePrefix . '_index'); | |||||
} | |||||
return $this->render('LcShopBundle:' . $this->template . ':edit.html.twig', [ | |||||
'entity' => $entity, | |||||
'form' => $form->createView(), | |||||
'routePrefix'=> $this->routePrefix | |||||
]); | |||||
} | |||||
public function deleteAction(Request $request, $id): Response | |||||
{ | |||||
$enity = $this->repo->find($id); | |||||
if ($this->isCsrfTokenValid('delete'.$enity->getId(), $request->request->get('_token'))) { | |||||
$entityManager = $this->getDoctrine()->getManager(); | |||||
$entityManager->remove($enity); | |||||
$entityManager->flush(); | |||||
} | |||||
return $this->redirectToRoute($this->routePrefix.'_index'); | |||||
} | |||||
} | } |
<?php | |||||
namespace Lc\ShopBundle\Controller; | |||||
use Doctrine\ORM\EntityManagerInterface; | |||||
use Lc\ShopBundle\Context\CreditConfigInterface; | |||||
use Lc\ShopBundle\Form\CreditConfigType; | |||||
class CreditConfigController extends AbstractController | |||||
{ | |||||
protected $repo; | |||||
public function __construct(EntityManagerInterface $entityManager) | |||||
{ | |||||
//Cette valeur sera récrite dans le AbstractController pour qu'elle pointe vers l'entité et non plus l'interface | |||||
$this->class = CreditConfigInterface::class; | |||||
$this->type = CreditConfigType::class; | |||||
$this->template = "default"; | |||||
$this->routePrefix = "lc_shop_credit_config"; | |||||
parent::__construct($entityManager); | |||||
} | |||||
} |
<?php | |||||
namespace Lc\ShopBundle\Controller; | |||||
use App\Entity\Merchant; | |||||
use Lc\ShopBundle\Context\MerchantInterface; | |||||
class MerchantController extends AbstractController | |||||
{ | |||||
protected $repo; | |||||
public function __construct() | |||||
{ | |||||
$this->repo = $this->em->getRepository(MerchantInterface::class); | |||||
} | |||||
public function edit(){ | |||||
$merchant = new Merchant(); | |||||
$merchant->setCreatedBy($this->user); | |||||
$merchant->setUpdatedBy($this->user); | |||||
$this->em->persist($merchant); | |||||
$this->em->flush(); | |||||
die(); | |||||
$merchant = $this->repo->find($id); | |||||
dump($merchant); | |||||
return $this->render('@LcShop/merchant/edit.html.twig', [ | |||||
]); | |||||
} | |||||
public function list(){ | |||||
return $this->render('merchant/index.html.twig', [ | |||||
'controller_name' => 'MerchantController', | |||||
]); | |||||
} | |||||
} |
<?php | |||||
namespace Lc\ShopBundle\Controller; | |||||
use Doctrine\ORM\EntityManagerInterface; | |||||
use Lc\ShopBundle\Context\TaxRateInterface; | |||||
use Lc\ShopBundle\Form\TaxRateType; | |||||
class TaxRateController extends AbstractController | |||||
{ | |||||
protected $repo; | |||||
public function __construct(EntityManagerInterface $entityManager) | |||||
{ | |||||
//Cette valeur sera récrite dans le AbstractController pour qu'elle pointe vers l'entité et non plus l'interface | |||||
$this->class = TaxRateInterface::class; | |||||
$this->type = TaxRateType::class; | |||||
$this->template = "default"; | |||||
$this->routePrefix = "lc_shop_tax_rate"; | |||||
parent::__construct($entityManager); | |||||
} | |||||
public function newBeforeFlush(){ | |||||
} | |||||
} |
<?php | |||||
namespace Lc\ShopBundle\Form; | |||||
use Lc\ShopBundle\Context\CreditConfigInterface; | |||||
use Symfony\Component\Form\AbstractType; | |||||
use Symfony\Component\Form\FormBuilderInterface; | |||||
use Symfony\Component\OptionsResolver\OptionsResolver; | |||||
class CreditConfigType extends AbstractType | |||||
{ | |||||
public function buildForm(FormBuilderInterface $builder, array $options) | |||||
{ | |||||
$builder | |||||
->add('active') | |||||
->add('limitAmount') | |||||
->add('limitReminder') | |||||
->add('behavior') | |||||
->add('processOrderCheckedDefault') | |||||
; | |||||
} | |||||
public function configureOptions(OptionsResolver $resolver) | |||||
{ | |||||
$resolver->setDefaults([ | |||||
'data_class' => CreditConfigInterface::class, | |||||
]); | |||||
} | |||||
} |
<?php | |||||
namespace Lc\ShopBundle\Form; | |||||
use Lc\ShopBundle\Context\TaxRateInterface; | |||||
use Symfony\Component\Form\AbstractType; | |||||
use Symfony\Component\Form\FormBuilderInterface; | |||||
use Symfony\Component\OptionsResolver\OptionsResolver; | |||||
class TaxRateType extends AbstractType | |||||
{ | |||||
public function buildForm(FormBuilderInterface $builder, array $options) | |||||
{ | |||||
$builder | |||||
->add('title') | |||||
->add('value') | |||||
->add('createdAt') | |||||
->add('updatedAt') | |||||
->add('createdBy') | |||||
->add('updatedBy') | |||||
; | |||||
} | |||||
public function configureOptions(OptionsResolver $resolver) | |||||
{ | |||||
$resolver->setDefaults([ | |||||
'data_class' => TaxRateInterface::class, | |||||
]); | |||||
} | |||||
} |
*/ | */ | ||||
abstract class CreditConfig | abstract class CreditConfig | ||||
{ | { | ||||
/** | |||||
* @ORM\Id() | |||||
* @ORM\GeneratedValue() | |||||
* @ORM\Column(type="integer") | |||||
*/ | |||||
private $id; | |||||
/** | /** | ||||
* @ORM\Column(type="boolean") | * @ORM\Column(type="boolean") | ||||
*/ | */ | ||||
private $active; | |||||
protected $active; | |||||
/** | /** | ||||
* @ORM\Column(type="float", nullable=true) | * @ORM\Column(type="float", nullable=true) | ||||
*/ | */ | ||||
private $limitAmount; | |||||
protected $limitAmount; | |||||
/** | /** | ||||
* @ORM\Column(type="float", nullable=true) | * @ORM\Column(type="float", nullable=true) | ||||
*/ | */ | ||||
private $limitReminder; | |||||
protected $limitReminder; | |||||
/** | /** | ||||
* @ORM\Column(type="string", length=31, nullable=true) | * @ORM\Column(type="string", length=31, nullable=true) | ||||
*/ | */ | ||||
private $behavior; | |||||
protected $behavior; | |||||
/** | /** | ||||
* @ORM\Column(type="boolean", nullable=true) | * @ORM\Column(type="boolean", nullable=true) | ||||
*/ | */ | ||||
private $processOrderCheckedDefault; | |||||
public function getId(): ?int | |||||
{ | |||||
return $this->id; | |||||
} | |||||
protected $processOrderCheckedDefault; | |||||
public function getActive(): ?bool | public function getActive(): ?bool | ||||
{ | { |
services: | |||||
# ... | |||||
Lc\ShopBundle\Routing\ExtraLoader: | |||||
tags: [routing.loader] |
lc_merchant_list: | |||||
path: /merchant/list | |||||
controller: LcShopBundle:Merchant:list | |||||
<form method="post" action="{{ path(routePrefix~'_delete', {'id': entity.id}) }}" onsubmit="return confirm('Are you sure you want to delete this item?');"> | |||||
<input type="hidden" name="_method" value="DELETE"> | |||||
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ entity.id) }}"> | |||||
<button class="btn">Delete</button> | |||||
</form> |
{{ form_start(form) }} | |||||
{{ form_widget(form) }} | |||||
<button class="btn">{{ button_label|default('Save') }}</button> | |||||
{{ form_end(form) }} |
{% extends 'base.html.twig' %} | |||||
{% block title %}Edit Entity{% endblock %} | |||||
{% block body %} | |||||
<h1>Edit CreditConfig</h1> | |||||
{{ include('@LcShop/default/_form.html.twig', {'button_label': 'Update'}) }} | |||||
{% endblock %} |
{% extends 'base.html.twig' %} | |||||
{% block title %}CreditConfig index{% endblock %} | |||||
{% block body %} | |||||
<h1>liste entités par défaut </h1> | |||||
<ul> | |||||
{% for entity in entities %} | |||||
<li> | |||||
{{ dump(entity) }} | |||||
<a href="{{ path(routePrefix~'_edit', {"id" : entity.id}) }}">Editer cette entité</a> | |||||
<a href="{{ path(routePrefix~'_show', {"id" : entity.id}) }}">Afficher cette entité</a> | |||||
{{ include('@LcShop/default/_delete_form.html.twig') }} | |||||
</li> | |||||
{% else %} | |||||
Aucun enregistrement | |||||
{% endfor %} | |||||
</ul> | |||||
<p> <a href="{{ path(routePrefix~'_edit', {"id" : 'new'}) }}">Ajouter une nouvelle entité</a></p> | |||||
{% endblock %} |
{% extends 'base.html.twig' %} | |||||
{% block title %}CreditConfig{% endblock %} | |||||
{% block body %} | |||||
<h1>My entity</h1> | |||||
{{ dump(entity) }} | |||||
<a href="{{ path(routePrefix~'_index') }}">back to list</a> | |||||
<a href="{{ path(routePrefix~'_edit', {'id': entity.id}) }}">edit</a> | |||||
{{ include('@LcShop/default/_delete_form.html.twig') }} | |||||
{% endblock %} |
{% extends 'base.html.twig' %} | |||||
{% block title %}Hello MerchantController!{% endblock %} | |||||
{% block body %} | |||||
YEAH MEC!!!! | |||||
{% endblock %} |
{% extends 'base.html.twig' %} | |||||
{% block title %}Hello MerchantController!{% endblock %} | |||||
{% block body %} | |||||
<style> | |||||
.example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } | |||||
.example-wrapper code { background: #F5F5F5; padding: 2px 6px; } | |||||
</style> | |||||
<div class="example-wrapper"> | |||||
<h1>Hello {{ controller_name }}! ✅</h1> | |||||
This friendly message is coming from: | |||||
<ul> | |||||
<li>Your controller at <code><a href="{{ '/home/fab/Documents/Pro/www/pdl/sandbox/src/Controller/MerchantController.php'|file_link(0) }}">src/Controller/MerchantController.php</a></code></li> | |||||
<li>Your template at <code><a href="{{ '/home/fab/Documents/Pro/www/pdl/sandbox/templates/merchant/index.html.twig'|file_link(0) }}">templates/merchant/index.html.twig</a></code></li> | |||||
</ul> | |||||
</div> | |||||
{% endblock %} |
<?php | |||||
namespace Lc\ShopBundle\Routing; | |||||
use Lc\ShopBundle\Model\Address; | |||||
use Symfony\Component\Config\Loader\Loader; | |||||
use Symfony\Component\Routing\Route; | |||||
use Symfony\Component\Routing\RouteCollection; | |||||
class CrudLoader extends Loader | |||||
{ | |||||
private $isLoaded = false; | |||||
public function load($resource, $type = null) | |||||
{ | |||||
if (true === $this->isLoaded) { | |||||
throw new \RuntimeException('Do not add the "extra" loader twice'); | |||||
} | |||||
$routes = new RouteCollection(); | |||||
$lcShopRoutes = array( | |||||
'address' => "Address", | |||||
"cart" => "Cart", | |||||
"credit_config" => "CreditConfig", | |||||
"document_nelivery_note" => "DocumentDeliveryNote", | |||||
"document_quotation" => "DocumentQuotation", | |||||
"document_invoice" => "DocumentInvoice", | |||||
"merchant" => "Merchant", | |||||
"merchant_config" => "MerchantConfig", | |||||
/*"order"=>"Order"*/ | |||||
"point_sale" => "PointSale", | |||||
"tax_rate" => "TaxRate", | |||||
"product" => "Products" | |||||
); | |||||
$actions = [ | |||||
'index' => 'indexAction', | |||||
'edit' => 'editAction', | |||||
'delete' => 'deleteAction', | |||||
'show' => 'showAction' | |||||
]; | |||||
foreach ($lcShopRoutes as $entity => $controller) { | |||||
foreach ($actions as $actionName => $action) { | |||||
if ($actionName == 'edit' || $actionName == 'delete' || $actionName == "show") { | |||||
$path = '/' . $entity . '/' . $actionName . '/{id}'; | |||||
} else { | |||||
$path = '/' . $entity . '/' . $actionName; | |||||
} | |||||
$defaults = [ | |||||
'_controller' => 'Lc\ShopBundle\Controller\\' . $controller . 'Controller::' . $action | |||||
]; | |||||
$requirements = [ | |||||
'parameter' => '\d+', | |||||
]; | |||||
$route = new Route($path, $defaults, $requirements); | |||||
$routeName = 'lc_shop_' . $entity . '_' . $actionName; | |||||
$routes->add($routeName, $route); | |||||
} | |||||
} | |||||
$this->isLoaded = true; | |||||
return $routes; | |||||
} | |||||
public function supports($resource, $type = null) | |||||
{ | |||||
return 'crud' === $type; | |||||
} | |||||
} |