ソースを参照

Section resolver exepction

feature/ticket
Fab 3年前
コミット
a4a9d5c364
16個のファイルの変更302行の追加47行の削除
  1. +10
    -0
      Controller/Dashboard/DashboardAdminController.php
  2. +37
    -0
      Controller/Merchant/SwitchMerchantController.php
  3. +39
    -0
      Controller/Section/SwitchSectionAdminController.php
  4. +33
    -7
      Form/Merchant/SwitchMerchantFormType.php
  5. +81
    -0
      Form/Section/SwitchSectionFormType.php
  6. +5
    -5
      Model/User/UserModel.php
  7. +1
    -1
      Repository/Section/SectionRepository.php
  8. +2
    -3
      Resolver/SectionResolver.php
  9. +2
    -0
      Resources/assets/app/adminlte/common/app.common.js
  10. +0
    -0
      Resources/assets/app/adminlte/common/common.scss
  11. +7
    -0
      Resources/assets/app/switchmerchant/app.switchmerchant.js
  12. +11
    -0
      Resources/assets/app/switchmerchant/switchmerchant.js
  13. +25
    -0
      Resources/assets/app/switchmerchant/switchmerchant_admin.scss
  14. +8
    -0
      Resources/config/routes.yaml
  15. +9
    -3
      Resources/views/adminlte/layout.html.twig
  16. +32
    -28
      Twig/TwigExtension.php

+ 10
- 0
Controller/Dashboard/DashboardAdminController.php ファイルの表示

@@ -2,6 +2,7 @@

namespace Lc\CaracoleBundle\Controller\Dashboard;

use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use Lc\SovBundle\Controller\Dashboard\DashboardController as SovDashboardController ;

@@ -17,4 +18,13 @@ class DashboardAdminController extends SovDashboardController
return $crud ;
}

public function configureAssets(): Assets
{
$assets = parent::configureAssets(); // TODO: Change the autogenerated stub

$assets->addWebpackEncoreEntry('common-switch-merchant') ;

return $assets ;
}

}

+ 37
- 0
Controller/Merchant/SwitchMerchantController.php ファイルの表示

@@ -0,0 +1,37 @@
<?php

namespace Lc\CaracoleBundle\Controller\Merchant;

use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType;
use Lc\CaracoleBundle\Resolver\MerchantResolver;
use Lc\SovBundle\Doctrine\EntityManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;

class SwitchMerchantController extends AbstractController
{

public function switchMerchant(Request $request)
{
$form = $this->createForm(SwitchMerchantFormType::class);
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$merchant = $form->get('merchant')->getData();
$context = $form->get('context')->getData();

if ($merchant) {
$url = $merchant->getMerchantConfig('url');

if($context == 'admin') {
$url .= 'admin' ;
}

if ($url) {
return $this->redirect($url);
}
}
}
}
}

+ 39
- 0
Controller/Section/SwitchSectionAdminController.php ファイルの表示

@@ -0,0 +1,39 @@
<?php

namespace Lc\CaracoleBundle\Controller\Section;

use Doctrine\ORM\EntityManagerInterface;
use Lc\CaracoleBundle\Form\Section\SwitchSectionFormType;
use Lc\CaracoleBundle\Repository\Section\SectionRepository;
use Lc\CaracoleBundle\Resolver\MerchantResolver;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;

class SwitchSectionAdminController extends AbstractController
{

public function switchSection(
Request $request,
EntityManagerInterface $em,
MerchantResolver $merchantResolver,
SectionRepository $sectionRepository
) {
$form = $this->createForm(SwitchSectionFormType::class);
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$idSection = $form->get('id_section')->getData();
$section = $sectionRepository->find($idSection);
$userMerchant = $merchantResolver->getUserMerchant();

if ($section && $userMerchant) {
$userMerchant->setCurrentAdminSection($section);
$em->update($section);
$em->flush();
}

$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
}
}

+ 33
- 7
Form/Merchant/SwitchMerchantFormType.php ファイルの表示

@@ -3,35 +3,61 @@
namespace Lc\CaracoleBundle\Form\Merchant;

use Lc\CaracoleBundle\Model\Merchant\MerchantInterface;
use Lc\SovBundle\DataTransformer\FileManagerTypeToDataTransformer;
use Lc\CaracoleBundle\Resolver\MerchantResolver;
use Lc\SovBundle\Doctrine\EntityManager;
use Lc\SovBundle\Model\User\UserInterface;
use Lc\SovBundle\Translation\TranslatorAdmin;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SwitchMerchantFormType extends AbstractType
{
protected $em;
protected $translatorAdmin;
protected $merchantResolver;

public function __construct(EntityManager $em, TranslatorAdmin $translatorAdmin)
public function __construct(EntityManager $em, TranslatorAdmin $translatorAdmin, MerchantResolver $merchantResolver)
{
$this->em = $em;
$this->translatorAdmin = $translatorAdmin;
$this->merchantResolver = $merchantResolver;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$entityName = $this->em->getEntityName(MerchantInterface::class);

$builder->add(
'merchants',
'merchant',
EntityType::class,
[
'class' => $entityName,
'choice_label' => 'title'
'class' => $this->em->getEntityName(MerchantInterface::class),
'choice_label' => 'title',
'data' => $options['current_merchant']
]
);

$builder->add(
'context',
HiddenType::class,
[
'data' => $options['context']
]
);
}

/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
[
'context' => 'frontend',
'current_merchant' => $this->merchantResolver->getCurrent(),
]
);
}

}

+ 81
- 0
Form/Section/SwitchSectionFormType.php ファイルの表示

@@ -0,0 +1,81 @@
<?php

namespace Lc\CaracoleBundle\Form\Section;

use Lc\CaracoleBundle\Model\Merchant\MerchantInterface;
use Lc\CaracoleBundle\Repository\Section\SectionRepository;
use Lc\CaracoleBundle\Resolver\MerchantResolver;
use Lc\CaracoleBundle\Resolver\SectionResolver;
use Lc\SovBundle\Doctrine\EntityManager;
use Lc\SovBundle\Model\User\UserInterface;
use Lc\SovBundle\Translation\TranslatorAdmin;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SwitchSectionFormType extends AbstractType
{
protected $em;
protected $translatorAdmin;
protected $sectionResolver;

public function __construct(
EntityManager $em,
TranslatorAdmin $translatorAdmin,
SectionResolver $sectionResolver
) {
$this->em = $em;
$this->translatorAdmin = $translatorAdmin;
$this->sectionResolver = $sectionResolver;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$section = $options['section'];
$currentSection = $this->sectionResolver->getCurrent();

$builder->add(
'id_section',
HiddenType::class,
[
'data' => $section ? $section->getId() : null
]
);

$styleButton = '';
$classButton = 'btn-section';
if ($section == $currentSection) {
$classButton .= ' btn-section-current';
$styleButton = 'background-color: ' . $currentSection->getColor() . ';';
}

$builder->add(
'submit',
SubmitType::class,
[
'label' => $section ? $section->getTitle() : '',
'attr' => [
'class' => $classButton,
'style' => $styleButton,
]
]
);
}

/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
[
'section' => null,
]
);
}

}

+ 5
- 5
Model/User/UserModel.php ファイルの表示

@@ -35,7 +35,7 @@ abstract class UserModel extends SovUserModel
/**
* @ORM\ManyToOne(targetEntity="Lc\CaracoleBundle\Model\Merchant\MerchantInterface")
*/
protected $merchant;
protected $favoriteMerchant;

/**
* @ORM\OneToMany(targetEntity="Lc\CaracoleBundle\Model\Address\AddressInterface", mappedBy="user", cascade={"persist"})
@@ -157,14 +157,14 @@ abstract class UserModel extends SovUserModel
return $this;
}

public function getMerchant(): ?MerchantInterface
public function getFavoriteMerchant(): ?MerchantInterface
{
return $this->merchant;
return $this->favoriteMerchant;
}

public function setMerchant(?MerchantInterface $merchant): self
public function setFavoriteMerchant(?MerchantInterface $merchant): self
{
$this->merchant = $merchant;
$this->favoriteMerchant = $merchant;

return $this;
}

+ 1
- 1
Repository/Section/SectionRepository.php ファイルの表示

@@ -3,7 +3,7 @@
namespace Lc\CaracoleBundle\Repository\Section;

use Lc\CaracoleBundle\Model\Section\SectionInterface;
use Lc\SovBundle\Repository\AbstractRepository;
use Lc\CaracoleBundle\Repository\AbstractRepository;

/**
* @method SectionInterface|null find($id, $lockMode = null, $lockVersion = null)

+ 2
- 3
Resolver/SectionResolver.php ファイルの表示

@@ -18,9 +18,9 @@ class SectionResolver
protected $sectionRepository;
protected $merchantResolver;

public function __construct(MerchantResolver $merchantResolver, SectionRepository $sectionRepository)
public function __construct(MerchantResolver $merchantResolver, EntityManagerInterface $em)
{
$this->sectionRepository = $sectionRepository;
$this->em = $em;
$this->merchantResolver = $merchantResolver;
}

@@ -39,7 +39,6 @@ class SectionResolver
throw new \ErrorException('Aucune section par défaut définie pour ce merchant');
}
}

return $currentAdminSection;
}


+ 2
- 0
Resources/assets/app/adminlte/common/app.common.js ファイルの表示

@@ -0,0 +1,2 @@

import './common.scss' ;

+ 0
- 0
Resources/assets/app/adminlte/common/common.scss ファイルの表示


+ 7
- 0
Resources/assets/app/switchmerchant/app.switchmerchant.js ファイルの表示

@@ -0,0 +1,7 @@

import './switchmerchant.js' ;
import './switchmerchant_admin.scss' ;





+ 11
- 0
Resources/assets/app/switchmerchant/switchmerchant.js ファイルの表示

@@ -0,0 +1,11 @@

$(document).ready(function() {
initSwitchMerchant() ;
}) ;

function initSwitchMerchant() {
let $form = $('form.switch-merchant') ;
$form.find('select').change(function() {
$form.submit() ;
}) ;
}

+ 25
- 0
Resources/assets/app/switchmerchant/switchmerchant_admin.scss ファイルの表示

@@ -0,0 +1,25 @@

body.admin {
.nav-switch-merchant {
width: 220px ;
text-align: right ;

.fa {
position: relative;
top: -4px;
right: 7px;
}

form.switch-merchant {
display: inline-block ;
width: 180px ;
position: relative ;
top: 7px ;
text-align: left ;

label, .select2-selection__clear {
display: none ;
}
}
}
}

+ 8
- 0
Resources/config/routes.yaml ファイルの表示

@@ -0,0 +1,8 @@
carac_switch_merchant:
path: /switch-merchant
controller: Lc\CaracoleBundle\Controller\Merchant\SwitchMerchantController::switchMerchant

carac_switch_section:
path: /switch-section
controller: Lc\CaracoleBundle\Controller\Section\SwitchSectionAdminController::switchSection


+ 9
- 3
Resources/views/adminlte/layout.html.twig ファイルの表示

@@ -7,13 +7,19 @@
<ul class="navbar-nav">
{% for section in carac_get_sections() %}
<li class="nav-item d-none d-sm-inline-block">
<a href="#" class="nav-link">{{ section.title }}</a>
{% set form_switch_section = carac_get_form_switch_section(section) %}
{% form_theme form_switch_section '@LcSov/adminlte/crud/form_theme.html.twig' %}
{{ form_start(form_switch_section) }}
{{ form(form_switch_section) }}
{{ form_end(form_switch_section) }}
</li>
{% endfor %}
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
{% set form_switch_merchant = carac_get_form_switch_merchhant() %}
<li class="nav-item nav-switch-merchant">
<i class="fa fa-store"></i>
{% set form_switch_merchant = carac_get_form_switch_merchant('admin') %}
{% form_theme form_switch_merchant '@LcSov/adminlte/crud/form_theme.html.twig' %}
{{ form_start(form_switch_merchant) }}
{{ form(form_switch_merchant) }}
{{ form_end(form_switch_merchant) }}

+ 32
- 28
Twig/TwigExtension.php ファイルの表示

@@ -4,6 +4,7 @@ namespace Lc\CaracoleBundle\Twig;

use Doctrine\ORM\EntityManagerInterface;
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType;
use Lc\CaracoleBundle\Form\Section\SwitchSectionFormType;
use Lc\CaracoleBundle\Repository\Merchant\MerchantRepository;
use Lc\CaracoleBundle\Repository\Section\SectionRepository;
use Lc\SovBundle\Translation\TranslatorAdmin;
@@ -12,6 +13,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Extension\AbstractExtension;
@@ -19,49 +21,29 @@ use Twig\TwigFunction;

class TwigExtension extends AbstractExtension
{
protected $em;
protected $kernel;
protected $parameterBag;
protected $cacheManager;
protected $requestStack;
protected $router;
protected $translator;
protected $translatorAdmin;
protected $merchantRepository;
protected $sectionRepository;
protected $formFactory;
protected $urlGenerator;

public function __construct(
KernelInterface $kernel,
ParameterBagInterface $parameterBag,
CacheManager $cacheManager,
EntityManagerInterface $entityManager,
RequestStack $requestStack,
UrlGeneratorInterface $router,
TranslatorInterface $translator,
TranslatorAdmin $translatorAdmin,
MerchantRepository $merchantRepository,
SectionRepository $sectionRepository,
FormFactoryInterface $formFactory
FormFactoryInterface $formFactory,
UrlGeneratorInterface $urlGenerator
) {
$this->kernel = $kernel;
$this->parameterBag = $parameterBag;
$this->cacheManager = $cacheManager;
$this->em = $entityManager;
$this->requestStack = $requestStack;
$this->router = $router;
$this->translator = $translator;
$this->translatorAdmin = $translatorAdmin;
$this->merchantRepository = $merchantRepository;
$this->sectionRepository = $sectionRepository;
$this->formFactory = $formFactory;
$this->urlGenerator = $urlGenerator;
}

public function getFunctions()
{
return array(
new TwigFunction('carac_get_sections', [$this, 'getSections']),
new TwigFunction('carac_get_form_switch_merchhant', [$this, 'getFormSwitchMerchant']),
new TwigFunction('carac_get_form_switch_merchant', [$this, 'getFormSwitchMerchant']),
new TwigFunction('carac_get_form_switch_section', [$this, 'getFormSwitchSection']),
);
}

@@ -75,9 +57,31 @@ class TwigExtension extends AbstractExtension
return $this->merchantRepository->findAll();
}

public function getFormSwitchMerchant()
public function getFormSwitchMerchant($context = 'front')
{
$form = $this->formFactory->create(SwitchMerchantFormType::class, null, ['action' => '#']);
$form = $this->formFactory->create(
SwitchMerchantFormType::class,
null,
[
'action' => $this->urlGenerator->generate('carac_switch_merchant'),
'attr' => ['class' => 'switch-merchant'],
'context' => $context
]
);
return $form->createView();
}

public function getFormSwitchSection($section)
{
$form = $this->formFactory->create(
SwitchSectionFormType::class,
null,
[
'action' => $this->urlGenerator->generate('carac_switch_section'),
'attr' => ['class' => 'switch-section'],
'section' => $section,
]
);
return $form->createView();
}
}

読み込み中…
キャンセル
保存