These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | /* |
||
4 | * This file is part of EC-CUBE |
||
5 | * |
||
6 | * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved. |
||
7 | * |
||
8 | * http://www.ec-cube.co.jp/ |
||
9 | * |
||
10 | * For the full copyright and license information, please view the LICENSE |
||
11 | * file that was distributed with this source code. |
||
12 | */ |
||
13 | |||
14 | namespace Eccube\Controller\Admin\Setting\Shop; |
||
15 | |||
16 | use Doctrine\Common\Collections\ArrayCollection; |
||
17 | use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException; |
||
18 | use Eccube\Controller\AbstractController; |
||
19 | use Eccube\Entity\Delivery; |
||
20 | use Eccube\Entity\DeliveryFee; |
||
21 | use Eccube\Entity\DeliveryTime; |
||
22 | use Eccube\Entity\PaymentOption; |
||
23 | use Eccube\Event\EccubeEvents; |
||
24 | use Eccube\Event\EventArgs; |
||
25 | use Eccube\Form\Type\Admin\DeliveryType; |
||
26 | use Eccube\Repository\DeliveryFeeRepository; |
||
27 | use Eccube\Repository\DeliveryRepository; |
||
28 | use Eccube\Repository\DeliveryTimeRepository; |
||
29 | use Eccube\Repository\Master\PrefRepository; |
||
30 | use Eccube\Repository\Master\SaleTypeRepository; |
||
31 | use Eccube\Repository\PaymentOptionRepository; |
||
32 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; |
||
33 | use Symfony\Component\HttpFoundation\Request; |
||
34 | use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; |
||
35 | use Symfony\Component\Routing\Annotation\Route; |
||
36 | |||
37 | /** |
||
38 | * Class DeliveryController |
||
39 | */ |
||
40 | class DeliveryController extends AbstractController |
||
41 | { |
||
42 | /** |
||
43 | * @var PaymentOptionRepository |
||
44 | */ |
||
45 | protected $paymentOptionRepository; |
||
46 | |||
47 | /** |
||
48 | * @var DeliveryFeeRepository |
||
49 | */ |
||
50 | protected $deliveryFeeRepository; |
||
51 | |||
52 | /** |
||
53 | * @var PrefRepository |
||
54 | */ |
||
55 | protected $prefRepository; |
||
56 | |||
57 | /** |
||
58 | * @var DeliveryRepository |
||
59 | */ |
||
60 | protected $deliveryRepository; |
||
61 | |||
62 | /** |
||
63 | * @var DeliveryTimeRepository |
||
64 | */ |
||
65 | protected $deliveryTimeRepository; |
||
66 | |||
67 | /** |
||
68 | * @var DeliveryTimeRepository |
||
69 | */ |
||
70 | protected $saleTypeRepository; |
||
71 | |||
72 | /** |
||
73 | * DeliveryController constructor. |
||
74 | * |
||
75 | * @param PaymentOptionRepository $paymentOptionRepository |
||
76 | * @param DeliveryFeeRepository $deliveryFeeRepository |
||
77 | * @param PrefRepository $prefRepository |
||
78 | * @param DeliveryRepository $deliveryRepository |
||
79 | */ |
||
80 | 10 | public function __construct(PaymentOptionRepository $paymentOptionRepository, DeliveryFeeRepository $deliveryFeeRepository, PrefRepository $prefRepository, DeliveryRepository $deliveryRepository, DeliveryTimeRepository $deliveryTimeRepository, SaleTypeRepository $saleTypeRepository) |
|
81 | { |
||
82 | 10 | $this->paymentOptionRepository = $paymentOptionRepository; |
|
83 | 10 | $this->deliveryFeeRepository = $deliveryFeeRepository; |
|
84 | 10 | $this->prefRepository = $prefRepository; |
|
85 | 10 | $this->deliveryRepository = $deliveryRepository; |
|
86 | 10 | $this->deliveryTimeRepository = $deliveryTimeRepository; |
|
87 | 10 | $this->saleTypeRepository = $saleTypeRepository; |
|
88 | } |
||
89 | |||
90 | /** |
||
91 | * @Route("/%eccube_admin_route%/setting/shop/delivery", name="admin_setting_shop_delivery") |
||
92 | * @Template("@admin/Setting/Shop/delivery.twig") |
||
93 | */ |
||
94 | 1 | View Code Duplication | public function index(Request $request) |
0 ignored issues
–
show
|
|||
95 | { |
||
96 | 1 | $Deliveries = $this->deliveryRepository |
|
97 | 1 | ->findBy([], ['sort_no' => 'DESC']); |
|
98 | |||
99 | 1 | $event = new EventArgs( |
|
100 | [ |
||
101 | 1 | 'Deliveries' => $Deliveries, |
|
102 | ], |
||
103 | 1 | $request |
|
104 | ); |
||
105 | 1 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_INDEX_COMPLETE, $event); |
|
106 | |||
107 | return [ |
||
108 | 1 | 'Deliveries' => $Deliveries, |
|
109 | ]; |
||
110 | } |
||
111 | |||
112 | /** |
||
113 | * @Route("/%eccube_admin_route%/setting/shop/delivery/new", name="admin_setting_shop_delivery_new") |
||
114 | * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/edit", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_edit") |
||
115 | * @Template("@admin/Setting/Shop/delivery_edit.twig") |
||
116 | */ |
||
117 | 6 | public function edit(Request $request, $id = null) |
|
118 | { |
||
119 | 6 | if (is_null($id)) { |
|
120 | 3 | $SaleType = $this->saleTypeRepository->findOneBy([], ['sort_no' => 'ASC']); |
|
121 | 3 | $Delivery = $this->deliveryRepository->findOneBy([], ['sort_no' => 'DESC']); |
|
122 | |||
123 | 3 | $sortNo = 1; |
|
124 | 3 | if ($Delivery) { |
|
125 | 3 | $sortNo = $Delivery->getSortNo() + 1; |
|
126 | } |
||
127 | |||
128 | 3 | $Delivery = new Delivery(); |
|
129 | $Delivery |
||
130 | 3 | ->setSortNo($sortNo) |
|
131 | 3 | ->setVisible(true) |
|
132 | 3 | ->setSaleType($SaleType); |
|
133 | } else { |
||
134 | 3 | $Delivery = $this->deliveryRepository->find($id); |
|
135 | } |
||
136 | |||
137 | 6 | $originalDeliveryTimes = new ArrayCollection(); |
|
138 | |||
139 | 6 | foreach ($Delivery->getDeliveryTimes() as $deliveryTime) { |
|
140 | $originalDeliveryTimes->add($deliveryTime); |
||
141 | } |
||
142 | |||
143 | // FormType: DeliveryFeeの生成 |
||
144 | 6 | $Prefs = $this->prefRepository |
|
145 | 6 | ->findAll(); |
|
146 | |||
147 | 6 | foreach ($Prefs as $Pref) { |
|
148 | 6 | $DeliveryFee = $this->deliveryFeeRepository |
|
149 | 6 | ->findOneBy( |
|
150 | [ |
||
151 | 6 | 'Delivery' => $Delivery, |
|
152 | 6 | 'Pref' => $Pref, |
|
153 | ] |
||
154 | ); |
||
155 | 6 | if (!$DeliveryFee) { |
|
156 | 6 | $DeliveryFee = new DeliveryFee(); |
|
157 | $DeliveryFee |
||
158 | ->setPref($Pref) |
||
159 | ->setDelivery($Delivery); |
||
160 | 6 | } |
|
161 | 6 | if (!$DeliveryFee->getFee()) { |
|
162 | 6 | $Delivery->addDeliveryFee($DeliveryFee); |
|
163 | 6 | } |
|
164 | 6 | } |
|
165 | |||
166 | 6 | $DeliveryFees = $Delivery->getDeliveryFees(); |
|
167 | 6 | $DeliveryFeesIndex = []; |
|
168 | 6 | foreach ($DeliveryFees as $DeliveryFee) { |
|
169 | $Delivery->removeDeliveryFee($DeliveryFee); |
||
170 | $DeliveryFeesIndex[$DeliveryFee->getPref()->getId()] = $DeliveryFee; |
||
171 | 6 | } |
|
172 | 6 | ksort($DeliveryFeesIndex); |
|
173 | foreach ($DeliveryFeesIndex as $timeId => $DeliveryFee) { |
||
174 | 6 | $Delivery->addDeliveryFee($DeliveryFee); |
|
175 | } |
||
176 | 6 | ||
177 | 6 | $builder = $this->formFactory |
|
178 | 6 | ->createBuilder(DeliveryType::class, $Delivery); |
|
179 | 6 | ||
180 | $event = new EventArgs( |
||
181 | 6 | [ |
|
182 | 'builder' => $builder, |
||
183 | 6 | 'Delivery' => $Delivery, |
|
184 | 'Prefs' => $Prefs, |
||
185 | 6 | 'DeliveryFees' => $DeliveryFees, |
|
186 | ], |
||
187 | $request |
||
188 | 6 | ); |
|
189 | 6 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_INITIALIZE, $event); |
|
190 | 3 | ||
191 | $form = $builder->getForm(); |
||
192 | |||
193 | 6 | // 支払方法をセット |
|
194 | 6 | $Payments = []; |
|
195 | foreach ($Delivery->getPaymentOptions() as $PaymentOption) { |
||
196 | $Payments[] = $PaymentOption->getPayment(); |
||
197 | 6 | } |
|
198 | 4 | ||
199 | $form['delivery_times']->setData($Delivery->getDeliveryTimes()); |
||
200 | 4 | $form['payments']->setData($Payments); |
|
201 | 2 | ||
202 | // 登録ボタン押下 |
||
203 | if ($request->getMethod() === 'POST') { |
||
204 | $form->handleRequest($request); |
||
205 | 2 | ||
206 | if ($form->isValid()) { |
||
207 | $DeliveryData = $form->getData(); |
||
208 | |||
209 | // 配送時間の登録 |
||
210 | 2 | /** @var DeliveryTime $DeliveryTime */ |
|
211 | 2 | foreach ($originalDeliveryTimes as $DeliveryTime) { |
|
212 | if (false === $Delivery->getDeliveryTimes()->contains($DeliveryTime)) { |
||
213 | $this->entityManager->remove($DeliveryTime); |
||
214 | } |
||
215 | 2 | } |
|
216 | 2 | foreach ($DeliveryData['DeliveryTimes'] as $DeliveryTime) { |
|
217 | $DeliveryTime->setDelivery($Delivery); |
||
218 | 2 | } |
|
219 | 1 | ||
220 | 1 | // お支払いの登録 |
|
221 | $PaymentOptions = $this->paymentOptionRepository |
||
222 | 2 | ->findBy(['delivery_id' => $Delivery->getId()]); |
|
223 | 2 | // 消す |
|
224 | foreach ($PaymentOptions as $PaymentOption) { |
||
225 | $DeliveryData->removePaymentOption($PaymentOption); |
||
226 | 2 | $this->entityManager->remove($PaymentOption); |
|
227 | 2 | } |
|
228 | 2 | $this->entityManager->persist($DeliveryData); |
|
229 | $this->entityManager->flush(); |
||
230 | 2 | ||
231 | 2 | // いれる |
|
232 | 2 | $PaymentsData = $form->get('payments')->getData(); |
|
233 | 2 | foreach ($PaymentsData as $PaymentData) { |
|
234 | 2 | $PaymentOption = new PaymentOption(); |
|
235 | 2 | $PaymentOption |
|
236 | ->setPaymentId($PaymentData->getId()) |
||
237 | ->setPayment($PaymentData) |
||
238 | 2 | ->setDeliveryId($DeliveryData->getId()) |
|
239 | ->setDelivery($DeliveryData); |
||
240 | 2 | $DeliveryData->addPaymentOption($PaymentOption); |
|
241 | $this->entityManager->persist($DeliveryData); |
||
242 | 2 | } |
|
243 | |||
244 | 2 | $this->entityManager->persist($DeliveryData); |
|
245 | 2 | ||
246 | 2 | $this->entityManager->flush(); |
|
247 | 2 | ||
248 | $event = new EventArgs( |
||
249 | 2 | [ |
|
250 | 'form' => $form, |
||
251 | 2 | 'Delivery' => $Delivery, |
|
252 | 'Prefs' => $Prefs, |
||
253 | 2 | 'DeliveryFees' => $DeliveryFees, |
|
254 | ], |
||
255 | 2 | $request |
|
256 | ); |
||
257 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_COMPLETE, $event); |
||
258 | |||
259 | $this->addSuccess('admin.common.save_complete', 'admin'); |
||
260 | 4 | ||
261 | 4 | return $this->redirectToRoute('admin_setting_shop_delivery_edit', ['id' => $Delivery->getId()]); |
|
262 | } |
||
263 | } |
||
264 | |||
265 | return [ |
||
266 | 'form' => $form->createView(), |
||
267 | 'delivery_id' => $Delivery->getId(), |
||
268 | ]; |
||
269 | 1 | } |
|
270 | |||
271 | 1 | /** |
|
272 | * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/delete", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_delete", methods={"DELETE"}) |
||
273 | */ |
||
274 | 1 | public function delete(Request $request, Delivery $Delivery) |
|
275 | 1 | { |
|
276 | $this->isTokenValid(); |
||
277 | |||
278 | try { |
||
279 | $this->entityManager->remove($Delivery); |
||
280 | $this->entityManager->flush(); |
||
281 | } catch (ForeignKeyConstraintViolationException $e) { |
||
282 | 1 | $this->addError(trans('admin.common.delete_error_foreign_key', ['%name%' => $Delivery->getName()]), 'admin'); |
|
283 | 1 | ||
284 | 1 | return $this->redirectToRoute('admin_setting_shop_delivery'); |
|
285 | } |
||
286 | 1 | ||
287 | 1 | $sortNo = 1; |
|
288 | 1 | $Delivs = $this->deliveryRepository |
|
289 | 1 | ->findBy([], ['sort_no' => 'ASC']); |
|
290 | |||
291 | foreach ($Delivs as $Deliv) { |
||
292 | if ($Deliv->getId() != $Delivery->getId()) { |
||
293 | 1 | $Deliv->setSortNo($sortNo); |
|
294 | $sortNo++; |
||
295 | 1 | } |
|
296 | } |
||
297 | 1 | ||
298 | 1 | $this->entityManager->flush(); |
|
299 | |||
300 | 1 | $event = new EventArgs( |
|
301 | [ |
||
302 | 1 | 'Delivs' => $Delivs, |
|
303 | 'Delivery' => $Delivery, |
||
304 | 1 | ], |
|
305 | $request |
||
306 | 1 | ); |
|
307 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_DELETE_COMPLETE, $event); |
||
308 | |||
309 | $this->addSuccess('admin.common.delete_complete', 'admin'); |
||
310 | |||
311 | return $this->redirectToRoute('admin_setting_shop_delivery'); |
||
312 | } |
||
313 | |||
314 | /** |
||
315 | * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/visibility", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_visibility", methods={"PUT"}) |
||
316 | */ |
||
317 | public function visibility(Request $request, Delivery $Delivery) |
||
318 | { |
||
319 | $this->isTokenValid(); |
||
320 | |||
321 | // 表示・非表示を切り替える |
||
322 | if ($Delivery->isVisible()) { |
||
323 | $message = trans('admin.common.to_hide_complete', ['%name%' => $Delivery->getName()]); |
||
324 | $Delivery->setVisible(false); |
||
325 | } else { |
||
326 | $message = trans('admin.common.to_show_complete', ['%name%' => $Delivery->getName()]); |
||
327 | $Delivery->setVisible(true); |
||
328 | } |
||
329 | $this->entityManager->persist($Delivery); |
||
330 | |||
331 | $this->entityManager->flush(); |
||
332 | |||
333 | $event = new EventArgs( |
||
334 | [ |
||
335 | 'Delivery' => $Delivery, |
||
336 | ], |
||
337 | $request |
||
338 | ); |
||
339 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_VISIBILITY_COMPLETE, $event); |
||
340 | |||
341 | $this->addSuccess($message, 'admin'); |
||
342 | |||
343 | return $this->redirectToRoute('admin_setting_shop_delivery'); |
||
344 | } |
||
345 | |||
346 | 1 | /** |
|
347 | * @Route("/%eccube_admin_route%/setting/shop/delivery/sort_no/move", name="admin_setting_shop_delivery_sort_no_move", methods={"POST"}) |
||
348 | 1 | */ |
|
349 | public function moveSortNo(Request $request) |
||
350 | { |
||
351 | if (!$request->isXmlHttpRequest()) { |
||
352 | 1 | throw new BadRequestHttpException(); |
|
353 | 1 | } |
|
354 | 1 | ||
355 | 1 | if ($this->isTokenValid()) { |
|
356 | 1 | $sortNos = $request->request->all(); |
|
357 | 1 | foreach ($sortNos as $deliveryId => $sortNo) { |
|
358 | $Delivery = $this->deliveryRepository->find($deliveryId); |
||
359 | 1 | $Delivery->setSortNo($sortNo); |
|
360 | $this->entityManager->persist($Delivery); |
||
361 | } |
||
362 | 1 | $this->entityManager->flush(); |
|
363 | } |
||
364 | |||
365 | return $this->json('OK', 200); |
||
366 | } |
||
367 | } |
||
368 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.