/** * Create/update product from key=>value array * @param $data array of product attributes */ protected function importRow($data) { if (!isset($data['category']) || empty($data['category'])) { $data['category'] = 'root'; } $newProduct = false; $category_id = $this->getCategoryByPath($data['category']); // Search product by name, category // or create new one $cr = new CDbCriteria(); $cr->with = array('translate'); if (isset($data['url']) && !empty($data['url']) && $data['url'] != '') { $cr->compare('t.url', $data['url']); } if (isset($data['sku']) && !empty($data['sku']) && $data['sku'] != '') { $cr->compare('t.sku', $data['sku']); } else { $cr->compare('translate.name', $data['name']); } $model = StoreProduct::model()->applyCategories($category_id)->find($cr); if (!$model) { $newProduct = true; $model = new StoreProduct(); $this->stats['created']++; } else { $this->stats['updated']++; } // Process product type $model->type_id = $this->getTypeIdByName($data['type']); // Manufacturer if (isset($data['manufacturer']) && !empty($data['manufacturer'])) { $model->manufacturer_id = $this->getManufacturerIdByName($data['manufacturer']); } // Update product variables and eav attributes. $attributes = new CsvAttributesProcessor($model, $data); if ($model->validate()) { $categories = array($category_id); if (isset($data['additionalCategories'])) { $categories = array_merge($categories, $this->getAdditionalCategories($data['additionalCategories'])); } if (!$newProduct) { foreach ($model->categorization as $c) { $categories[] = $c->category; } $categories = array_unique($categories); } // Save product $model->save(); // Update EAV data $attributes->save(); // Update categories $model->setCategories($categories, $category_id); // Process product main image if product doesn't have one if (isset($data['image']) && !empty($data['image'])) { $image = CsvImage::create($data['image']); if ($image && $model->mainImage === null) { $model->addImage($image); } if ($image && $this->deleteDownloadedImages) { $image->deleteTempFile(); } } } else { $errors = $model->getErrors(); $error = array_shift($errors); $this->errors[] = array('line' => $this->line, 'error ' => $error[0]); } }