Я создаю приложение в CodeIgniter. У меня есть форму счета, которая использует jQuery для создания новых позиций. Позиции формируются следующим образом:
<input type="text" name="invoice[new_item_attributes][][description]" class="ui-corner-all text invDesc" title="Description" /> <input type="text" name="invoice[new_item_attributes][][qty]" class="ui-corner-all text invQty" title="Qty" /> <input type="text" name="invoice[new_item_attributes][][amount]" class="ui-corner-all text invAmount" title="Amount" onChange="CalculateTotal(this.form)" /> <input type="hidden" name="invoice[new_item_attributes][][rowTotal]" class="row-total-input" />
То, что я не могу решить, – это то, как я могу перебирать несколько позиций для хранения в базе данных, называемой позициями.
На данный момент у меня есть
foreach ( $_POST['invoice'] as $key => $value) { $data = array( 'description' => $value; ); }
Но я знаю, что писать нельзя, потому что мне нужно как-то ссылаться на счет-фактуру [new_item_attributes] [] [description], чтобы сохранить его в описании и т. Д. …
Любая помощь будет принята с благодарностью.
Правильное решение будет зависеть от того, планируете ли вы хранить скалярные значения в $ _POST ['invoice'] ['new_item_attributes'] или если вы планируете сделать его массивом массивов (другими словами, вы планируете иметь кратные атрибуты new_item_attributes ,
Если вы планируете сохранять только скалярные значения, вам сначала нужно изменить каждый из элементов формы, чтобы выглядеть так:
name="inovoice[new_item_attributes][description]"
Вы заметите, что пустой [] исчез.
И тогда ваша петля должна выглядеть так:
foreach($_POST['invoice']['new_item_attributes'] as $key => $val) { $data = array('description => $value); }
В противном случае вам нужно будет использовать это в своем PHP-коде:
foreach($_POST['invoice']['new_item_attributes'] as $key => $val) { $data = array('description' => $val['description']); }
Или:
foreach($_POST['invoice']['new_item_attributes'] as $key => $val) { foreach($val as $sub => $value) { $data = array($sub => $value); } }
Использование массива append всегда увеличивает индекс массива при назначении, выполняете ли вы его на PHP или в форме HTML, так что в итоге вы получите следующее:
invoice[new_item_attributes][0][description] invoice[new_item_attributes][1][qty] invoice[new_item_attributes][2][amount] invoice[new_item_attributes][3][rowTotal]
-invoice[new_item_attributes][0][description] invoice[new_item_attributes][1][qty] invoice[new_item_attributes][2][amount] invoice[new_item_attributes][3][rowTotal]
-invoice[new_item_attributes][0][description] invoice[new_item_attributes][1][qty] invoice[new_item_attributes][2][amount] invoice[new_item_attributes][3][rowTotal]
-invoice[new_item_attributes][0][description] invoice[new_item_attributes][1][qty] invoice[new_item_attributes][2][amount] invoice[new_item_attributes][3][rowTotal]
-invoice[new_item_attributes][0][description] invoice[new_item_attributes][1][qty] invoice[new_item_attributes][2][amount] invoice[new_item_attributes][3][rowTotal]
Если вы меняете имена полей, так что это счет-фактура [new_item_attributes] [description] [] и т. Д., То ваши представленные данные будут выглядеть так:
invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0]
-invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0]
-invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0]
-invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0]
-invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0]
Что ближе к тому, что вам нужно, теперь поля имеют индексы, соответствующие их позиции. Однако он не будет работать с вашим существующим циклом foreach:
$items = array(); foreach ($invoice['new_item_attributes']['description'] as $key => $val) { $items[] = array('description' => $val, 'qty' => $invoice['new_item_attributes']['qty'][$key], 'amount' => $invoice['new_item_attributes']['amount'][$key], 'rowTotal' => $invoice['new_item_attributes']['rowTotal'][$key], ); }
будет делать массив $ элементов вашего представления формы, что вы можете легко манипулировать тем, как вы изначально ожидали.
Моя петля выглядит так:
foreach ( $_POST['invoice']['new_item_attributes'] as $key => $val ) { $data = array( 'description' => $val['description'], 'qty' => $val['qty'], 'amount' => $val['amount'], 'rowTotal' => $val['rowTotal'], 'client_id' => $_POST['client'], 'company_id' => $this->session->userdata('companyID'), 'invoice_id' => $row['id'], ); $this->db->insert('line_items', $data); }
Однако сохранение каждой позиции в таблице line_items не работает. Если я вхожу в 1 позицию, я получаю 4 записи, хранящиеся в таблице, и они, похоже, не отражают введенную информацию.