Обновить корзину - ошибка при изменении количества продуктов. Торт php 3,8 - PullRequest
1 голос
/ 01 мая 2020

Друзья, я пытаюсь обновить свою корзину покупок на основе на основе этой статьи .

Однако я не могу обновить значение "количество" отдельно в сеансе. Статья работает с продуктами, зарегистрированными в базе данных. Я использую сессию. Я считаю, что в cart.ctp есть какая-то деталь, которая не верна в этом переходе! Я ценю, если кто-нибудь может видеть, что происходит!

cart.ctp

Код для моего cart.ctp следующий:

  <html>
  <body>
    <main class="mt-1 pt-1">
      <div class="container wow fadeIn">
        <div class="row">
          <div class="col-md-8 mb-4">
            <div class="card">

              <?php foreach($this->Session->read('carrinho') as $index=>$carrinho): ?>

              <div class="container">
                <div class="row">
                  <div class="col-md-10">
                    <table class="table table-striped">
                      <thead>
                        <tr>
                          <th scope="col">product</th>
                          <th scope="col">price</th>
                          <th scope="col">Qte</th>
                          <th scope="col">subtotal</th>
                        </tr>
                      </thead>
                      <tbody>
                        <tr>
                          <th scope="row">
                            <?= $carrinho->has('produto') ? $this->Html->link($carrinho->produto->nome_produto, ['controller' => 'Produtos', 'action' => '/', $carrinho->produto->id]) : '' ?>
                          </th>
                          <td>
                            <strong>R$ <?php echo number_format($carrinho->produto->preco, 2, ',', '') ?></strong>
                          </td>
                          <td>
<?php echo $this->Form->create('Pedidos',array('id'=>'add-form',
    'url'=>array('controller'=>'pedidos','action'=>'update',$carrinho->produto->id)));?> 
                            <?php 
                            echo $this->Form->control('quantidade',
                            array('type'=>'number', 'label'=>false,'min'=> 1,'size' => 2, 
                            'maxlenght' => 2, 'class'=>'form-control','required' => 'true', 'value'=>$carrinho->quantidade));?> un.

                            <?php echo $this->Form->submit('update',array('class'=>'btn-md text-white waves-effect m-1', 'style' => 'background-color:#1ab394'));?>
                            <?php echo $this->Form->end();?>

                          </td>
                          <td>
                            <strong>
                              R$ <?php 
                              $sub = ($carrinho->produto->preco * $carrinho->quantidade);
                              echo number_format($sub, 2, ',', '');
                              ?>
                            </strong>
                            <?php $total = array(number_format($sub, 2, ',', ''));?>   
                          </td>
                        </tr>
                      </tbody>
                    </table>
                    <hr width="40%">
                  </div>
                </div>
              </div> 
              <div class="row">
               <div class="col-md-8">
               </div>
               <div class="col-md-2 mt-3">
                <?= $this->Html->link(__('Update'), ['action' => 'update']); ?>
              </div>
              <div class="col-md-2 mt-3">
                <?= $this->Html->link(__('Delete'), ['action' => 'delete', $index]); ?>
              </div>
            </div>
            <?php endforeach; ?>
            <br>
          </div>

        </div>
        <div class="col-md-4 mb-4">
          <form class="card p-2">
            <div class="input-group">
              <?= $this->Html->link(__('Checkout'), ['action' => 'checkout']); ?>
            </div>
            <?php echo $this->Form->end(); ?>
          </div>
        </div>
      </div>
    </main>
  </body>
  </html>

корзина. php

    public function update($productId = null) {
    $session = $this->request->session();
    $carrinho = $session->read('carrinho');
    $quantidade = $this->request->data('quantidade');
    if ($quantidade > 0) {
        $carrinho[$productId] = $quantidade;
        $session->write('carrinho', $carrinho);
        return $this->redirect(['action' => 'index']);
        }
    }

1 Ответ

0 голосов
/ 02 мая 2020

Ваше редактирование решает одну важную проблему: вы запускаете несколько форм внутри элементов td, но не завершаете их намного позже. Это приведет к недействительным HTML. Обратите внимание, что у вас все еще есть исходный вызов $this->Form->end() после конца таблицы, который следует удалить.

Основная проблема, с которой вы столкнулись, заключается в том, что ваши формы имеют нулевую информацию о том, в какой строке они находятся должно быть обновление. Вам необходимо включить ссылку на элемент корзины, предположительно либо включив в URL $cart->product->id, например, $index в функцию удаления, либо в качестве скрытого ввода в форме.

Вторая проблема заключается в том, что вы, похоже, думаете, что опубликованные данные будут иметь некоторую структуру, которой они не являются. Вы назвали свой контроль просто «количество». Это все, что будет в данных. У вас будет $this->request->data['quantity'], и это всего лишь одно целочисленное значение, а не массив, который вы можете foreach перезаписать. Отсюда и эта конкретная ошибка.

И в-третьих, вы пытаетесь получить доступ к $this->request->data['Carrinho']['produto_id'], которого в значительной степени не существует. Похоже, вы пытаетесь получить идентификатор продукта отсюда, но (по первому вопросу выше) вы никогда не добавляли его в форму.

Итак, что-то подобное должно разрешить все это:

<?php echo $this->Form->create('Requests',array('id'=>'add-form',
    'url'=>array('controller'=>'requests','action'=>'update',$cart->product->id)));?>

А потом:

public function update($productId) {
    // ...
    $carrinho = $session->read('carrinho');
    $quantidade = $this->request->data('quantity');
    if ($quantidade > 0) {
        $carrinho[$productId] = $quantidade;
    }
    // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...