/** * Handles saving updates from the product editor * * Saves all product related information which includes core product data * and supporting elements such as images, digital downloads, tags, * assigned categories, specs and pricing variations. * * @return void **/ function save_product ($Product) { $db = DB::get(); $Settings = &EcartSettings(); check_admin_referer('ecart-save-product'); if ( !(is_ecart_userlevel() || current_user_can('ecart_products')) ) wp_die(__('You do not have sufficient permissions to access this page.')); $Settings->saveform(); // Save workflow setting $base = $Settings->get('base_operations'); $taxrate = 0; if ($base['vat']) $taxrate = ecart_taxrate(null,true,$Product); if (empty($_POST['options'])) $Product->options = array(); else $_POST['options'] = stripslashes_deep($_POST['options']); if (empty($Product->slug)) $Product->slug = sanitize_title_with_dashes($_POST['name']); // Check for an existing product slug $exclude_product = !empty($Product->id)?"AND id != $Product->id":""; $existing = $db->query("SELECT slug FROM $Product->_table WHERE slug='$Product->slug' $exclude_product LIMIT 1"); if ($existing) { $suffix = 2; while($existing) { $altslug = substr($Product->slug, 0, 200-(strlen($suffix)+1)). "-".$suffix++; $existing = $db->query("SELECT slug FROM $Product->_table WHERE slug='$altslug' $exclude_product LIMIT 1"); } $Product->slug = $altslug; } if ($_POST['status'] == "publish") { $publishfields = array('month' => '','date' => '','year' => '','hour'=>'','minute'=>'','meridiem'=>''); $publishdate = join('',array_merge($publishfields,$_POST['publish'])); if (!empty($publishdate)) { if ($_POST['publish']['meridiem'] == "PM" && $_POST['publish']['hour'] < 12) $_POST['publish']['hour'] += 12; $_POST['publish'] = mktime($_POST['publish']['hour'],$_POST['publish']['minute'],0,$_POST['publish']['month'],$_POST['publish']['date'],$_POST['publish']['year']); } else { unset($_POST['publish']); // Auto set the publish date if not set (or more accurately, if set to an irrelevant timestamp) if ($Product->publish <= 86400) $Product->publish = time(); } } else { unset($_POST['publish']); $Product->publish = 0; } if (isset($_POST['content'])) $_POST['description'] = $_POST['content']; $Product->updates($_POST,array('categories','prices')); $Product->save(); $Product->save_categories($_POST['categories']); $Product->save_tags(explode(",",$_POST['taglist'])); if (!empty($_POST['price']) && is_array($_POST['price'])) { // Delete prices that were marked for removal if (!empty($_POST['deletePrices'])) { $deletes = array(); if (strpos($_POST['deletePrices'],",")) $deletes = explode(',',$_POST['deletePrices']); else $deletes = array($_POST['deletePrices']); foreach($deletes as $option) { $Price = new Price($option); $Price->delete(); } } // Save prices that there are updates for foreach($_POST['price'] as $i => $option) { if (empty($option['id'])) { $Price = new Price(); $option['product'] = $Product->id; } else $Price = new Price($option['id']); $option['sortorder'] = array_search($i,$_POST['sortorder'])+1; // Remove VAT amount to save in DB if ($base['vat'] && isset($option['tax']) && $option['tax'] == "on") { $option['price'] = (floatvalue($option['price'])/(1+$taxrate)); $option['saleprice'] = (floatvalue($option['saleprice'])/(1+$taxrate)); } $option['shipfee'] = floatvalue($option['shipfee']); $option['weight'] = floatvalue($option['weight']); if (isset($options['dimensions']) && is_array($options['dimensions'])) foreach ($option['dimensions'] as &$dimension) $dimension = floatvalue($dimension); $Price->updates($option); $Price->save(); if (!empty($option['download'])) $Price->attach_download($option['download']); if (!empty($option['downloadpath'])) { // Attach file specified by URI/path if (!empty($Price->download->id) || (empty($Price->download) && $Price->load_download())) { $File = $Price->download; } else $File = new ProductDownload(); $stored = false; $tmpfile = sanitize_path($option['downloadpath']); $File->storage = false; $Engine = $File->_engine(); // Set engine from storage settings $File->parent = $Price->id; $File->context = "price"; $File->type = "download"; $File->name = !empty($option['downloadfile'])?$option['downloadfile']:basename($tmpfile); $File->filename = $File->name; if ($File->found($tmpfile)) { $File->uri = $tmpfile; $stored = true; } else $stored = $File->store($tmpfile,'file'); if ($stored) { $File->readmeta(); $File->save(); } } // END attach file by path/uri } unset($Price); } // No variation options at all, delete all variation-pricelines if (!empty($Product->prices) && is_array($Product->prices) && (empty($_POST['options']['v']) || empty($_POST['options']['a']))) { foreach ($Product->prices as $priceline) { // Skip if not tied to variation options if ($priceline->optionkey == 0) continue; if ((empty($_POST['options']['v']) && $priceline->context == "variation") || (empty($_POST['options']['a']) && $priceline->context == "addon")) { $Price = new Price($priceline->id); $Price->delete(); } } } if (!empty($_POST['details']) || !empty($_POST['deletedSpecs'])) { $deletes = array(); if (!empty($_POST['deletedSpecs'])) { if (strpos($_POST['deletedSpecs'],",")) $deletes = explode(',',$_POST['deletedSpecs']); else $deletes = array($_POST['deletedSpecs']); foreach($deletes as $option) { $Spec = new Spec($option); $Spec->delete(); } unset($Spec); } if (is_array($_POST['details'])) { foreach ($_POST['details'] as $i => $spec) { if (in_array($spec['id'],$deletes)) continue; if (isset($spec['new'])) { $Spec = new Spec(); $spec['id'] = ''; $spec['parent'] = $Product->id; } else $Spec = new Spec($spec['id']); $spec['sortorder'] = array_search($i,$_POST['details-sortorder'])+1; $Spec->updates($spec); $Spec->save(); } } } if (!empty($_POST['deleteImages'])) { $deletes = array(); if (strpos($_POST['deleteImages'],",")) $deletes = explode(',',$_POST['deleteImages']); else $deletes = array($_POST['deleteImages']); $Product->delete_images($deletes); } if (!empty($_POST['images']) && is_array($_POST['images'])) { $Product->link_images($_POST['images']); $Product->save_imageorder($_POST['images']); if (!empty($_POST['imagedetails'])) $Product->update_images($_POST['imagedetails']); } do_action_ref_array('ecart_product_saved',array(&$Product)); unset($Product); return true; }
function import_file () { check_admin_referer('wp_ajax_ecart_import_file'); global $Ecart; $Engine =& $Ecart->Storage->engines['download']; $error = create_function('$s', 'die(json_encode(array("error" => $s)));'); if (empty($_REQUEST['url'])) $error(__('No file import URL was provided.','Ecart')); $url = $_REQUEST['url']; $request = parse_url($url); $headers = array(); $filename = basename($request['path']); $_ = new StdClass(); $_->name = $filename; $_->stored = false; $File = new ProductDownload(); $stored = false; $File->_engine(); // Set engine from storage settings $File->uri = sanitize_path($url); $File->type = "download"; $File->name = $filename; $File->filename = $filename; if ($File->found()) { // File in storage, look up meta from storage engine $File->readmeta(); $_->stored = true; $_->path = $File->uri; $_->size = $File->size; $_->mime = $File->mime; if ($_->mime == "application/octet-stream" || $_->mime == "text/plain") $mime = file_mimetype($File->name); if ($mime == "application/octet-stream" || $mime == "text/plain") $_->mime = $mime; } else { if (!$importfile = @tempnam(sanitize_path(realpath(ECART_TEMP_PATH)), 'shp')) $error(sprintf(__('A temporary file could not be created for importing the file.','Ecart'),$importfile)); if (!$incoming = @fopen($importfile,'w')) $error(sprintf(__('A temporary file at %s could not be opened for importing.','Ecart'),$importfile)); if (!$file = @fopen(linkencode($url), 'rb')) $error(sprintf(__('The file at %s could not be opened for importing.','Ecart'),$url)); $data = @stream_get_meta_data($file); if (isset($data['timed_out']) && $data['timed_out']) $error(__('The connection timed out while trying to get information about the target file.','Ecart')); if (isset($data['wrapper_data'])) { foreach ($data['wrapper_data'] as $d) { if (strpos($d,':') === false) continue; list($name,$value) = explode(': ',$d); if ($rel = strpos($value,';')) $headers[$name] = substr($value,0,$rel); else $headers[$name] = $value; } } $tmp = basename($importfile); $Settings =& EcartSettings(); $_->path = $importfile; if (empty($headers)) { // Stat file data directly if no stream data available $_->size = filesize($url); $_->mime = file_mimetype($url); } else { // Use the stream data $_->size = $headers['Content-Length']; $_->mime = $headers['Content-Type'] == 'text/plain'?file_mimetype($_->name):$headers['Content-Type']; } } // Mimetype must be set or we'll have problems in the UI if (!$_->mime) $_->mime = "application/octet-stream"; ob_end_clean(); header("Connection: close"); header("Content-Encoding: none"); ob_start(); echo json_encode($_); $size = ob_get_length(); header("Content-Length: $size"); ob_end_flush(); flush(); ob_end_clean(); if ($_->stored) return; $progress = 0; fseek($file, 0); $packet = 1024*1024; while(!feof($file)) { if (connection_status() !== 0) return false; $buffer = fread($file,$packet); if (!empty($buffer)) { fwrite($incoming, $buffer); $progress += strlen($buffer); $Settings->save($tmp.'_import_progress',$progress); } } fclose($file); fclose($incoming); sleep(5); $Settings->delete($tmp.'_import_progress'); exit(); }