<?php
namespace App\Form;
use App\Entity\Installment;
use App\Entity\OrderItem;
use App\Entity\Product;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class AddToCartType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
/** @var Product $product */
$product = $builder->getData()->getProducts();
$selected_option = $builder->getData()->getPaymentOption();
$builder
->add('paymentOption', ChoiceType::class, [
'mapped' => false,
'choices' => $this->getPaymentOptions($product),
'choice_attr' => $this->getSelectedChoice($product, $selected_option),
])
->add('add', SubmitType::class, [
'attr' => [
'class' => 'btn-main bg-btn lnk w-100',
],
'label' => 'Add To Cart',
])
->add('buy', SubmitType::class, [
'attr' => [
'class' => 'btn-main bg-btn3 lnk w-100 mt10',
],
'label' => 'Buy Now',
]);
// $builder->addEventListener(FormEvents:: , function ($ev){
// dd($ev);
// });
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => OrderItem::class,
]);
}
public function getPaymentOptions(Product $product)
{
$installments = $product->getInstallments()->toArray();
return array_reduce($installments, function ($memo, Installment $installment) {
if ($installment->getActive()) {
if ($installment->getDuration() == 'pay in full') {
$memo['pay in full'] = $installment->getDuration();
} else {
$memo[$installment->getDuration().' for '.$installment->getAmount().' /mo'] = $installment->getDuration();
}
}
krsort($memo);
return $memo;
}, []);
}
private function getSelectedChoice(Product $product, $selected_option)
{
if (!empty($selected_option)) {
$available_options = $this->getPaymentOptions($product);
$selected_value = $selected_option->getDuration();
$index = array_search($selected_value, $available_options);
$res_attr_arr = array_values($available_options);
$res_attr_arr = array_reduce($res_attr_arr, function ($memo, $res_arr) {
$memo[$res_arr] = [];
return $memo;
}, []);
$res_attr_arr[$index] = ['selected' => 'selected'];
return $res_attr_arr;
}
return [];
}
}