/**
 * Import product features
 *
 * @param int $product_id Product ID
 * @param array $data Array of delimited lists of product features and their values
 * @param string $features_delimiter Delimiter symbol
 * @param boolean Always true
 */
function fn_exim_set_product_features($product_id, $data, $features_delimiter, $lang_code, $store_name = '')
{
    //for compatibility with the old format
    $data = preg_replace('{\\{\\d*\\}}', '', $data);
    $variants = array();
    $products_features = db_get_array("SELECT feature_id, variant_id FROM ?:product_features_values WHERE product_id = ?i", $product_id);
    foreach ($products_features as $key => $variant) {
        $variants[$variant['feature_id']] = '';
    }
    if (!fn_is_empty($data)) {
        $data = fn_exim_parse_data($data, $features_delimiter);
        $company_id = 0;
        if (fn_allowed_for('ULTIMATE')) {
            if (Registry::get('runtime.company_id')) {
                $company_id = Registry::get('runtime.company_id');
            } else {
                $company_id = fn_get_company_id_by_name($store_name);
            }
        }
        foreach ($data as $feature) {
            // import features
            if (!empty($feature['group_name'])) {
                $group_id = fn_exim_check_feature_group($feature['group_name'], $company_id, $lang_code);
            } else {
                $group_id = 0;
            }
            $condition = db_quote("WHERE description = ?s AND lang_code = ?s AND feature_type = ?s", $feature['name'], $lang_code, $feature['type']);
            $condition .= db_quote(" AND parent_id = ?i", $group_id);
            $feature_id = db_get_field('SELECT ?:product_features.feature_id FROM ?:product_features_descriptions ' . 'LEFT JOIN ?:product_features ON ?:product_features.feature_id = ?:product_features_descriptions.feature_id ' . $condition);
            if (empty($feature_id)) {
                $feature_data = array('description' => $feature['name'], 'company_id' => $company_id, 'feature_type' => $feature['type'], 'parent_id' => $group_id);
                $feature_id = fn_update_product_feature($feature_data, 0, $lang_code);
            }
            if (fn_allowed_for('ULTIMATE')) {
                fn_exim_update_share_feature($feature_id, $company_id);
            }
            $variants = fn_exim_product_feature_variants($feature, $feature_id, $variants, $lang_code);
        }
        fn_update_product_features_value($product_id, $variants, array(), $lang_code);
    }
    return true;
}
Esempio n. 2
0
 function fn_exim_set_product_features($product_id, $data, $features_delimiter, $lang_code = '')
 {
     $pair_delimiter = ':';
     $set_delimiter = ';';
     if (!empty($data)) {
         if (preg_match_all("/[ ]*(\\{\\d+\\})?[ ]*(\\(.+?\\))?[ ]*(.+?):[ ]*([\\w]{1})[ ]*\\[(.*?)\\];?/", $data, $features)) {
             // First, delete all links to features
             db_query("DELETE FROM ?:product_features_values WHERE product_id = ?i AND lang_code = ?s", $product_id, $lang_code);
             foreach ($features[3] as $k => $feature) {
                 // feature data
                 $feature_id_csv = fn_exim_get_item_id($features[1][$k]);
                 $feature_type = $features[4][$k];
                 $vars = fn_explode($features_delimiter, $features[5][$k]);
                 // find group_id
                 $group_id = 0;
                 $group_exists = true;
                 if (!empty($features[2][$k])) {
                     $group_id = fn_exim_check_feature_group($features[2][$k], $lang_code, $group_exists);
                 }
                 // try to find similar feature (same description, type, parent)
                 $feature_id = 0;
                 if ($group_exists) {
                     $feature_id = db_get_field('SELECT ?:product_features.feature_id FROM ?:product_features_descriptions ' . 'LEFT JOIN ?:product_features ON ?:product_features.feature_id = ?:product_features_descriptions.feature_id ' . 'WHERE description = ?s AND lang_code = ?s AND feature_type = ?s AND parent_id = ?i LIMIT 1', $feature, $lang_code, $feature_type, $group_id);
                 }
                 if (empty($feature_id)) {
                     // insert new feature
                     $feature_data = array('feature_type' => $feature_type, 'parent_id' => $group_id, 'description' => $feature);
                     if (!empty($feature_id_csv)) {
                         $existent_id = db_get_field('SELECT feature_id FROM ?:product_features WHERE feature_id = ?i', $feature_id_csv);
                         if (empty($existent_id)) {
                             $feature_data['feature_id'] = $feature_id_csv;
                         }
                     }
                     $feature_id = $feature_data['feature_id'] = db_query("INSERT INTO ?:product_features ?e", $feature_data);
                     foreach ((array) Registry::get('languages') as $feature_data['lang_code'] => $_v) {
                         db_query("REPLACE INTO ?:product_features_descriptions ?e", $feature_data);
                     }
                 }
                 // import feature variants
                 $i_data = array('product_id' => $product_id, 'lang_code' => $lang_code, 'feature_id' => $feature_id);
                 if (strpos('MSNE', $feature_type) !== false) {
                     // variant IDs
                     $existent_variants = db_get_hash_single_array('SELECT pfvd.variant_id, variant FROM ?:product_feature_variant_descriptions AS pfvd ' . 'LEFT JOIN ?:product_feature_variants AS pfv ON pfv.variant_id = pfvd.variant_id ' . 'WHERE feature_id = ?i AND variant IN (?a) AND lang_code = ?s', array('variant_id', 'variant'), $feature_id, $vars, $lang_code);
                     foreach ($vars as $v) {
                         if (in_array($v, $existent_variants)) {
                             // variant exists
                             $i_data['variant_id'] = array_search($v, $existent_variants);
                         } else {
                             // add variant
                             $v_data = array('feature_id' => $feature_id);
                             $variant_id = db_query("INSERT INTO ?:product_feature_variants ?e", $v_data);
                             $v_data = array('variant_id' => $variant_id, 'variant' => $v);
                             foreach ((array) Registry::get('languages') as $v_data['lang_code'] => $_v) {
                                 db_query("INSERT INTO ?:product_feature_variant_descriptions ?e", $v_data);
                             }
                             $i_data['variant_id'] = $variant_id;
                         }
                         //db_query("REPLACE INTO ?:product_features_values ?e", $i_data);
                         foreach ((array) Registry::get('languages') as $i_data['lang_code'] => $_v) {
                             db_query("REPLACE INTO ?:product_features_values ?e", $i_data);
                         }
                     }
                 } elseif (strpos('OD', $feature_type) !== false) {
                     // value INT
                     $i_data['value_int'] = $feature_type == 'D' && strpos($vars[0], '/') !== false ? fn_parse_date($vars[0]) : $vars[0];
                     //db_query("REPLACE INTO ?:product_features_values ?e", $i_data);
                     foreach ((array) Registry::get('languages') as $i_data['lang_code'] => $_v) {
                         db_query("REPLACE INTO ?:product_features_values ?e", $i_data);
                     }
                 } else {
                     // TEXT
                     $i_data['value'] = $vars[0];
                     //db_query("REPLACE INTO ?:product_features_values ?e", $i_data);
                     foreach ((array) Registry::get('languages') as $i_data['lang_code'] => $_v) {
                         db_query("REPLACE INTO ?:product_features_values ?e", $i_data);
                     }
                 }
             }
         }
     }
     return true;
 }