Magento 1.6 - сохранение массива из пользовательского ввода в виде коллекции моделей - PullRequest
0 голосов
/ 15 февраля 2012

Я реализую пользовательский интерфейс на бэкэнде для добавления в продукт произвольного количества значений - так же, как интерфейс ценового уровня. Я хотел бы знать, как обычно выполняется сохранение таких данных.

Ниже приведен упрощенный код моей попытки (который выдает эту ошибку: элемент с таким же идентификатором "1" уже существует "):

$myItemCollection = $product->getMyItemCollection();
if(!$myItemCollection) {
    $myItemCollection = Mage::getModel('my_module/my_item')->getCollection();
}

foreach($product->getMyData('items') as $data) {
    $myItem = Mage::getModel('my_module/my_item')->addData($data);
    // Item with the same id "1" already exist on the second iteration
    $myItemCollection->addItem($myItem);
}

$myItemCollection
    ->setDataToAll('product_id', $product->getId())
    ->save();

$ product-> getMyData ('items') возвращает что-то вроде:

array(
    1 => array(
        'foo' => 'bar'
    ),
    2 => array(
        'bin' => 'baz'
    ),
    3 => array(
        'buz' => 'fuz'
    )
)

1 Ответ

0 голосов
/ 02 марта 2012

Коллекция использует метод getId() для добавленного элемента, чтобы получить ключ массива для внутреннего массива $_items. Ваша ошибка Элемент с таким же идентификатором "1" уже существует на второй итерации означает, что вы устанавливаете какое-то значение для новых моделей, которое возвращается в качестве значения идентификатора.

Если getId() возвращает null, то элемент добавляется с помощью $_items[] = $item в коллекцию без этой ошибки. Это означает, что если вы используете стандартные модели и модели ресурсов, $data, вероятно, не соответствует массиву, который вы разместили.

Ключ, используемый для возврата значения идентификатора модели, зависит от типа объекта.
Если модель использует модель ресурсов на основе EAV (Mage_Eav_Model_Entity_Abstract), ключом является entity_id, например, array('entity_id' => 1, 'foo' => 'bar').

Если в модели используется модель ресурсов на основе плоских таблиц (Mage_Core_Model_Resource_Db_Abstract), поле первичного ключа (обычно) задается в методе _construct() модели ресурсов в качестве второго параметра для вызова _init().
Таким образом, если инициализация модели ресурса выглядит как $this->_init('my_module/my_item', 'item_id'), значение для набора в массиве $data будет array('item_id' => 1, 'foo' => 'bar').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...