2011-10-14 62 views
0

我試圖在我的購物車上獲得編輯功能。 我希望它基本上轉到一個名爲users/view_cart的頁面,然後用戶選擇他們是隻更新購物車(更改數量)還是退出(通過交易購買)。Codeigniter - 購物車:不會讓我隱藏字段行ID

我正在關注的顯示在此位置提供的購物車頁面:

http://codeigniter.com/user_guide/libraries/cart.html

public function view_cart(){ 
    $this->load->model('purchases_model'); 
    $this->load->model('transactions_model'); 

    $this->load->helper('form'); 
    $this->load->library('form_validation'); 

    $this->form_validation->set_rules('action', 'action', 'required'); 

    $num = $this->cart->total_items(); 

    for($i = 1; $i <= $num; $i++){ 
     $this->form_validation->set_rules($i.'[qty]', 
           'Quantity of the '.$i.'th element of the cart', 
              'required'); 

    } 

    if($this->form_validation->run() === FALSE){ 
     $data['title'] = 'View your cart!'; 
     $this->load->view('templates/LI_header', $data);  
     $this->load->view('users/view_cart'); 
     $this->load->view('templates/LI_footer'); 
    } elseif($this->input->post('action') == 'checkout') { 
     $data['title'] = 'Buy cart!'; 
     $id = $this->session->userdata('uid'); 
     $transactionsData = array(
           'amount' => $this->cart->format_number($this->cart->total()) 
           ); 
     $tid = $this->transactions_model->insert($transactionsData); 

     foreach($this->cart->contents() as $items){ 
      $wsid = $items['id']; 
      $purchaseData = array(
           'wsid' => $wsid, 
           'uid' => $id, 
           'tid' => $tid 
           ); 
      $this->purchases_model->insert($purchaseData); 
     } 

     $this->load->view('templates/LI_header', $data);  
     $this->load->view('users/buy_cart_success'); 
     $this->load->view('templates/LI_footer'); 
     $this->cart->destroy();   
    } else { 
     $data['title'] = 'Edit Cart!'; 

     /* Manual input of the rowid and new quantity work 
     $cartData = array('rowid' => 'c4ca4238a0b923820dcc509a6f75849b','qty'=>5); 
     $this->cart->update($cartData); 
     */ 
     /* 
     for($i = 1; $i <= $num; $i++){ 
      $rowid = $this->input->post($i.'[rowid]'); 
      $newQty = $this->input->post($i.'[qty]'); 
      $cartData = array(
          'rowid' => $rowid, 
          'qty' => $newQty 
          ); 
      $this->cart->update($cartData); 
     } 
     print_r($formData); 
     $this->load->view('templates/LI_header', $data);  
     $this->load->view('users/edit_cart_success'); 
     $this->load->view('templates/LI_footer'); 
    } 
} 

啓動view_cart觀點:

<?php echo form_open('users/view_cart'); ?> 

<table cellpadding="6" cellspacing="1" style="width:100%" border="0"> 

<?php echo validation_errors(); ?> 

<tr> 
    <th>QTY</th> 
    <th>Item Description</th> 
    <th style="text-align:right">Item Price</th> 
    <th style="text-align:right">Sub-Total</th> 
</tr> 

<?php $i = 1; ?> 

<?php foreach ($this->cart->contents() as $items): ?> 

    <?php echo form_hidden($i.'[rowid]', $items['rowid']); ?> 

    <tr> 
     <td><?php echo form_input(array('name' => $i.'[qty]', 'value' => $items['qty'], 'maxlength' => '3', 'size' => '5')); ?></td> 
     <td> 
     <?php echo $items['name']; ?> 

      <?php if ($this->cart->has_options($items['rowid']) == TRUE): ?> 

       <p> 
        <?php foreach ($this->cart->product_options($items['rowid']) as $option_name => $option_value): ?> 

         <strong><?php echo $option_name; ?>:</strong> <?php echo $option_value; ?><br /> 

        <?php endforeach; ?> 
       </p> 

      <?php endif; ?> 

     </td> 
     <td style="text-align:right"><?php echo $this->cart->format_number($items['price']); ?></td> 
     <td style="text-align:right">$<?php echo $this->cart->format_number($items['subtotal']); ?></td> 
    </tr> 

<?php $i++; ?> 

<?php endforeach; ?> 

<tr> 
    <td colspan="2"> </td> 
    <td class="right"><strong>Total</strong></td> 
    <td class="right">$<?php echo $this->cart->format_number($this->cart->total()); ?></td> 
</tr> 

</table> 
</br> 
<?php echo form_radio('action','update',FALSE); ?> Update your cart 
</br> 
<?php echo form_radio('action','checkout', FALSE) ?> Check out your cart 
</br> 
<p><?php echo form_submit('users/view_cart', 'Process'); ?></p> 

我試着寫一些調試代碼,但我得到的結果是不確定的。 特別是:

for($i = 1; $i <= $num; $i++){ 
    $this->form_validation->set_rules($i.'[qty]','Quantity of the '.$i.'th element of the cart','required'); 
    $formData[$i]['qty'] = $this->input->post(intval($i).'[qty]'); 
    $formData[$i]['rowid'] = $this->input->post(intval($i).'[rowid]'); 
    } 
    print_r($formData); 

上面代碼段的輸出:

Array ([1] => Array ([qty] => [rowid] =>) [2] => Array ([qty] => [rowid] =>) [3] => Array ([qty] => [rowid] =>)) 

哪個是奇怪的,因爲它似乎映射來自先前行的適當形式的驗證「$ I‘[數量]’」。但否則不會從隱藏字段映射正確的數據。

請幫忙!

回答

1

您正在生成基於數組的表單名稱。例如

<input type="hidden" name="1[rowid]" value="1starrthing" />,使你的隱藏表單值後的數據顯示爲子陣列,像這樣:

[1] => Array 
    (
     [rowid] => 1starrthing 
     [qty] => 1 
    ) 

[2] => Array 
    (
     [rowid] => 1starrthing222 
     [qty] => 1 
    ) 

[3] => Array 
    (
     [rowid] => 1starrthing3333 
     [qty] => 1 
    ) 

所以,除非你打算爲,請嘗試更改隱藏表單名稱rowid[]將給你的rowid的數組,像這樣:

[rowid] => Array 
    (
     [0] => 1starrthing 
     [1] => 1starrthing222 
     [2] => 1starrthing3333 
    ) 

[1] => Array 
    (
     [qty] => 1 
    ) 

[2] => Array 
    (
     [qty] => 1 
    ) 

[3] => Array 
    (
     [qty] => 1 
    ) 

或預先準備的計數器的名稱是這樣的:name="rowid_.$i"這將給你:

[rowid_1] => 1starrthing 
[1] => Array 
    (
     [qty] => 1 
    ) 

[rowid_2] => 1starrthing222 
[2] => Array 
    (
     [qty] => 1 
    ) 

[rowid_3] => 1starrthing3333 
[3] => Array 
    (
     [qty] => 1 
    ) 

此外,您的隱藏輸入中的值可能爲空,除非由於某種原因,您的$ items數組中有'qty'作爲每個項目的鍵。嘗試

<?php echo form_hidden('rowid[]', $items); ?> 

要添加調試幫助,請嘗試關閉分析;這會給你更多關於帖子/查詢和其他內容的信息。

底視圖文件:

$this->output->enable_profiler(TRUE);

+0

似乎是合理的,更改其名稱似乎讓我改變了車。爲什麼有這麼多的樣例代碼片段是這樣寫的? – Zigu

0

我不確定這是否與它有任何關係,但在您的set_rules中,$ i。'[qty]'似乎沒有關係。如果你想引用數組中的鍵,那麼它需要在括號內引用引號,就像你後面的代碼所做的那樣:即$i."['qty']"或類似的東西?不確定。問題是,我認爲這是代碼斷開的地方。