/**
* Создает продукт в БД если его не было.
* @param type $product - массив с данными о продукте.
* @param type $catId - категория к которой относится продукт.
*/
public function createProduct($product, $catId = null) {
$model = new Models_Product();
$variant = $product['variant'];
$img_var = $product['image'];
$property = $product['property'];
$product['price'] = MG::numberDeFormat($product['price']);
$product['old_price'] = MG::numberDeFormat($product['old_price']);
unset($product['cat_url']);
unset($product['variant']);
unset($product['image']);
unset($product['property']);
//************************************************
//Если у нас несколько изображений, качаем их по очереди
$images = explode('|', $product['image_url']);
if(is_array($images)){
foreach($images as &$image){
self::$downloadLink==false;
// если в строке содержится ссылка
if (strpos($image, "http:") !== false|| strpos($image, "https:") !== false) {
self::$downloadLink = true;
$this->downloadImgFromSite($image);
$image = basename($image);
}
}
$product['image_url'] = implode('|', $images);
}
//если у нас в изображениях есть доп. параметры, вытащим их оттуда
if(strpos($product['image_url'], '[:param:]')!==false) {
// Парсим изображение, его alt и title.
$images = $this->parseImgSeo($product['image_url']);
$product['image_url'] = $images[0];
$product['image_alt'] = $images[1];
$product['image_title'] = $images[2];
}
//************************************************
if($catId === null){
// 1 находим ID категории по заданному пути.
$product['cat_id'] = MG::translitIt($product['cat_id'], 1);
$product['cat_id'] = URL::prepareUrl($product['cat_id']);
if($product['cat_id']){
$product['cat_id'] = (empty($product['cat_id'])) ? $product['cat_url'] : $product['cat_id'];
$url = URL::parsePageUrl($product['cat_id']);
$parentUrl = URL::parseParentUrl($product['cat_id']);
$parentUrl = $parentUrl != '/' ? $parentUrl : '';
$cat = MG::get('category')->getCategoryByUrl($url, $parentUrl);
$product['cat_id'] = $cat['id'];
}
}else{
$product['cat_id'] = $catId;
}
if($catId == -1){
unset($product['cat_id']);
}else{
$product['cat_id'] = !empty($product['cat_id']) ? $product['cat_id'] : 0;
}
if(!empty($product['id'])&& is_numeric($product['id'])){
$dbRes = DB::query('SELECT `id`, `url`, `title` FROM `'.PREFIX.'product` WHERE `id` = '.DB::quote($product['id'], 1));
if($res = DB::fetchArray($dbRes)){
if($res['title'] == $product['title']){
$product['url'] = $res['url'];
}
unset($product['id']);
}else{
if(empty($_SESSION['csv_import_full'])){
$_SESSION['csv_import_full'] = 'y';
$this->formateMogutaCMS(self::$fullProduct, true);
return;
}else{
unset($_SESSION['csv_import_full']);
}
$arrProd = $model->addProduct($product);
}
}
if(empty($arrProd)){
// 2 если URL не задан в файле, то транслитирируем его из названия товара.
$product['url'] = !empty($product['url'])?$product['url']:preg_replace('~-+~','-',MG::translitIt($product['title'], 0));
$product['url'] = str_replace(array(':', '/'),array('', '-'),$product['url']);
$product['url'] = URL::prepareUrl($product['url'], true);
if($_POST['identifyType'] == 'name'){
if(empty($product['cat_id']) || $product['cat_id'] == 0){
$alreadyProduct = $model->getProductByUrl($product['url']);
}else{
$alreadyProduct = $model->getProductByUrl($product['url'], $product['cat_id']);
}
}elseif(!empty($product['code'])){
$res = DB::query('
SELECT id, url
FROM `'.PREFIX.'product`
WHERE code = '.DB::quote($product['code'])
);
$alreadyProduct = DB::fetchAssoc($res);
if(!$alreadyProduct){
$res = DB::query('
SELECT p.id, p.url
FROM `'.PREFIX.'product` p
LEFT JOIN `'.PREFIX.'product_variant` pv
ON pv.product_id = p.id
WHERE pv.code = '.DB::quote($product['code'])
);
$alreadyProduct = DB::fetchAssoc($res);
}
if(empty($alreadyProduct)){
if($product['cat_id'] == 0){
$alreadyProduct = $model->getProductByUrl($product['url']);
}else{
$alreadyProduct = $model->getProductByUrl($product['url'], $product['cat_id']);
}
}
}
// Если в базе найден этот продукт, то при обновлении будет сохранен ID и URL.
if(!empty($alreadyProduct['id'])){
$product['id'] = $alreadyProduct['id'];
$product['url'] = $alreadyProduct['url'];
}
if(empty($_SESSION['csv_import_full']) && (empty($alreadyProduct['id']) || !empty($variant))){
$_SESSION['csv_import_full'] = 'y';
$this->formateMogutaCMS(self::$fullProduct, true);
return;
}else{
unset($_SESSION['csv_import_full']);
}
// обновляем товар, если его не было то метод вернет массив с параметрами вновь созданного товара, в том числе и ID. Иначе вернет true
$arrProd = $model->updateProduct($product);
}
$product_id = $product['id']?$product['id']:$arrProd['id'];
$categoryId = $product['cat_id'];
$productId = $product_id;
$listProperty = $property;
$arrProperty = $this->parseListProperty($listProperty);
foreach($arrProperty as $key => $value){
$type = 'string';
$data = '';
// Если характеристика сложная, то выделим параметры - тип, значение, наценки.
if ($value[0]=='['&&$value[strlen($value)-1]==']'&&stristr($value, 'type')!== FALSE
&&stristr($value, 'value')!== FALSE&&stristr($value, 'product_margin')!== FALSE) {
if(preg_match("/type=([^&]*)value/", $value, $matches)) {
$type = trim($matches[1]);
}
if(preg_match("/value=([^&]*)product_margin/", $value, $matches)) {
$value_prop = trim($matches[1]);
}
if(preg_match("/product_margin=([^&]*)]/", $value, $matches)) {
$data = trim($matches[1]);
}
$value = $value_prop;
}
$this->createProperty($key, $value, $categoryId, $productId, $type, $data);
}
if(!$variant){
return true;
}
$var = $model->getVariants($product['id'], $variant);
$varUpdate = null;
if(!empty($var)){
foreach($var as $k => $v){
if($v['title_variant'] == $variant && $v['product_id'] == $product_id){
$varUpdate = $v['id'];
}
}
}
// Иначе обновляем существующую запись в таблице вариантов.
$varFields = array(
'price',
'old_price',
'count',
'code',
'weight',
'activity',
'currency_iso'
);
$newVariant = array(
'product_id' => $product_id,
'title_variant' => $variant,
);
if($img_var){
$newVariant['image'] = $img_var;
}
if($_POST['schemeType'] != 'default'){
foreach(self::$notUpdate as $id){
$notUpdateFields[$id] = self::$fields[$this->typeCatalog][$id];
}
}
foreach($varFields as $field){
if(isset($product[$field])){
if(!in_array($field, $notUpdateFields)){
$newVariant[$field] = $product[$field];
}
}
}
$model->importUpdateProductVariant($varUpdate, $newVariant, $product_id);
// Обновляем продукт по первому варианту.
$res = DB::query('
SELECT pv.*
FROM `'.PREFIX.'product_variant` pv
WHERE pv.product_id = '.DB::quote($product_id).'
ORDER BY sort
');
if($row = DB::fetchAssoc($res)){
if(!empty($row)){
if($product['title']){
$row['title'] = $product['title'];
}
$row['id'] = $row['product_id'];
unset($row['image']);
unset($row['sort']);
unset($row['title_variant']);
unset($row['product_id']);
$model->updateProduct($row);
}
}
}