/** * @todo use delta/absolute price * @param shopProduct $product * @param array $selected * @param array $data * @return array */ private function generateSku(shopProduct $product, $selected, &$data) { $skus = $product->skus; if (empty($skus)) { $skus = array(); } #build features map for exists SKUs $sku_map = array(); $product_features_model = new shopProductFeaturesModel(); foreach ($z = $product_features_model->getSkuFeatures($product->id) as $sku_id => $f) { $key = ""; foreach ($f as $feature_id => $value_id) { $key .= $feature_id . ":" . $value_id . ";"; } $sku_map[$key] = $sku_id; } $map = array(); foreach ($data as $code => $d) { $map[$d['feature_id']] = $code; } $default_sku = array('sku' => '', 'virtual' => 1, 'available' => 1, 'count' => null); $i = 0; foreach ($this->arrayCartesian($selected) as $features) { $sku = array('name' => array(), 'features' => array(), 'price' => $product->base_price_selectable, 'compare_price' => $product->compare_price_selectable, 'purchase_price' => $product->purchase_price_selectable); $sku_key = ""; $last_value_id = end($features); foreach ($features as $feature_id => $value_id) { $code = $map[$feature_id]; $value = $data[$code]['values'][$value_id]; $sku['features'][$code] = $value; $sku['name'][] = ifset($value['value'], $value['id']); #correct price if (isset($data[$feature_id]['values'][$value_id]['price'])) { self::parseSkuPrice($sku, $data[$feature_id]['values'][$value_id]['price']); } #set counts per stock if (isset($data[$feature_id]['stock'])) { self::parseSkuStock($sku, $data[$feature_id]['stock'], $value_id == $last_value_id ? count($f) : null); } $sku_key .= $feature_id . ":" . $value_id . ";"; $sku['key'] = $sku_key; } #concat name from feature values $sku['name'] = implode(', ', $sku['name']); if (isset($sku_map[$sku_key])) { // already exists $sku_id = $sku_map[$sku_key]; if (!empty($skus[$sku_id]['virtual'])) { //update SKU if still virtual $skus[$sku_id] = array_merge($skus[$sku_id], $sku); } $sku_map[$sku_key] = false; } else { # get free sku_id do { --$i; } while (isset($skus[$i])); $skus[$i] = array_merge($default_sku, $sku); } } if ($product->id) { // remove old virtual skus $sku_map = array_filter($sku_map); foreach ($sku_map as $key => $sku_id) { if (isset($skus[$sku_id])) { if (empty($skus[$sku_id]['virtual'])) { unset($sku_map[$key]); } else { unset($skus[$sku_id]); } } } if ($sku_map && false) { $product_skus_model = new shopProductSkusModel(); $product_skus_model->deleteJoin('shop_product_features', $product->id, array('virtual' => 1, 'id' => $sku_map)); $product_skus_model->deleteByField(array('product_id' => $product->id, 'virtual' => 1, 'id' => $sku_map)); } } $product->skus = $skus; return $sku_map; }