src/Form/AddToCartType.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Installment;
  4. use App\Entity\OrderItem;
  5. use App\Entity\Product;
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  8. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  9. use Symfony\Component\Form\FormBuilderInterface;
  10. use Symfony\Component\OptionsResolver\OptionsResolver;
  11. class AddToCartType extends AbstractType
  12. {
  13. public function buildForm(FormBuilderInterface $builder, array $options): void
  14. {
  15. /** @var Product $product */
  16. $product = $builder->getData()->getProducts();
  17. $selected_option = $builder->getData()->getPaymentOption();
  18. $builder
  19. ->add('paymentOption', ChoiceType::class, [
  20. 'mapped' => false,
  21. 'choices' => $this->getPaymentOptions($product),
  22. 'choice_attr' => $this->getSelectedChoice($product, $selected_option),
  23. ])
  24. ->add('add', SubmitType::class, [
  25. 'attr' => [
  26. 'class' => 'btn-main bg-btn lnk w-100',
  27. ],
  28. 'label' => 'Add To Cart',
  29. ])
  30. ->add('buy', SubmitType::class, [
  31. 'attr' => [
  32. 'class' => 'btn-main bg-btn3 lnk w-100 mt10',
  33. ],
  34. 'label' => 'Buy Now',
  35. ]);
  36. // $builder->addEventListener(FormEvents:: , function ($ev){
  37. // dd($ev);
  38. // });
  39. }
  40. public function configureOptions(OptionsResolver $resolver): void
  41. {
  42. $resolver->setDefaults([
  43. 'data_class' => OrderItem::class,
  44. ]);
  45. }
  46. public function getPaymentOptions(Product $product)
  47. {
  48. $installments = $product->getInstallments()->toArray();
  49. return array_reduce($installments, function ($memo, Installment $installment) {
  50. if ($installment->getActive()) {
  51. if ($installment->getDuration() == 'pay in full') {
  52. $memo['pay in full'] = $installment->getDuration();
  53. } else {
  54. $memo[$installment->getDuration().' for '.$installment->getAmount().' /mo'] = $installment->getDuration();
  55. }
  56. }
  57. krsort($memo);
  58. return $memo;
  59. }, []);
  60. }
  61. private function getSelectedChoice(Product $product, $selected_option)
  62. {
  63. if (!empty($selected_option)) {
  64. $available_options = $this->getPaymentOptions($product);
  65. $selected_value = $selected_option->getDuration();
  66. $index = array_search($selected_value, $available_options);
  67. $res_attr_arr = array_values($available_options);
  68. $res_attr_arr = array_reduce($res_attr_arr, function ($memo, $res_arr) {
  69. $memo[$res_arr] = [];
  70. return $memo;
  71. }, []);
  72. $res_attr_arr[$index] = ['selected' => 'selected'];
  73. return $res_attr_arr;
  74. }
  75. return [];
  76. }
  77. }