2016-09-01 3 views
0

Я пытаюсь сделать какую-то корзину с CakePHP 2, используя массивы в куки.Корзина с CakePHP 2

То, что я сделал:

public $components = array('Cookie'); 

public function beforeFilter(){ 
    $this->Cookie->name= ' order_cookie'; 
} 

кнопка вызывает эту функцию:

public function addOrder(){ 
    $this->Cookie->write('order_cookie', array(
     'order_id' => $order_id, 
     'quantity' => $this->request->data['addOrder']['quantity'], 
     'description' => $this->request->data['addOrder']['description'], 
     'price' => $this->request->data['addOrder']['price'] 
    )); 
} 

отобразить результаты в представлении order.ctp. Это order контроллер:

public function order(){ 
    $this->set('myorder', $this->Cookie->read('order_cookie')); 
} 

По мнению order.ctp:

<table>    
    <thead> 
     <tr> 
      <th>Order ID</th> 
      <th>Quantity</th> 
      <th>Description</th> 
      <th>Price</th> 
     </tr> 
    </thead> 

    <tbody> 
    <?php 
    if(isset($myorder)){ 
     foreach($myorder as $theorder){ 
      ?>    
      <tr> 
       <td><?php echo $theorder['order_id'];?></td> 
       <td><?php echo $theorder['quantity'];?></td> 
       <td><?php echo $theorder['description'];?></td> 
       <td><?php echo $theorder['price'];?></td> 
      </tr> 
     </tbody> 
     <?php 
     } 
    } 
    ?> 
</table> 

У меня есть две проблемы:

  1. Когда я добавляю заказ, он стирает предыдущий заказ вместо добавления нового

  2. Когда я отображения результатов, он дает мне в каждом из строк и каждая строка Warning : Illegal string offset

Что я хочу:

Я просто хочу, что, когда клиент добавляет заказ, программы добавляет массив в cookie вместо стирания предыдущего и окончательно отображает результаты правильно.

ответ

1

Ваша проблема заключается в том, как вы пишете свой файл cookie. Этот метод вызова в вашей addOrder функции перезаписи данных каждый раз, когда его называют: -

$this->Cookie->write('order_cookie', array(
    'order_id' => $order_id, 
    'quantity' => $this->request->data['addOrder']['quantity'], 
    'description' => $this->request->data['addOrder']['description'], 
    'price' => $this->request->data['addOrder']['price'] 
)); 

То, что вы хотите сделать, это добавить новые данные в order_cookie. Вам нужно будет сначала прочитать данные cookie, а затем добавить к этому, прежде чем перезаписывать свой файл cookie. Например: -

$orderCookie = $this->Cookie->read('order_cookie'); 

$orderCookie[] = array(
    'order_id' => $order_id, 
    'quantity' => $this->request->data['addOrder']['quantity'], 
    'description' => $this->request->data['addOrder']['description'], 
    'price' => $this->request->data['addOrder']['price'] 
); 

$orderCookie = $this->Cookie->write('order_cookie', $orderCookie); 

order_cookie теперь будет численно индексированный массив деталей заказа.

+1

Это работает! Большое спасибо !! – heisenberg