skip to Main Content

so I’m creating an e-commerce website using symfony and twig. Right now The client can enter manually the quantity he wants of a specific product, but i want that quantity to not exceed the stock we have of that product. So for example if we have 5 chairs, i want him to choose between 1 and 5.
For that i created a dropdown :

<div class="field select-box">
    <select name="quantity" data-placeholder="Select your quantity">

        {% for i in 1..produit.stock %}
        <option value="{{ i }}">{{ i }}</option>

        {% endfor %}
    </select>
</div>

I want to use the selected value to put it inside a form,, or maybe find another way to set the quantity asked without using the form or even just change the way the form looks because right now it only takes input. Should i generate another form ?

Hopefully i was clear.

Here’s what my formType looks like :

class ContenuPanierType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder->add('quantite');

     
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => ContenuPanier::class,
        ]);
    }
}

and here’s a bit of code from the controller that creates a cart, add the products and all the information regarding it (quantity, user it belongs to, date)

 if(is_null($updateContenuPanier)) {
            $contenuPanier = new ContenuPanier();
            $contenuPanier->setDate(new Datetime());
            $contenuPanier->setPanier($panier);
            $contenuPanier->setProduit($produit);
            $contenuPanier->setQuantite($request->get("contenu_panier")["quantite"]);
        }

2

Answers


  1. Have a look at Form Input Types here. You can specify the options. This field in particular will vary for each product (Product A = 5 in stock, Product B = 10 in stock).

    I doubt a select field is the best here, maybe just use a simple <input type="number">, but that’s just my thought on this.

    $builder->add('quantite', ChoiceType::class, [
        'choices' => [ // instead of this, do a loop to create your options
            'Apple' => 1,
            'Banana' => 2,
            'Durian' => 3,
        ],
    )
        ```
    
    Login or Signup to reply.
  2. This can be done with the ChoiceType. You just need to determine your maximum allowed value and configure the appropriate options.

      public function buildForm(FormBuilderInterface $builder, array $options): void
      {
        // access the entity
        $entity = $builder->getData();
    
        // your custom logic to determine the maximum allowed integer value based on $entity
        $max = $entity->getStockOnHandMethodName();
    
        $builder->add('quantite', ChoiceType::class, [
          'choices'      => range(1, $max),
          'choice_label' => function ($choice) {
            // use the value for the label text
            return $choice;
          },
          // prevent empty placeholder option
          'placeholder'  => false,
        ]);
      }
    
    

    I’m almost certain you will still need to verify that the submitted quantity is still valid in your controller action which handles the form submission.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search