【问题标题】:Update shopping cart - error when changing quantity of products.. Cakephp 3.8更新购物车 - 更改产品数量时出错.. Cakephp 3.8
【发布时间】:2020-08-16 05:51:26
【问题描述】:

朋友们,我正在尝试根据on this article 更新我的购物车。

但是,我无法在会话中单独更新“数量”值。该文章适用于在数据库中注册的产品。我使用会话。我相信 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>

cart.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']);
        }
    }

【问题讨论】:

  • 也许告诉我们你遇到了什么错误,并指出它发生在哪一行?
  • 金额值来自输入时为空。 echo $this->Form->input('数量',..
  • 这里有很多错误,很抱歉。最大的问题似乎是对 HTML 表单的一般工作方式以及输入名称和发布的数据之间的关系存在严重误解。在提出解决方案之前,我们需要知道,您是希望能够一次更新一堆数量,还是一次只更新一个?
  • 一次一个。我对代码进行了更新。我在 foreach 中遇到问题:为 foreach () 提供的参数无效。现在我可以带来新数量的值,但它在 foreach 中给出了这个错误。

标签: php session cakephp cart


【解决方案1】:

您的编辑解决了一个主要问题,即您在 td 元素中启动了多个表单,但直到很久以后才结束它们。这将产生无效的 HTML。请注意,在表格末尾之后您仍然有原来的 $this-&gt;Form-&gt;end() 调用,应该将其删除。

您在这里遇到的主要问题是您的表单关于它们应该更新的行的信息为零。您需要包含一些对哪个购物车项目的引用,大概是在 URL 中包含 $cart-&gt;product-&gt;id,就像您在删除函数中包含 $index 一样,或者作为表单中的隐藏输入。

这里的第二个问题是您似乎认为发布的数据将具有某种结构,而事实并非如此。您已将控件命名为“数量”。这就是数据中的全部内容。您将拥有$this-&gt;request-&gt;data['quantity'],它只是一个整数值,而不是您可以通过foreach 的数组。因此出现了这个特定的错误。

第三,然后您尝试访问$this-&gt;request-&gt;data['Carrinho']['produto_id'],它几乎不存在。似乎您正在尝试从此处获取产品 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;
    }
    // ...

【讨论】:

  • 这解决了我的大部分问题。谢谢!发生了一些奇怪的事情:警告(8):未定义索引:product_id [APP / Controller \ OrdersController.php,第 115 行]。我看看可能发生了什么!在会话中,该值是正确的。 produto_id: 56
  • 哦,开枪。对不起!我将产品 ID 放在第一部分的 URL 中,但从第二部分的数据中读取。我会更新它...
  • 我试过这种方式,但没有更新,也没有显示任何错误。在 ctp 中是:'product_id' => $ cart-> product-> id,但在控制器中,通过参数传递的变量是 $ productId。我试图用 $ product_id 替换它,但它也不起作用。我调试了它($ productId),它没有返回任何东西。调试 ($ product_id) 为空。
  • 啊,是的,我又混合了不同的访问方式。我已经更新了答案中的表单创建行来纠正这个问题。但你的回答显示了另一个根本性的误解。变量并非在所有地方都以相同的名称存在。在您构建表单的视图中,您没有$productId 变量。您有一个$cart,它有一个名为product 的属性,它有一个名为id 的属性。所以$cart-&gt;product-&gt;id 有效,如果您查看 HTML,您会在 URL 中看到正确的值。
  • 我更新了我的原始代码并对变量进行了更正。确实没有$productId,但它是通过参数来的。我将使用会话数组的索引进行一些测试。
猜你喜欢
  • 2013-09-24
  • 2014-09-12
  • 1970-01-01
  • 2015-07-21
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多