コード例 #1
0
 /**
  * @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;
 }
コード例 #2
0
 /**
  * @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;
 }