/** * Loads specified relational data associated with the product * * @since 1.1 * * @param array $options List of data to load (prices, images, categories, tags, specs) * @param array $products List of products to load data for * @return void **/ function load_data ($options=false,&$products=false) { global $Ecart; $db =& DB::get(); // Load object schemas on request $catalogtable = DatabaseObject::tablename(Catalog::$table); $Dataset = array(); if (in_array('prices',$options)) { $this->prices = array(); $promotable = DatabaseObject::tablename(Promotion::$table); $discounttable = DatabaseObject::tablename(Discount::$table); $assettable = DatabaseObject::tablename(ProductDownload::$table); $Dataset['prices'] = new Price(); $Dataset['prices']->_datatypes['promos'] = "MAX(promo.status)"; $Dataset['prices']->_datatypes['promotions'] = "group_concat(promo.name)"; $Dataset['prices']->_datatypes['percentoff'] = "SUM(IF (promo.type='Percentage Off',promo.discount,0))"; $Dataset['prices']->_datatypes['amountoff'] = "SUM(IF (promo.type='Amount Off',promo.discount,0))"; $Dataset['prices']->_datatypes['freeshipping'] = "SUM(IF (promo.type='Free Shipping',1,0))"; $Dataset['prices']->_datatypes['buyqty'] = "IF (promo.type='Buy X Get Y Free',promo.buyqty,0)"; $Dataset['prices']->_datatypes['getqty'] = "IF (promo.type='Buy X Get Y Free',promo.getqty,0)"; $Dataset['prices']->_datatypes['download'] = "download.id"; $Dataset['prices']->_datatypes['filename'] = "download.name"; $Dataset['prices']->_datatypes['filedata'] = "download.value"; } if (in_array('images',$options)) { $this->images = array(); $Dataset['images'] = new ProductImage(); array_merge($Dataset['images']->_datatypes,$Dataset['images']->_xcols); } if (in_array('categories',$options)) { $this->categories = array(); $Dataset['categories'] = new Category(); unset($Dataset['categories']->_datatypes['priceranges']); unset($Dataset['categories']->_datatypes['specs']); unset($Dataset['categories']->_datatypes['options']); unset($Dataset['categories']->_datatypes['prices']); } if (in_array('specs',$options)) { $this->specs = array(); $Dataset['specs'] = new Spec(); } if (in_array('tags',$options)) { $this->tags = array(); $Dataset['tags'] = new Tag(); } // Determine the maximum columns to allocate $maxcols = 0; foreach ($Dataset as $set) { $cols = count($set->_datatypes); if ($cols > $maxcols) $maxcols = $cols; } // Prepare product list depending on single product or entire list $ids = array(); if (isset($products) && is_array($products)) { foreach ($products as $product) $ids[] = $product->id; } else $ids[0] = $this->id; // Skip if there are no product ids if (empty($ids) || empty($ids[0])) return false; // Build the mega-query foreach ($Dataset as $rtype => $set) { // Allocate generic columns for record data $columns = array(); $i = 0; foreach ($set->_datatypes as $key => $datatype) $columns[] = ((strpos($datatype,'.')!==false)?"$datatype":"{$set->_table}.$key")." AS c".($i++); for ($i = $i; $i < $maxcols; $i++) $columns[] = "'' AS c$i"; $cols = join(',',$columns); // Build object-specific selects and UNION them $where = ""; if (isset($query)) $query .= " UNION "; else $query = ""; switch($rtype) { case "prices": foreach ($ids as $id) $where .= ((!empty($where))?" OR ":"")."$set->_table.product=$id"; $query .= "(SELECT '$set->_table' as dataset,$set->_table.product AS product,'$rtype' AS rtype,'' AS alphaorder,$set->_table.sortorder AS sortorder,$cols FROM $set->_table LEFT JOIN $assettable AS download ON $set->_table.id=download.parent AND download.context='price' AND download.type='download' LEFT JOIN $discounttable AS discount ON discount.product=$set->_table.product AND discount.price=$set->_table.id LEFT JOIN $promotable AS promo ON promo.id=discount.promo AND (promo.status='enabled' AND ((UNIX_TIMESTAMP(starts)=1 AND UNIX_TIMESTAMP(ends)=1) OR (".time()." > UNIX_TIMESTAMP(starts) AND ".time()." < UNIX_TIMESTAMP(ends)) OR (UNIX_TIMESTAMP(starts)=1 AND ".time()." < UNIX_TIMESTAMP(ends)) OR (".time()." > UNIX_TIMESTAMP(starts) AND UNIX_TIMESTAMP(ends)=1) )) WHERE $where GROUP BY $set->_table.id)"; break; case "images": $ordering = $Ecart->Settings->get('product_image_order'); if (empty($ordering)) $ordering = "ASC"; $orderby = $Ecart->Settings->get('product_image_orderby'); $sortorder = "0"; if ($orderby == "sortorder" || $orderby == "created") { if ($orderby == "created") $orderby = "UNIX_TIMESTAMP(created)"; switch ($ordering) { case "DESC": $sortorder = "$orderby*-1"; break; case "RAND": $sortorder = "RAND()"; break; default: $sortorder = "$orderby"; } } $alphaorder = "''"; if ($orderby == "name") { switch ($ordering) { case "DESC": $alphaorder = "$orderby"; break; case "RAND": $alphaorder = "RAND()"; break; default: $alphaorder = "$orderby"; } } foreach ($ids as $id) $where .= ((!empty($where))?" OR ":"")."parent=$id"; $where = "($where) AND context='product' AND type='image'"; $query .= "(SELECT '$set->_table' as dataset,parent AS product,'$rtype' AS rtype,$alphaorder AS alphaorder,$sortorder AS sortorder,$cols FROM $set->_table WHERE $where ORDER BY $orderby)"; break; case "specs": foreach ($ids as $id) $where .= ((!empty($where))?" OR ":"")."parent=$id AND context='product' AND type='spec'"; $query .= "(SELECT '$set->_table' as dataset,parent AS product,'$rtype' AS rtype,'' AS alphaorder,sortorder AS sortorder,$cols FROM $set->_table WHERE $where)"; break; case "categories": foreach ($ids as $id) $where .= ((!empty($where))?" OR ":"")."catalog.product=$id"; $where = "($where) AND catalog.type='category'"; $query .= "(SELECT '$set->_table' as dataset,catalog.product AS product,'$rtype' AS rtype,$set->_table.name AS alphaorder,0 AS sortorder,$cols FROM $catalogtable AS catalog LEFT JOIN $set->_table ON catalog.parent=$set->_table.id AND catalog.type='category' WHERE $where)"; break; case "tags": foreach ($ids as $id) $where .= ((!empty($where))?" OR ":"")."catalog.product=$id"; $where = "($where) AND catalog.type='tag'"; $query .= "(SELECT '$set->_table' as dataset,catalog.product AS product,'$rtype' AS rtype,$set->_table.name AS alphaorder,0 AS sortorder,$cols FROM $catalogtable AS catalog LEFT JOIN $set->_table ON catalog.parent=$set->_table.id AND type='tag' WHERE $where)"; break; } } // Add order by columns $query .= " ORDER BY sortorder"; // die($query); // Execute the query $data = $db->query($query,AS_ARRAY); // Process the results into specific product object data in a product set foreach ($data as $row) { if (is_array($products) && isset($products[$row->product])) $target = $products[$row->product]; else $target = $this; $record = new stdClass(); $i = 0; $name = ""; foreach ($Dataset[$row->rtype]->_datatypes AS $key => $datatype) { $column = 'c'.$i++; $record->{$key} = ''; if ($key == "name") $name = $row->{$column}; if (!empty($row->{$column})) { if (preg_match("/^[sibNaO](?:\:.+?\{.*\}$|\:.+;$|;$)/",$row->{$column})) $row->{$column} = unserialize($row->{$column}); $record->{$key} = $row->{$column}; } } if ($row->rtype == "images") { $image = new ProductImage(); $image->copydata($record,false,array()); $image->expopulate(); $name = $image->filename; $record = $image; // Reset the product's loaded images if the image was already // loaded from another context (like Category::load_products()) if (isset($target->{$row->rtype}[0]) && $target->{$row->rtype}[0]->id == $image->id) $target->{$row->rtype} = array(); } $target->{$row->rtype}[] = $record; if (!empty($name)) { if (isset($target->{$row->rtype.'key'}[$name])) $target->{$row->rtype.'key'}[$name] = array($target->{$row->rtype.'key'}[$name],$record); else $target->{$row->rtype.'key'}[$name] = $record; } } if (is_array($products)) { foreach ($products as $product) if (!empty($product->prices)) $product->pricing(); } else { if (!empty($this->prices)) $this->pricing($options); } } // end load_data()
/** * Interface processor for the product editor * * @return void **/ function editor () { global $Ecart,$ProductImages; $db = DB::get(); if ( !(is_ecart_userlevel() || current_user_can('ecart_products')) ) wp_die(__('You do not have sufficient permissions to access this page.')); if (empty($Ecart->Product)) { $Product = new Product(); $Product->status = "publish"; } else $Product = $Ecart->Product; // $Product->load_data(array('images')); // echo "<pre>"; print_r($Product->imagesets); echo "</pre>"; $Product->slug = apply_filters('editable_slug',$Product->slug); $permalink = trailingslashit(ecarturl()); require_once("$Ecart->path/core/model/Asset.php"); require_once("$Ecart->path/core/model/Category.php"); $Price = new Price(); $priceTypes = array( array('value'=>'Shipped','label'=>__('Tangible Product','Ecart')), array('value'=>'Download','label'=>__('Digital Download','Ecart')), array('value'=>'N/A','label'=>__('Disabled','Ecart')), ); $workflows = array( "continue" => __('Continue Editing','Ecart'), "close" => __('Products Manager','Ecart'), "new" => __('New Product','Ecart'), "next" => __('Edit Next','Ecart'), "previous" => __('Edit Previous','Ecart') ); $taglist = array(); foreach ($Product->tags as $tag) $taglist[] = $tag->name; if ($Product->id) { $ProductImage = new ProductImage(); $results = $db->query("SELECT * FROM $ProductImage->_table WHERE context='product' AND parent=$Product->id AND type='image' ORDER BY sortorder",AS_ARRAY); $ProductImages = array(); foreach ((array)$results as $i => $image) { $image->value = unserialize($image->value); $ProductImages[$i] = new ProductImage(); $ProductImages[$i]->copydata($image,false,array()); $ProductImages[$i]->expopulate(); // Load any cropped image cache $cropped = $db->query("SELECT * FROM $ProductImage->_table WHERE context='image' AND type='image' AND parent='$image->id' AND '2'=SUBSTRING_INDEX(SUBSTRING_INDEX(name,'_',4),'_',-1)",AS_ARRAY); foreach ((array)$cropped as $c => $cache) { $cache->value = unserialize($cache->value); $CachedImage = new ProductImage(); $CachedImage->copydata($cache,false,array()); $CachedImage->expopulate(); $ProductImages[$i]->cropped[$c] = $CachedImage; } } } $shiprates = $this->Settings->get('shipping_rates'); if (!empty($shiprates)) ksort($shiprates); $uploader = $Ecart->Settings->get('uploader_pref'); if (!$uploader) $uploader = 'flash'; $process = (!empty($Product->id)?$Product->id:'new'); $_POST['action'] = add_query_arg(array_merge($_GET,array('page'=>$this->Admin->pagename('products'))),admin_url('admin.php')); include(ECART_ADMIN_PATH."/products/editor.php"); }