Codeigniter - Корзина: Не дайте мне получить скрытое поле ID строки - PullRequest
0 голосов
/ 14 октября 2011

Я пытаюсь получить функциональность редактирования в моей корзине.Я хочу, чтобы он в основном шел на страницу с именем users / view_cart, а затем пользователь выбирает, обновляют ли они только корзину (изменяют количество) или проверяют (совершают покупки через транзакцию).

I'mпосле отображения страницы корзины, предоставленной в этом месте:

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. '[Qty]'" из предыдущих строк вправильные проверки формы, но в противном случае не отображаются правильные данные из скрытых полей.

Помогите, пожалуйста!

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Вы генерируете имена форм на основе массива.Например,

<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] => 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 голосов
/ 14 октября 2011

Я не уверен, имеет ли это отношение к чему-либо, но в ваших set_rules $ i. '[Qty]' кажется отключенным. Если вы пытаетесь сослаться на ключ в массиве, тогда нужно будет заключить в кавычки кавычки, как это делает ваш код позже: то есть $i."['qty']" или что-то в этом роде? Точно сказать не могу. Дело в том, я думаю, что в коде отключение.

...