2009-09-03 2 views
0

У меня есть отношение HABTM между двумя таблицами: items и locations, используя таблицу items_locations, чтобы присоединиться к ним.CakePHP редактирует сразу несколько записей

items_locations также хранит дополнительную информацию. Вот схема

items_locations(id, location_id, item_id, quantity) 

Я пытаюсь создать страницу, которая показывает все элементы в одном месте и позволяет пользователю, через интерфейс DataGrid стиль, редактировать несколько полей сразу:

Location: Factory XYZ 
___________________________ 
|___Item____|___Quantity___| 
| Widget |   3 | 
| Sprocket |   1 | 
| Doohickey |   15 | 
---------------------------- 

чтобы помочь с этим, у меня есть контроллер с именем InventoryController, который имеет:

var $uses = array('Item', 'Location'); // should I add 'ItemsLocation' ? 

Как построить многомерную форму для редактирования этой информации?


Edit:

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

// inventory_controller.php 
function edit($locationId) { 

    $this->data = $this->Item->ItemsLocation->find(
     'all', 
     array(
      "conditions" => array("location_id" => $locationId) 
     ) 
    ); 

, когда я делаю что , $this->data выходит так:

Array (
    [0] => Array (
     [ItemsLocation] => Array (
      [id] => 16 
      [location_id] => 1 
      [item_id] => 1 
      [quantity] => 5 
     ) 
    ) 
    [1] => Array (
     [ItemsLocation] => Array (/* .. etc .. */) 
    ) 
) 

ответ

6

Если вы не собираетесь редактировать данные в Item, вероятно, имеет смысл работать только с моделью соединения. Таким образом, ваша форма для редактирования количества каждого элемента будет выглядеть следующим образом:

echo $form->create('ItemsLocation'); 

// foreach Item at Location: 

echo $form->input('ItemsLocation.0.id'); // automatically hidden 
echo $form->input('ItemsLocation.0.quantity'); 

Увеличить счетчик (.0., .1., ...) для каждой записи. То, что вы должны получать в контроллерах $this->data должны выглядеть следующим образом:

array(
    'ItemsLocation' => array(
     0 => array(
      'id' => 1, 
      'quantity' => 42 
     ), 
     1 => array(
      ... 

Вы можете просто сохранить это, как и любую другую модель запись: $this->Item->ItemsLocation->saveAll($this->data). Добавление элемента в местоположение не сильно отличается, вы просто оставляете id и позволяете пользователю выбирать item_id.

array(
    'location_id' => 42, // prepopulated by hidden field 
    'item_id' => 1  // user selected 
    'quantity' => 242 
) 

Если вы хотите изменить данные модели товара и сохранить его с соответствующим ItemsLocation записью в то же время, погружение в Saving Related Model Data (HABTM) главы. Будьте осторожны:

По умолчанию при сохранении отношений HasAndBelongsToMany Cake удалит все строки в таблице соединений, прежде чем сохранять новые. Например, если у вас есть Клуб, в котором есть 10 детей. Затем вы обновляете Клуб с 2 детьми. В клубе будет всего 2 ребенка, а не 12.

И:

3.7.6.5 hasAndBelongsToMany (HABTM)

уникальный: Если истина (значение по умолчанию) торт будет сначала удалить существующие записи отношения в таблице внешних ключей, прежде чем вставить новые, при обновлении запись. Таким образом, существующие обновления необходимо обновлять при обновлении.


Re: Комментарии/Редактировать

Я не знаю, с верхней части моей головы, если FormHelper достаточно умен, чтобы автозаполнения Model.0.field поля из [0][Model][field] структурированного массива. Если не, вы могли бы легко манипулировать результатами себя:

foreach ($this->data as &$data) { 
    $data = $data['ItemsLocation']; 
} 
$this->data = array('ItemsLocation' => $this->data); 

Это даст вам правильную структуру, но это не очень хорошо, правда. Если у кого-то есть еще один способ сделать это, я все уши. :)

+0

, что делает теперь намного больше смысла. Хотя я все еще нахожусь на кирпичной стене. Можно ли взглянуть на мое редактирование на исходный пост? – nickf

+0

Ну, формат будет немного отличаться, если вы ** найдете ** данные. То, что я говорю, это правильный формат для ** POSTing формы для контроллера. ** Попробуйте 'debug ($ this-> data)' в контроллере после получения данных POST. – deceze

+0

, но вам не понадобится в этом формате, чтобы представление могло делать что-то с помощью: '$ form-> input ('ItemsLocation.0.id')' – nickf