/** * @usedby stepImport * @param $data * @return bool */ private function stepImportSku($data) { static $sku_primary; static $sku_secondary; static $empty_sku; static $empty; if (!isset($sku_primary)) { $secondary = explode(':', $this->data['secondary']); $sku_primary = end($secondary); } if (!isset($sku_secondary)) { $extra_secondary = explode(':', $this->data['extra_secondary']); $sku_secondary = end($extra_secondary); } if (!isset($empty)) { $empty = $this->reader->getEmpty(); } if (!isset($empty_sku)) { $empty_sku = ifset($empty['skus'][-1], array()); } $data += $empty; if ($product = $this->findProduct($data)) { $item_sku_id = false; $current_id = ifset($this->data['map'][self::STAGE_PRODUCT]); $id = $product->getId(); if ($this->emulate()) { $target = $id ? 'found' : 'add'; $target_sku = 'add'; } else { $target = $id ? 'update' : 'new'; $target_sku = 'new'; } $key = null; $sku_only = false; $product_exists = $this->emulate() ? $product->__hash == $current_id : $id; if ($id && isset($data['skus'][-1])) { if ($this->emulate() ? $product->__hash == $current_id : $id == $current_id) { $sku_only = true; } $sku = $data['skus'][-1] + $empty_sku; $this->castSku($sku); unset($data['skus'][-1]); $item_sku_id = -1; $matches = 0; foreach ($product->skus as $sku_id => $current_sku) { if ($current_sku[$sku_primary] === ifset($sku[$sku_primary], '')) { //extra workaround for empty primary attribute if (false && $current_sku[$sku_primary] === '' && $sku_secondary) { if (ifset($sku[$sku_secondary], '') !== $current_sku[$sku_secondary]) { continue; } } if (++$matches == 1) { $item_sku_id = $sku_id; $target_sku = $this->emulate() ? 'found' : 'update'; $sku = array_merge($current_sku, $sku); } else { $target_sku = 'skip'; $item_sku_id = false; break; } } } if ($item_sku_id !== false) { if ($item_sku_id < 0 && !isset($sku['available'])) { $sku['available'] = true; } if (!$sku_only && !$product->skus) { $data['sku_id'] = $item_sku_id; } $data['skus'][$item_sku_id] = $sku; $key = 's:'; if ($item_sku_id > 0) { $key .= 'u:' . $item_sku_id; } else { $key .= 'i:'; $key .= $this->getKey(array($sku_primary => ifset($sku[$sku_primary], ''))); } } else { unset($data['skus']); } } elseif (isset($data['skus'][-1])) { if ($this->emulate() && $product->__hash == $current_id) { $sku_only = true; $item_sku_id = true; } else { } $sku = $data['skus'][-1] + $empty_sku; $key = 's:'; $key .= 'i:'; $key .= $this->getKey(array($sku_primary => ifset($sku[$sku_primary], ''))); } elseif (!empty($data['features_selectable'])) { if ($product_exists) { $target = $this->emulate() ? 'found' : 'update'; } //TODO recount virtual SKUs count $key = 's:v:'; $key .= $this->getKey($data['features_selectable']); if ($id) { $target_sku = $this->emulate() ? 'found' : 'update'; } else { //add } } shopProductStocksLogModel::setContext(shopProductStocksLogModel::TYPE_IMPORT); if ($sku_only || empty($this->data['primary'])) { if ($product_exists && $item_sku_id !== false) { if (!$this->emulate($product->__hash, $key)) { $truncated_data = array('skus' => $data['skus']); $virtual_fields = array(); foreach ($virtual_fields as $field) { if (isset($data[$field])) { $truncated_data['skus'][$item_sku_id][$field] = $data[$field]; } } if (isset($data['features'])) { $model = new shopFeatureModel(); $features = $model->getMultipleSelectableFeaturesByType($data['type_id'], 'code'); if (!$features) { $features = array(); } $features['weight'] = true; foreach (array_keys($features) as $code) { if (isset($data['features'][$code])) { if (!isset($truncated_data['skus'][$item_sku_id]['features'])) { $truncated_data['skus'][$item_sku_id]['features'] = array(); } $truncated_data['skus'][$item_sku_id]['features'][$code] = $data['features'][$code]; } } } $product->save($truncated_data); $this->data['map'][self::STAGE_PRODUCT] = $product->getId(); } else { $this->data['map'][self::STAGE_PRODUCT] = $product->__hash; } } } else { if (!$this->emulate($product->__hash, $key)) { $product->save($data); $this->data['map'][self::STAGE_PRODUCT] = $product->getId(); if (!empty($data['images'])) { $this->data['map'][self::STAGE_IMAGE] = $data['images']; $this->data['count'][self::STAGE_IMAGE] += count($data['images']); } } else { $this->data['map'][self::STAGE_PRODUCT] = $product->__hash; } $this->data['processed_count'][self::STAGE_PRODUCT][$target]++; } shopProductStocksLogModel::clearContext(); if ($product->getId() || $this->emulate()) { $this->data['processed_count'][self::STAGE_SKU][$target_sku]++; } } else { $this->data['processed_count'][self::STAGE_PRODUCT]['rights']++; } return true; }
/** * @param shopProduct $product * @return array|bool * @example <pre> * array( * 'feature_1'=>array( * 'selected'=>int, * 'values'=>array( * %value_id%=> array( * 'value_id'=>int, * 'value'=>string, * 'selected'=>bool, * ), * ), * ), * ) * </pre> */ public function getData(shopProduct $product) { $feature_model = new shopFeatureModel(); if ($product->sku_type == shopProductModel::SKU_TYPE_SELECTABLE) { $selected = $this->getByProduct($product->id); $env = wa()->getEnv(); if ($env == 'backend') { $features = $feature_model->getMultipleSelectableFeaturesByType($product->type_id); } else { $features = $feature_model->getById(array_keys($selected)); if ($product->type_id) { $types = array($product->type_id => true); $type_features_model = new shopTypeFeaturesModel(); $type_features_model->fillTypes($features, $types); foreach ($features as &$feature) { unset($feature['types']); $feature['sort'] = ifset($feature['sort'][$product->type_id]); unset($feature); } uasort($features, create_function('$a,$b', 'return max(-1,min(1,$a["sort"]-$b["sort"]));')); } } // attach values $features = $feature_model->getValues($features); foreach ($features as &$f) { $count = 0; foreach ($f['values'] as $id => &$v) { $is_selected = isset($selected[$f['id']][$id]); if ($env == 'backend') { if (is_object($v)) { $v['selected'] = $is_selected; } else { $v = array('value' => htmlentities((string) $v, ENT_NOQUOTES, 'utf-8'), 'selected' => $is_selected); } unset($v); if ($is_selected) { $count += 1; } } elseif (!$is_selected) { unset($f['values'][$id]); } } $f['selected'] = $count; unset($f); } } else { if (wa()->getEnv() == 'backend') { $features = $feature_model->isTypeMultipleSelectable($product->type_id); } else { $features = array(); } } return $features; //Frontend $data = $feature_model->getValues($data); foreach ($data as $code => $f) { foreach ($f['values'] as $id => $v) { if (!isset($v_id, $selected[$code][$id])) { unset($data[$code]['values'][$id]); } } } return $data; }