function save_product($Product) { global $Shopp; $db = DB::get(); check_admin_referer('shopp-save-product'); if (!current_user_can(SHOPP_USERLEVEL)) { wp_die(__('You do not have sufficient permissions to access this page.')); } $this->settings_save(); // Save workflow setting $base = $Shopp->Settings->get('base_operations'); $taxrate = 0; if ($base['vat']) { $taxrate = $Shopp->Cart->taxrate(); } if (!$_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"); $suffix++; } $Product->slug = $altslug; } if (isset($_POST['content'])) { $_POST['description'] = $_POST['content']; } $Product->updates($_POST, array('categories')); $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'] && $option['tax'] == "on") { $option['price'] = number_format(floatnum($option['price']) / (1 + $taxrate), 2); $option['saleprice'] = number_format(floatnum($option['saleprice']) / (1 + $taxrate), 2); } $Price->updates($option); $Price->save(); if (!empty($option['download'])) { $Price->attach_download($option['download']); } if (!empty($option['downloadpath'])) { $basepath = trailingslashit($Shopp->Settings->get('products_path')); $download = $basepath . ltrim($option['downloadpath'], "/"); if (file_exists($download)) { $File = new Asset(); $File->parent = 0; $File->context = "price"; $File->datatype = "download"; $File->name = basename($download); $File->value = substr(dirname($download), strlen($basepath)); $File->size = filesize($download); $File->properties = array("mimetype" => file_mimetype($download, $File->name)); $File->save(); $Price->attach_download($File->id); } } } unset($Price); } // No variation options at all, delete all variation-pricelines if (empty($Product->options) && !empty($Product->prices) && is_array($Product->prices)) { foreach ($Product->prices as $priceline) { // Skip if not tied to variation options if ($priceline->optionkey == 0) { continue; } $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['product'] = $Product->id; } else { $Spec = new Spec($spec['id']); } $spec['sortorder'] = array_search($i, $_POST['details-sortorder']) + 1; $Spec->updates($spec); if (preg_match('/^.*?(\\d+[\\.\\,\\d]*).*$/', $spec['content'])) { $Spec->numeral = preg_replace('/^.*?(\\d+[\\.\\,\\d]*).*$/', '$1', $spec['content']); } $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('shopp_product_saved', array(&$Product)); unset($Product); return true; }
/** * 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 duplicate () { $db =& DB::get(); $this->load_data(array('prices','specs','categories','tags','images','taxes'=>'false')); $this->id = ''; $this->name = $this->name.' '.__('copy','Ecart'); $this->slug = sanitize_title_with_dashes($this->name); // Check for an existing product slug $existing = $db->query("SELECT slug FROM $this->_table WHERE slug='$this->slug' LIMIT 1"); if ($existing) { $suffix = 2; while($existing) { $altslug = substr($this->slug, 0, 200-(strlen($suffix)+1)). "-$suffix"; $existing = $db->query("SELECT slug FROM $this->_table WHERE slug='$altslug' LIMIT 1"); $suffix++; } $this->slug = $altslug; } $this->created = ''; $this->modified = ''; $this->save(); // Copy prices foreach ($this->prices as $price) { $Price = new Price(); $Price->updates($price,array('id','product','created','modified')); $Price->product = $this->id; $Price->save(); } // Copy sepcs foreach ($this->specs as $spec) { $Spec = new Spec(); $Spec->updates($spec,array('id','parent','created','modified')); $Spec->parent = $this->id; $Spec->save(); } // Copy categories $categories = array(); foreach ($this->categories as $category) $categories[] = $category->id; $this->categories = array(); $this->save_categories($categories); // Copy tags $taglist = array(); foreach ($this->tags as $tag) $taglist[] = $tag->name; $this->tags = array(); $this->save_tags($taglist); // Copy product images foreach ($this->images as $ProductImage) { $Image = new ProductImage(); $Image->updates($ProductImage,array('id','parent','created','modified')); $Image->parent = $this->id; $Image->save(); } }
function duplicate() { $db =& DB::get(); $this->load_data(array('prices', 'specs', 'categories', 'tags', 'images', 'taxes' => 'false')); $this->id = ''; $this->name = $this->name . ' ' . __('copy', 'Shopp'); $this->slug = sanitize_title_with_dashes($this->name); // Check for an existing product slug $existing = $db->query("SELECT slug FROM {$this->_table} WHERE slug='{$this->slug}' LIMIT 1"); if ($existing) { $suffix = 2; while ($existing) { $altslug = substr($this->slug, 0, 200 - (strlen($suffix) + 1)) . "-{$suffix}"; $existing = $db->query("SELECT slug FROM {$this->_table} WHERE slug='{$altslug}' LIMIT 1"); $suffix++; } $this->slug = $altslug; } $this->created = ''; $this->modified = ''; $this->save(); // Copy prices foreach ($this->prices as $price) { $Price = new Price(); $Price->updates($price, array('id', 'product', 'created', 'modified')); $Price->product = $this->id; $Price->save(); } // Copy sepcs foreach ($this->specs as $spec) { $Spec = new Spec(); $Spec->updates($spec, array('id', 'product', 'created', 'modified')); $Spec->product = $this->id; $Spec->save(); } // Copy categories $categories = array(); foreach ($this->categories as $category) { $categories[] = $category->id; } $this->categories = array(); $this->save_categories($categories); // Copy tags $taglist = array(); foreach ($this->tags as $tag) { $taglist[] = $tag->name; } $this->tags = array(); $this->save_tags($taglist); // // Copy product images $template = new Asset(); $columns = array(); $values = array(); foreach ($template->_datatypes as $name => $type) { $colname = $name; $columns[$colname] = $name; if ($name == "id") { $name = "''"; } if ($name == "parent") { $name = "'{$this->id}'"; } if ($name == "created" || $name == "modified") { $name = "now()"; } $values[$colname] = $name; } $sets = array('image', 'small', 'thumbnail'); $images = array(); foreach ($sets as $set) { foreach ($this->imagesets[$set] as $image) { if (isset($images[$image->src])) { $values['src'] = $images[$image->src]; } $id = $db->query("INSERT {$template->_table} (" . join(',', $columns) . ") SELECT " . join(",", $values) . " FROM {$template->_table} WHERE id={$image->id}"); if ($set == "image") { $images[$image->id] = $id; $db->query("UPDATE {$template->_table} SET src={$id} WHERE id={$id} LIMIT 1"); } } } }