'product_id'); var $type = ''; function get($id,$default=null){ $element = parent::get($id); if($element){ $this->addAlias($element); } return $element; } function saveForm(){ $oldProduct = null; $product_id = hikashop_getCID('product_id'); $categories = JRequest::getVar( 'category', array(), '', 'array' ); JArrayHelper::toInteger($categories); $newCategories = array(); if(count($categories)){ foreach($categories as $category){ $newCategory = new stdClass(); $newCategory->category_id = $category; $newCategories[]=$newCategory; } } if($product_id){ $oldProduct = $this->get($product_id); $oldProduct->categories = $newCategories; }else{ $oldProduct = new stdClass; $oldProduct->categories = $newCategories; } $fieldsClass = hikashop_get('class.field'); $element = $fieldsClass->getInput('product',$oldProduct); $status = true; if(empty($element)){ $element = $_SESSION['hikashop_product_data']; $status = false; } if($product_id){ $element->product_id = $product_id; } if(isset($element->product_price_percentage)){ $element->product_price_percentage = hikashop_toFloat($element->product_price_percentage); } $element->categories = $categories; if(empty($element->product_id) && !count($element->categories) && (empty($element->product_type) || $element->product_type == 'main')) { $app = JFactory::getApplication(); $id = $app->getUserState(HIKASHOP_COMPONENT.'.product.filter_id'); if(empty($id) || !is_numeric($id)){ $id='product'; $class = hikashop_get('class.category'); $class->getMainElement($id); } if(!empty($id)){ $element->categories = array($id); } } $element->related = array(); $related = JRequest::getVar( 'related', array(), '', 'array' ); JArrayHelper::toInteger($related); if(!empty($related)){ $related_ordering = JRequest::getVar( 'related_ordering', array(), '', 'array' ); JArrayHelper::toInteger($related_ordering); foreach($related as $id){ $obj = new stdClass(); $obj->product_related_id = $id; $obj->product_related_ordering = $related_ordering[$id]; $element->related[$id] = $obj; } } $options = JRequest::getVar( 'options', array(), '', 'array' ); $element->options = array(); JArrayHelper::toInteger($element->options); if(!empty($options)){ $related_ordering = JRequest::getVar( 'options_ordering', array(), '', 'array' ); JArrayHelper::toInteger($related_ordering); foreach($options as $id){ $obj = new stdClass(); $obj->product_related_id = $id; $obj->product_related_ordering = $related_ordering[$id]; $element->options[$id] = $obj; } } $element->images = JRequest::getVar( 'image', array(), '', 'array' ); JArrayHelper::toInteger($element->images); $element->files = JRequest::getVar( 'file', array(), '', 'array' ); JArrayHelper::toInteger($element->files); $element->imagesorder = JRequest::getVar('imageorder', array(), '', 'array'); JArrayHelper::toInteger($element->imagesorder); $element->tags = JRequest::getVar('tags', array(), '', 'array'); $priceData = JRequest::getVar( 'price', array(), '', 'array' ); $element->prices = array(); foreach($priceData as $column => $value){ hikashop_secureField($column); if($column=='price_access'){ if(!empty($value)){ foreach($value as $k => $v){ $value[$k] = preg_replace('#[^a-z0-9,]#i','',$v); } } }elseif($column=='price_value'){ $this->toFloatArray($value); }else{ JArrayHelper::toInteger($value); } foreach($value as $k => $val){ if($column=='price_min_quantity' && $val==1){ $val=0; } if(!isset($element->prices[$k])) $element->prices[$k] = new stdClass(); $element->prices[$k]->$column = $val; } } $element->oldCharacteristics = array(); if(isset($element->product_type) && $element->product_type=='variant'){ $characteristics = JRequest::getVar( 'characteristic', array(), '', 'array' ); JArrayHelper::toInteger($characteristics); if(empty($characteristics)){ $element->characteristics = array(); }else{ $this->database->setQuery('SELECT * FROM '.hikashop_table('characteristic').' WHERE characteristic_id IN ('.implode(',',$characteristics).')'); $element->characteristics = $this->database->loadObjectList('characteristic_id'); } }else{ $characteristics = JRequest::getVar( 'characteristic', array(), '', 'array' ); JArrayHelper::toInteger($characteristics); if(!empty($characteristics)){ if(!empty($element->product_id)){ $this->database->setQuery('SELECT b.characteristic_id FROM '.hikashop_table('variant').' AS a LEFT JOIN '.hikashop_table('characteristic').' AS b ON a.variant_characteristic_id=b.characteristic_id WHERE a.variant_product_id ='.$element->product_id.' AND b.characteristic_parent_id=0'); if(!HIKASHOP_J25){ $element->oldCharacteristics = $this->database->loadResultArray(); } else { $element->oldCharacteristics = $this->database->loadColumn(); } } if(empty($element->oldCharacteristics)){ $element->oldCharacteristics = array(); } $characteristics_ordering = JRequest::getVar( 'characteristic_ordering', array(), '', 'array' ); JArrayHelper::toInteger($characteristics_ordering); $characteristics_default = JRequest::getVar( 'characteristic_default', array(), '', 'array' ); JArrayHelper::toInteger($characteristics_default); $this->database->setQuery('SELECT * FROM '.hikashop_table('characteristic').' WHERE characteristic_parent_id IN ('.implode(',',$characteristics).')'); $values = $this->database->loadObjectList(); $element->characteristics = array(); foreach($characteristics as $k => $id){ $obj = new stdClass(); $obj->characteristic_id = $id; $obj->ordering = $characteristics_ordering[$k]; $obj->default_id = (int)@$characteristics_default[$k]; $obj->values = array(); foreach($values as $value){ if($value->characteristic_parent_id==$id){ $obj->values[$value->characteristic_id]=$value->characteristic_value; } } $element->characteristics[]=$obj; } } } $class = hikashop_get('helper.translation'); $class->getTranslations($element); if(!empty($element->product_sale_start)){ $element->product_sale_start=hikashop_getTime($element->product_sale_start); } if(!empty($element->product_sale_end)){ $element->product_sale_end=hikashop_getTime($element->product_sale_end); } $element->product_max_per_order=(int)$element->product_max_per_order; $element->product_description = JRequest::getVar('product_description','','','string',JREQUEST_ALLOWRAW); if(!empty($element->product_id) && !empty($element->product_code)){ $query = 'SELECT product_id FROM '.hikashop_table('product').' WHERE product_code = '.$this->database->Quote($element->product_code).' AND product_id!='.(int)$element->product_id.' LIMIT 1'; $this->database->setQuery($query); if($this->database->loadResult()){ $app = JFactory::getApplication(); $app->enqueueMessage(JText::_( 'DUPLICATE_PRODUCT' ), 'error'); JRequest::setVar( 'fail', $element ); return false; } } $config =& hikashop_config(); if($config->get('alias_auto_fill',1) && empty($element->product_alias)){ $this->addAlias($element); $element->product_alias = $element->alias; unset($element->alias); } if($status){ $status = $this->save($element); }else{ JRequest::setVar( 'fail', $element ); return $status; } if($status){ $this->updateCategories($element,$status); $this->updatePrices($element,$status); $this->updateFiles($element,$status,'files'); $this->updateFiles($element,$status,'images',$element->imagesorder); $this->updateRelated($element,$status,'related'); $this->updateRelated($element,$status,'options'); $this->updateCharacteristics($element,$status); $class->handleTranslations('product',$status,$element); }else{ JRequest::setVar( 'fail', $element ); if(empty($element->product_id) && empty($element->product_code) && empty($element->product_name)){ $app = JFactory::getApplication(); $app->enqueueMessage(JText::_( 'SPECIFY_NAME_AND_CODE' ), 'error'); }else{ $query = 'SELECT product_id FROM '.hikashop_table('product').' WHERE product_code = '.$this->database->Quote($element->product_code).' LIMIT 1'; $this->database->setQuery($query); if($this->database->loadResult()){ $app = JFactory::getApplication(); $app->enqueueMessage(JText::_( 'DUPLICATE_PRODUCT' ), 'error'); } } } return $status; } function getCategories($product_id){ if(empty($product_id)) return false; static $categoriesArray = array(); if(!isset($categoriesArray[$product_id])){ $query='SELECT category_id FROM '.hikashop_table('product_category').' WHERE product_id='.$product_id.' ORDER BY ordering ASC'; $this->database->setQuery($query); if(!HIKASHOP_J25){ $categoriesArray[$product_id]=$this->database->loadResultArray(); } else { $categoriesArray[$product_id]=$this->database->loadColumn(); } } return $categoriesArray[$product_id]; } function getProducts($ids,$mode='id'){ if(is_numeric($ids)){ $ids = array($ids); } $where=''; if(empty($ids)){ $this->database->setQuery('SELECT product_id FROM '.hikashop_table('product').' ORDER BY product_id ASC'); if(!HIKASHOP_J25){ $ids = $this->database->loadResultArray(); } else { $ids = $this->database->loadColumn(); } }else{ JArrayHelper::toInteger($ids,0); } if(count($ids)<1) return false; $query = 'SELECT * FROM '.hikashop_table('product_related').' AS a WHERE a.product_id IN ('.implode(',',$ids).')'; $this->database->setQuery($query); $related = $this->database->loadObjectList(); foreach($related as $rel){ if($mode!='import' && $rel->product_related_type=='options' && !in_array($rel->product_related_id,$ids)) $ids[]=$rel->product_related_id; } $where=' WHERE product_id IN ('.implode(',',$ids).') OR product_parent_id IN ('.implode(',',$ids).')'; $query = 'SELECT * FROM '.hikashop_table('product').$where.' ORDER BY product_parent_id ASC, product_id ASC'; $this->database->setQuery($query); $all_products = $this->database->loadObjectList('product_id'); if(empty($all_products)) return false; $all_ids = array_keys($all_products); $products = array(); $variants = array(); $ids = array(); foreach($all_products as $key => $product){ $all_products[$key]->prices=array(); $all_products[$key]->files=array(); $all_products[$key]->images=array(); $all_products[$key]->variant_links=array(); $all_products[$key]->translations=array(); if($product->product_type=='main'){ $all_products[$key]->categories=array(); $all_products[$key]->categories_ordering=array(); $all_products[$key]->related=array(); $all_products[$key]->options=array(); $all_products[$key]->variants=array(); $products[$product->product_id]=&$all_products[$key]; $ids[] = $product->product_id; }else{ foreach($all_products as $key2 => $main){ if($main->product_type != 'main') continue; if($main->product_id == $product->product_parent_id){ $all_products[$key2]->variants[$product->product_id]=&$all_products[$key]; } } $variants[$product->product_id]=&$all_products[$key]; } } foreach($related as $rel){ $type = $rel->product_related_type; $all_products[$rel->product_id]->{$type}[]=$rel->product_related_id; } $transHelper = hikashop_get('helper.translation'); if($transHelper->isMulti(true)){ $trans_table = 'jf_content'; if($transHelper->falang){ $trans_table = 'falang_content'; } $query = 'SELECT * FROM '.hikashop_table($trans_table,false).' WHERE reference_id IN ('.implode(',',$all_ids).') AND reference_table=\'hikashop_product\' ORDER BY reference_id ASC'; $this->database->setQuery($query); $translations = $this->database->loadObjectList(); if(!empty($translations)){ foreach($translations as $translation){ $all_products[$translation->reference_id]->translations[]=$translation; } } } if(!empty($ids)){ $query = 'SELECT * FROM '.hikashop_table('product_category').' WHERE product_id IN ('.implode(',',$ids).') ORDER BY ordering ASC'; $this->database->setQuery($query); $categories = $this->database->loadObjectList(); if(!empty($categories)){ foreach($categories as $category){ $all_products[$category->product_id]->categories[]=$category->category_id; $all_products[$category->product_id]->categories_ordering[]=$category->ordering; } } } $query = 'SELECT * FROM '.hikashop_table('price').' WHERE price_product_id IN ('.implode(',',$all_ids).')'; $this->database->setQuery($query); $prices = $this->database->loadObjectList(); if(!empty($prices)){ foreach($prices as $price){ $all_products[$price->price_product_id]->prices[]=$price; } } $query = 'SELECT * FROM '.hikashop_table('file').' WHERE file_ref_id IN ('.implode(',',$all_ids).') AND file_type IN (\'product\',\'file\') ORDER BY file_ordering ASC, file_id ASC'; $this->database->setQuery($query); $files = $this->database->loadObjectList(); if(!empty($files)){ foreach($files as $file){ if($file->file_type=='file'){ $type='files'; }else{ $type='images'; } $all_products[$file->file_ref_id]->{$type}[]=$file; } } $query = 'SELECT * FROM '.hikashop_table('variant').' WHERE variant_product_id IN ('.implode(',',$all_ids).') ORDER BY ordering ASC'; $this->database->setQuery($query); $variants = $this->database->loadObjectList(); if(!empty($variants)){ foreach($variants as $variant){ $all_products[$variant->variant_product_id]->variant_links[]=$variant->variant_characteristic_id; } } $this->products =& $products; $this->all_products =& $all_products; $this->variants =& $variants; return true; } function toFloatArray(&$array, $default = null){ if (is_array($array)) { foreach ($array as $i => $v) { $array[$i] = hikashop_toFloat($v); } } else { if ($default === null) { $array = array(); } elseif (is_array($default)) { $this->toFloatArray($default, null); $array = $default; } else { $array = array( (float) $default ); } } } function addAlias(&$element){ if(empty($element->product_alias)){ $element->alias = strip_tags(preg_replace('#.*#isU','',$element->product_name)); }else{ $element->alias = $element->product_alias; } $config = JFactory::getConfig(); if(!$config->get('unicodeslugs')){ $lang = JFactory::getLanguage(); $element->alias = $lang->transliterate($element->alias); } $app = JFactory::getApplication(); if(method_exists($app,'stringURLSafe')){ $element->alias = $app->stringURLSafe($element->alias); }else{ $element->alias = JFilterOutput::stringURLSafe($element->alias); } } function save(&$element,$stats=false){ if(!$stats) $element->product_modified=time(); if(empty($element->product_id)){ if(strlen(@$element->product_quantity)==0){ $element->product_quantity=-1; } $element->product_created=@$element->product_modified; }else{ $element->old = $this->get($element->product_id); } if(empty($element->product_id)){ if(empty($element->product_type)){ if(!isset($element->product_parent_id) || empty($element->product_parent_id)){ $element->product_type='main'; }else{ $element->product_type='variant'; } } } if(isset($element->product_quantity) && !is_numeric($element->product_quantity)){ $element->product_quantity=-1; } $new = false; if(empty($element->product_id)){ if(empty($element->product_code) && !empty($element->product_name)){ $search = explode(",","ç,æ,œ,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u"); $replace = explode(",","c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u"); $test = str_replace($search, $replace, $element->product_name); $test=preg_replace('#[^a-z0-9_-]#i','',$test); if(empty($test)){ $query = 'SELECT MAX(`product_id`) FROM '.hikashop_table('product'); $this->database->setQuery($query); $last_pid = $this->database->loadResult(); $last_pid++; $element->product_code = 'product_'.$last_pid; }else{ $test = str_replace($search, $replace, $element->product_name); $element->product_code = preg_replace('#[^a-z0-9_-]#i','_',$test); } }elseif(empty($element->product_code)){ return false; } $new=true; } JPluginHelper::importPlugin( 'hikashop' ); $dispatcher = JDispatcher::getInstance(); $do = true; if($new){ $dispatcher->trigger( 'onBeforeProductCreate', array( & $element, & $do) ); }else{ $dispatcher->trigger( 'onBeforeProductUpdate', array( & $element, & $do) ); } if(!$do){ return false; } $tags = null; if(isset($element->tags)) { $tags = $element->tags; unset($element->tags); } $status = parent::save($element); if($status){ $element->product_id = $status; if($new){ $dispatcher->trigger( 'onAfterProductCreate', array( & $element ) ); }else{ $dispatcher->trigger( 'onAfterProductUpdate', array( & $element ) ); } if($tags !== null && @$element->product_type!='variant') { $tagsHelper = hikashop_get('helper.tags'); $fullElement = $element; if(!empty($element->old)) { foreach($element->old as $k => $v) { if(!isset($fullElement->$k)) $fullElement->$k = $v; } } $tagsHelper->saveUCM('product', $fullElement, $tags); } } return $status; } function updatePrices($element,$status){ $filters=array('price_product_id='.$status); if(count($element->prices)){ $ids = array(); foreach($element->prices as $price){ if(!empty($price->price_id) && !empty($price->price_value)) $ids[] = $price->price_id; } if(!empty($ids)){ $filters[]= 'price_id NOT IN ('.implode(',',$ids).')'; } } $query = 'DELETE FROM '.hikashop_table('price').' WHERE '.implode(' AND ',$filters); $this->database->setQuery($query); $this->database->query(); if(count($element->prices)){ $insert = array(); foreach($element->prices as $price){ if(empty($price->price_value)) continue; if(empty($price->price_id)) $price->price_id = 'NULL'; $line = '('.(int)$price->price_currency_id.','.$status.','.(int)$price->price_min_quantity.','.(float)$price->price_value.','.$price->price_id; if(hikashop_level(2)){ if(empty($price->price_access)){ $price->price_access = 'all'; } $line.=','.$this->database->Quote($price->price_access); } $insert[]=$line.')'; } if(!empty($insert)){ $select = 'price_currency_id,price_product_id,price_min_quantity,price_value,price_id'; if(hikashop_level(2)){ $select.=',price_access'; } $query = 'REPLACE '.hikashop_table('price').' ('.$select.') VALUES '.implode(',',$insert).';'; $this->database->setQuery($query); $this->database->query(); } } } function updateCharacteristics($element,$status){ if($element->product_type=='main'){ if(!empty($element->product_code) && !empty($element->old->product_code) && $element->product_code!=$element->old->product_code){ $query = 'UPDATE '.hikashop_table('product').' SET `product_code` = REPLACE(`product_code`,'.$this->database->Quote($element->old->product_code).','.$this->database->Quote($element->product_code).') WHERE `product_code` LIKE \''.$element->old->product_code.'%\' AND product_parent_id='.(int)$element->product_id.' AND product_type=\'variant\''; $this->database->setQuery($query); $this->database->query(); } $config =& hikashop_config(); $auto_variants = $config->get('auto_variants',1); $ids= array(); $main_ids= array(); $filter=''; if(@count($element->characteristics)){ foreach($element->characteristics as $c){ $ids[]=(int)$c->characteristic_id; $main_ids[]=(int)$c->characteristic_id; $ids[]=(int)$c->default_id; } $filter = ' AND variant_characteristic_id NOT IN ('.implode(',',$ids).')'; } $query = 'DELETE FROM '.hikashop_table('variant').' WHERE variant_product_id='.$status.$filter; $this->database->setQuery($query); $this->database->query(); if(!empty($ids)){ $insert = array(); foreach($element->characteristics as $c){ $insert[]='('.(int)$c->characteristic_id.','.$status.','.(int)$c->ordering.')'; $insert[]='('.(int)$c->default_id.','.$status.',0)'; } $query = 'REPLACE INTO '.hikashop_table('variant').' (variant_characteristic_id,variant_product_id,ordering) VALUES '.implode(',',$insert).';'; $this->database->setQuery($query); $this->database->query(); } if($auto_variants==0){ $query = 'SELECT * FROM '.hikashop_table('product').' WHERE product_parent_id = '.$status.' AND product_type=\'variant\''; $this->database->setQuery($query); if(!HIKASHOP_J25){ $results = $this->database->loadResultArray(); } else { $results = $this->database->loadColumn(); } if(count($results)){ $query = 'SELECT `ordering`,`variant_characteristic_id`,`variant_product_id` FROM '.hikashop_table('variant'); $query .= ' WHERE variant_product_id IN('.implode(',',$results).')'; $query .= ' ORDER BY `ordering` ASC'; $this->database->setQuery($query); $results = $this->database->loadObjectList(); if(!empty($results)){ foreach($results as $variant){ foreach($element->characteristics as $char){ $char_ids = array(); foreach($char->values as $k => $val){ $char_ids[]=$k; } if(!in_array($variant->variant_characteristic_id,$char_ids)){ $this->database->setQuery('INSERT IGNORE INTO '.hikashop_table('variant').' (variant_characteristic_id,variant_product_id,ordering) VALUES ('.$char->default_id.','.$variant->variant_product_id.',0);'); $this->database->query(); } } } } } return false; } if(!empty($main_ids)){ $query = 'SELECT MAX(`ordering`) FROM '.hikashop_table('variant'); $query .= ' WHERE variant_characteristic_id IN ('.implode(',',$main_ids).') AND variant_product_id='.$status; $this->database->setQuery($query); $max = $this->database->loadResult(); $max++; $query = 'UPDATE '.hikashop_table('variant').' SET `ordering` ='.$max.' WHERE `ordering`=0'; $query .= ' AND variant_characteristic_id IN ('.implode(',',$main_ids).') AND variant_product_id='.$status; $this->database->setQuery($query); $this->database->query(); $query = 'SELECT `ordering`,`variant_characteristic_id`,`variant_product_id` FROM '.hikashop_table('variant'); $query .= ' WHERE variant_characteristic_id IN ('.implode(',',$main_ids).') AND variant_product_id='.$status; $query .= ' ORDER BY `ordering` ASC'; $this->database->setQuery($query); $results = $this->database->loadObjectList(); $i = 1; if(!empty($results)){ foreach($results as $oneResult){ if($oneResult->ordering != $i){ $query = 'UPDATE '.hikashop_table('variant').' SET `ordering` ='.$i.' WHERE `variant_characteristic_id`='.$oneResult->variant_characteristic_id.' AND `variant_product_id`='.$oneResult->variant_product_id; $this->database->setQuery($query); $this->database->query(); } $i++; } } } $query = 'SELECT product_id FROM '.hikashop_table('product').' WHERE product_parent_id = '.$status.' AND product_type=\'variant\''; $this->database->setQuery($query); if(!HIKASHOP_J25){ $results = $this->database->loadResultArray(); } else { $results = $this->database->loadColumn(); } if(!empty($results)){ if(!@count($element->characteristics)){ $this->delete($results); }else{ JArrayHelper::toInteger($results); $query = 'SELECT * FROM '.hikashop_table('variant').' WHERE variant_product_id IN ('.implode(',',$results).')'; $this->database->setQuery($query); $variants = $this->database->loadobjectList(); $keep = array(); foreach($results as $result){ $key = ''; foreach($element->characteristics as $characteristic){ $id = false; foreach($variants as $variant){ if($variant->variant_product_id==$result && in_array($variant->variant_characteristic_id,array_keys($characteristic->values))){ $id=$variant->variant_characteristic_id; break; } } if($id) $key.='_'.$characteristic->characteristic_id.'_'.$id; } if($key) $keep[$key]=$result; } $productDelete = array_diff($results,$keep); $this->delete($productDelete); $char_ids=array(); foreach($element->characteristics as $characteristic){ $char_ids=array_merge(array_keys($characteristic->values),$char_ids); } $query = 'DELETE FROM '.hikashop_table('variant').' WHERE variant_characteristic_id NOT IN ('.implode(',',$char_ids).')'; if(count($keep)){ $query.= ' AND variant_product_id IN ('.implode(',',$keep).')'; }else{ $query.= ' AND variant_product_id IN ('.implode(',',$results).')'; } $this->database->setQuery($query); $this->database->query(); } } $new = array_diff($main_ids,$element->oldCharacteristics); if(!empty($new) || (empty($results)&&!empty($main_ids))){ if(empty($keep)){ $table=array(); $first=true; foreach($element->characteristics as $characteristic){ $temp=array(); foreach($characteristic->values as $k => $val){ if($first) $temp[]=array($k); else $temp[]=$k; } $table[]=$temp; $first = false; } while(count($table)>1){ $t1 = array_shift($table); $t2 = array_shift($table); $newt=array(); foreach($t1 as $v1){ foreach($t2 as $v2){ $e = $v1; $e[]=$v2; $newt[] = $e; } } array_unshift($table,$newt); } $keys = reset($table); $config =& hikashop_config(); $publish_state = (int)$config->get('variant_default_publish',0); $insert=array(); $query = 'INSERT IGNORE INTO '.hikashop_table('product').' (product_code,product_type,product_parent_id,product_published,product_modified,product_created,product_group_after_purchase) VALUES '; $variants = 0; $codes=array(); $db_codes=array(); $newVariants =array(); if(!empty($keys)) { foreach($keys as $key){ $product_code = $element->product_code.'_'.implode('_',$key); $insert[]='('.$this->database->Quote($product_code).',\'variant\','.$status.','.$publish_state.','.time().','.time().','.$this->database->Quote(@$element->product_group_after_purchase).')'; $variants++; $codes[$product_code]=$key; $db_codes[]=$this->database->Quote($product_code); if($variants>500){ $this->database->setQuery($query.implode(',',$insert).';'); $this->database->query(); $this->database->setQuery('SELECT product_id,product_code FROM '.hikashop_table('product').' WHERE product_code IN ('.implode(',',$db_codes).')'); $objs = $this->database->loadObjectList(); foreach($objs as $obj){ foreach($codes[$obj->product_code] as $k){ $newVariants[]= '('.(int)$k.','.$obj->product_id.',0)'; } } if(!empty($newVariants)){ $this->database->setQuery('INSERT IGNORE INTO '.hikashop_table('variant').' (variant_characteristic_id,variant_product_id,ordering) VALUES '.implode(',',$newVariants)); $this->database->query(); } $codes=array(); $variants=0; $insert=array(); $db_codes=array(); $newVariants =array(); } } } if(!empty($insert)){ $this->database->setQuery($query.implode(',',$insert).';'); $this->database->query(); $this->database->setQuery('SELECT product_id,product_code FROM '.hikashop_table('product').' WHERE product_code IN ('.implode(',',$db_codes).')'); $objs = $this->database->loadObjectList(); foreach($objs as $obj){ foreach($codes[$obj->product_code] as $k){ $newVariants[]= '('.(int)$k.','.$obj->product_id.',0)'; } } if(!empty($newVariants)){ $this->database->setQuery('INSERT IGNORE INTO '.hikashop_table('variant').' (variant_characteristic_id,variant_product_id,ordering) VALUES '.implode(',',$newVariants)); $this->database->query(); } } }else{ foreach($variants as $variant){ $varIds[]=$variant->variant_product_id; } $varIdsString=implode(',', $varIds); $this->database->setQuery('SELECT * FROM '.hikashop_table('product').' WHERE product_id IN ('.$varIdsString.')'); $completeVariants = $this->database->loadObjectList(); $this->database->setQuery('SELECT * FROM '.hikashop_table('price').' WHERE price_product_id IN ('.$varIdsString.') OR price_product_id='.$element->product_id); $prices = $this->database->loadObjectList(); $this->database->setQuery('SELECT * FROM '.hikashop_table('file').' WHERE (file_ref_id IN ('.$varIdsString.') OR file_ref_id='.$element->product_id.') AND file_type="product"'); $images = $this->database->loadObjectList(); $this->database->setQuery('SELECT * FROM '.hikashop_table('file').' WHERE (file_ref_id IN ('.$varIdsString.') OR file_ref_id='.$element->product_id.') AND file_type="file"'); $files = $this->database->loadObjectList(); foreach($completeVariants as $key => $variant){ foreach($prices as $price){ if($variant->product_id==$price->price_product_id){ $completeVariants[$key]->prices[]=$price; } } foreach($files as $file){ if($variant->product_id==$file->file_ref_id){ $completeVariants[$key]->files[]=$file; } } foreach($images as $image){ if($variant->product_id==$image->file_ref_id){ $completeVariants[$key]->images[]=$image; } } } $i=0; $keys[] =array(); foreach($element->characteristics as $characteristic){ if(!in_array($characteristic->characteristic_id,$element->oldCharacteristics)){ if(empty($keys)){ $keys = array_keys($characteristic->values); continue; } $temp = array(); foreach($characteristic->values as $k => $val){ foreach($keys as $key){ if(!is_array($key)) $key = array($key); array_push($key,$k); $temp[]=$key; } } $keys = $temp; } } $variantCodes = array(); foreach($completeVariants as $variant){ $variant_code=$variant->product_code; foreach($keys as $key){ $code=array(); foreach($key as $k){ $code[]=$k; } $code=implode('_',$code); $newVariants[$i]=$this->_copy($variant); $newVariants[$i]->product_code=$variant_code.'_'.$code; $variantCodes[]=$this->database->Quote($newVariants[$i]->product_code); unset($newVariants[$i]->product_id); $newVariants[$i]->product_created=time(); $i++; } } $inserts=array(); $this->delete($varIds, true); foreach($newVariants[0] as $key => $value){ if($key!='prices' && $key!='files' && $key!='images'){ $rows[]=$key; } } foreach($newVariants as $variant){ $values=array(); $variant=get_object_vars($variant); foreach($variant as $key => $value){ if(!is_array($value) && !is_object($value)){ if(empty($value)){ $values[]='\'\''; }else{ $values[]=$this->database->quote($value); } } } $inserts[]='('.implode(',',$values).')'; } if(count($inserts)){ $inserts=implode(',',$inserts); $this->database->setQuery('INSERT IGNORE INTO '.hikashop_table('product').' ('.implode(',',$rows).') VALUES '.$inserts.';'); $this->database->query(); } $this->database->setQuery('SELECT product_code, product_id FROM '.hikashop_table('product').' WHERE product_code IN ('.implode(',',$variantCodes).')'); $loadedNewVariants = $this->database->loadObjectList(); $inserts=array(); foreach($loadedNewVariants as $inBaseVariant){ $product_code=str_replace($element->product_code,'',$inBaseVariant->product_code); $characteritic_ids=explode('_',$product_code); foreach($characteritic_ids as $id){ if(!empty($id) && is_numeric($id)){ $inBaseVariant->caracteristic_ids[]=$id; $inserts[]='('.$id.','.$inBaseVariant->product_id.',0)'; } } } if(count($inserts)){ $this->database->setQuery('INSERT IGNORE INTO '.hikashop_table('variant').' (variant_characteristic_id,variant_product_id,ordering) VALUES '.implode(',',$inserts).';'); $this->database->query(); } $inserts=array(); foreach($loadedNewVariants as $inBaseVariant){ foreach($newVariants as $variant){ if($inBaseVariant->product_code==$variant->product_code){ $variant->product_id=$inBaseVariant->product_id; break; } } } foreach($newVariants as $variant){ if(isset($variant->prices)){ foreach($variant->prices as $price){ $inserts[]='('.$price->price_currency_id.','.$variant->product_id.','.$price->price_value.','.$price->price_min_quantity.','.$this->database->quote($price->price_access).')'; } } } if(count($inserts)){ $this->database->setQuery('INSERT IGNORE INTO '.hikashop_table('price').' (price_currency_id,price_product_id,price_value ,price_min_quantity ,price_access) VALUES '.implode(',',$inserts).';'); $this->database->query(); } $inserts=array(); foreach($newVariants as $variant){ if(isset($variant->files)){ foreach($variant->files as $file){ $inserts[]='('.$this->database->quote($file->file_name).','.$this->database->quote($file->file_description).','.$this->database->quote($file->file_path).','.$this->database->quote($file->file_type).','.$variant->product_id.','.$file->file_free_download.',0,'.$file->file_limit.')'; } } if(isset($variant->images)){ foreach($variant->images as $image){ $inserts[]='('.$this->database->quote($image->file_name).','.$this->database->quote($image->file_description).','.$this->database->quote($image->file_path).','.$this->database->quote($image->file_type).','.$variant->product_id.','.$image->file_free_download.',0,'.$image->file_limit.')'; } } } if(count($inserts)){ $this->database->setQuery('INSERT IGNORE INTO '.hikashop_table('file').' (file_name,file_description,file_path ,file_type ,file_ref_id, file_free_download,file_ordering,file_limit) VALUES '.implode(',',$inserts).';'); $this->database->query(); } } } }else{ $filter=''; if(!empty($element->characteristics)){ $filter = ' AND variant_characteristic_id NOT IN ('.implode(',',array_keys($element->characteristics)).')'; } $query = 'DELETE FROM '.hikashop_table('variant').' WHERE variant_product_id='.$status.$filter; $this->database->setQuery($query); $this->database->query(); if(!empty($element->characteristics)){ $insert = array(); foreach(array_keys($element->characteristics) as $c){ if(is_numeric($c)) $insert[]='('.$c.','.$status.',0)'; } $query = 'INSERT IGNORE INTO '.hikashop_table('variant').' (variant_characteristic_id,variant_product_id,ordering) VALUES '.implode(',',$insert).';'; $this->database->setQuery($query); $this->database->query(); } } } function updateRelated($element,$status,$type='related'){ if($element->product_type=='variant') return true; $filter=''; $config = hikashop_config(); $both_ways = $config->get('product_association_in_both_ways',0); if($both_ways){ $query = 'SELECT product_related_id FROM '.hikashop_table('product_related').' WHERE product_related_type=\''.$type.'\' AND product_id = '.$status.$filter; $this->database->setQuery($query); $this->database->query(); $products = $products = $this->database->loadObjectList(); } $query = 'DELETE FROM '.hikashop_table('product_related').' WHERE product_related_type=\''.$type.'\' AND product_id = '.$status.$filter; $this->database->setQuery($query); $this->database->query(); if(count($element->$type)){ $insert = array(); foreach($element->$type as $new){ $insert[]='('.$new->product_related_id.','.$status.',\''.$type.'\',\''.(int)$new->product_related_ordering.'\')'; } if($both_ways && $type=='related'){ foreach($element->$type as $new){ $insert[]='('.$status.','.$new->product_related_id.',\''.$type.'\',\''.(int)$new->product_related_ordering.'\')'; foreach($products as $product){ if($product->product_related_id == $new->product_related_id){ $product->still_related = true; } } } } $query = 'INSERT IGNORE INTO '.hikashop_table('product_related').' (product_related_id,product_id,product_related_type,product_related_ordering) VALUES '.implode(',',$insert).';'; $this->database->setQuery($query); $this->database->query(); } if($both_ways && $type=='related'){ $ids=array(); foreach($products as $product){ if(!isset($product->still_related) || $product->still_related != true){ $ids[]=$product->product_related_id; } } if(count($ids)){ $query = 'DELETE FROM '.hikashop_table('product_related').' WHERE product_related_type=\''.$type.'\' AND product_id IN ('.implode(',',$ids).') AND product_related_id = '.$status; new dbug(implode(',',$ids)); $this->database->setQuery($query); $this->database->query(); } } } function updateCategories(&$element, $status) { if($element->product_type=='variant') return false; if(empty($element->categories) && $element->product_type == 'main') { $query = 'SELECT category_id FROM '.hikashop_table('category').' WHERE category_type=\'root\' AND category_parent_id=0 LIMIT 1'; $this->database->setQuery($query); $root = $this->database->loadResult(); $query = 'SELECT category_id FROM '.hikashop_table('category').' WHERE category_parent_id='.$root.' AND category_type=\'product\' LIMIT 1'; $this->database->setQuery($query); $root = $this->database->loadResult(); $element->categories = array($root); } $this->database->setQuery('SELECT category_id FROM '.hikashop_table('product_category').' WHERE product_id='.$status); if(!HIKASHOP_J25) { $olds = $this->database->loadResultArray(); } else { $olds = $this->database->loadColumn(); } $do_nothing = array_intersect($element->categories, $olds); $delete = array_diff($olds, $do_nothing); $news = array_diff($element->categories, $do_nothing); if(!empty($delete)){ $this->database->setQuery('DELETE FROM '.hikashop_table('product_category').' WHERE product_id='.$status.' AND category_id IN ('.implode(',',$delete).')'); $this->database->query(); } if(!empty($news)){ $insert = array(); foreach($news as $new){ $insert[]='('.$new.','.$status.')'; } $query = 'INSERT IGNORE INTO '.hikashop_table('product_category').' (category_id,product_id) VALUES '.implode(',',$insert).';'; $this->database->setQuery($query); $this->database->query(); } $reorders = array_merge($news, $delete); if(!empty($reorders)){ $orderClass = hikashop_get('helper.order'); $orderClass->pkey = 'product_category_id'; $orderClass->table = 'product_category'; $orderClass->groupMap = 'category_id'; $orderClass->orderingMap = 'ordering'; foreach($reorders as $reorder){ $orderClass->groupVal = $reorder; $orderClass->reOrder(); } } return (!empty($news) || !empty($delete)); } function updateFiles(&$element,$status,$type='images',$orders=null){ $filter=''; if(count($element->$type)){ $filter = 'AND file_id NOT IN ('.implode(',',$element->$type).')'; } $file_type = 'product'; if($type == 'files'){ $file_type = 'file'; } $main = ' FROM '.hikashop_table('file').' WHERE file_ref_id = '.$status.' AND file_type=\''.$file_type.'\' AND SUBSTRING(file_path,1,1) != \'@\' '.$filter; $this->database->setQuery('SELECT file_path '.$main); if(!HIKASHOP_J25){ $toBeRemovedFiles = $this->database->loadResultArray(); } else { $toBeRemovedFiles = $this->database->loadColumn(); } if(!empty($toBeRemovedFiles)){ $file = hikashop_get('class.file'); $uploadPath = $file->getPath($file_type); $oldFiles = array(); foreach($toBeRemovedFiles as $old){ $oldFiles[] = $this->database->Quote($old); } $this->database->setQuery('SELECT file_path FROM '.hikashop_table('file').' WHERE file_path IN ('.implode(',',$oldFiles).') AND file_ref_id != '.$status); if(!HIKASHOP_J25){ $keepFiles = $this->database->loadResultArray(); } else { $keepFiles = $this->database->loadColumn(); } foreach($toBeRemovedFiles as $old){ if((empty($keepFiles) || !in_array($old,$keepFiles)) && JFile::exists( $uploadPath . $old)){ JFile::delete( $uploadPath . $old ); jimport('joomla.filesystem.folder'); $thumbnail_folders = JFolder::folders($uploadPath); if(JFolder::exists($uploadPath.'thumbnails'.DS)) { $other_thumbnail_folders = JFolder::folders($uploadPath.'thumbnails'); foreach($other_thumbnail_folders as $other_thumbnail_folder) { $thumbnail_folders[] = 'thumbnails'.DS.$other_thumbnail_folder; } } foreach($thumbnail_folders as $thumbnail_folder){ if($thumbnail_folder != 'thumbnail' && substr($thumbnail_folder, 0, 9) != 'thumbnail' && substr($thumbnail_folder, 0, 11) != ('thumbnails'.DS)) continue; if(!in_array($file_type,array('file','watermark')) && JFile::exists( $uploadPath .$thumbnail_folder.DS. $old)){ JFile::delete( $uploadPath .$thumbnail_folder.DS. $old ); } } } } $this->database->setQuery('DELETE'.$main); $this->database->query(); } if(!empty($orders) && is_array($element->$type) && count($element->$type)) { $this->database->setQuery('SELECT file_id, file_ordering FROM '.hikashop_table('file').' WHERE file_id IN ('.implode(',',$element->$type).')'); $oldOrders = $this->database->loadObjectList(); if(!empty($oldOrders)) { foreach($oldOrders as $oldOrder) { if(isset($orders[$oldOrder->file_id]) && $orders[$oldOrder->file_id] != $oldOrder->file_ordering) { $this->database->setQuery('UPDATE '.hikashop_table('file').' SET file_ordering = '.(int)$orders[$oldOrder->file_id].' WHERE file_id = '.$oldOrder->file_id); $this->database->query(); } } } } if(count($element->$type)){ $query = 'UPDATE '.hikashop_table('file').' SET file_ref_id='.$status.' WHERE file_id IN ('.implode(',',$element->$type).') AND file_ref_id=0'; $this->database->setQuery($query); $this->database->query(); } } function delete(&$elements, $ignoreFile=false){ if(!is_array($elements)){ $elements = array($elements); } if(!empty($elements)){ $query ='SELECT product_id FROM '.hikashop_table('product').' WHERE product_type=\'variant\' AND product_parent_id IN ('.implode(',',$elements).')'; $this->database->setQuery($query); if(!HIKASHOP_J25){ $elements=array_merge($elements,$this->database->loadResultArray()); } else { $elements=array_merge($elements,$this->database->loadColumn()); } } JArrayHelper::toInteger($elements); JPluginHelper::importPlugin( 'hikashop' ); $dispatcher = JDispatcher::getInstance(); $do=true; $dispatcher->trigger( 'onBeforeProductDelete', array( & $elements, & $do) ); if(!$do){ return false; } $status = parent::delete($elements); if($status){ $dispatcher->trigger( 'onAfterProductDelete', array( & $elements ) ); $tagsHelper = hikashop_get('helper.tags'); $tagsHelper->deleteUCM('product', $elements); $class = hikashop_get('class.file'); $class->deleteFiles('product',$elements,$ignoreFile); $class->deleteFiles('file',$elements,$ignoreFile); $class = hikashop_get('helper.translation'); $class->deleteTranslations('product',$elements); return count($elements); } return $status; } function addFiles(&$element,&$files){ if(!empty($element->variants)){ foreach($element->variants as $k => $variant){ $this->addFiles($element->variants[$k],$files); } } if(!empty($element->options)){ foreach($element->options as $k => $optionElement){ $this->addFiles($element->options[$k],$files); } } foreach($files as $file){ if($file->file_ref_id==$element->product_id){ if($file->file_type=='file'){ $element->files[]=$file; }else{ $element->images[]=$file; } } } } function checkVariant(&$variant,&$element,$map=array(),$force=false){ if(!empty($variant->variant_checked)) return true; $checkfields = array('product_name','product_description','prices','images','discount','product_url','product_weight','product_weight_unit','product_keywords','product_meta_description','product_dimension_unit','product_width','product_length','product_height','files','product_contact','product_max_per_order','product_min_per_order','product_sale_start','product_sale_end','product_manufacturer_id','file_path','file_name','file_description'); $fieldsClass = hikashop_get('class.field'); $fields = $fieldsClass->getFields('frontcomp',$element,'product','checkout&task=state'); foreach($fields as $field){ $checkfields[]=$field->field_namekey; } if(empty($variant->product_id)){ $variant->product_id=$element->product_id; $variant->map=implode('_',$map); $variant->product_parent_id=$element->product_id; $variant->product_quantity = 0; $variant->product_code = ''; $variant->product_published = -1; $variant->product_type = 'variant'; $variant->product_sale_start = 0; $variant->product_sale_end = 0; $variant->characteristics=array(); foreach($map as $k => $id){ $variant->characteristics[$id]=$element->characteristics[$k]->values[$id]; } }elseif(empty($variant->characteristics)){ $variant->characteristics=array(); } if(isset($variant->product_weight) && $variant->product_weight==0){ $variant->product_weight_unit=$element->product_weight_unit; } if(isset($variant->product_length) && isset($variant->product_height) && isset($variant->product_width) && $variant->product_length==0 && $variant->product_height==0 && $variant->product_width==0){ $variant->product_dimension_unit=$element->product_dimension_unit; } $variant->main_product_name = @$element->product_name; $variant->characteristics_text = ''; $variant->variant_name = @$variant->product_name; $config =& hikashop_config(); $perfs = $config->get('variant_increase_perf','1'); $separator = JText::_('HIKA_VARIANTS_MIDDLE_SEPARATOR'); if($separator == 'HIKA_VARIANTS_MIDDLE_SEPARATOR') $separator = ' '; $product_price_percentage = @$variant->product_price_percentage; foreach($checkfields as $field){ if(!empty($variant->$field)){ if($field != 'product_name' && (!is_numeric($variant->$field) || bccomp($variant->$field,0,5))){ continue; } } if(isset($element->$field) && (is_array($element->$field) && count($element->$field) || is_object($element->$field))){ $variant->$field=$this->_copy($element->$field); if($field=='prices'){ if(!empty($variant->cart_product_total_variants_quantity)){ $variant->cart_product_total_quantity = $variant->cart_product_total_variants_quantity; } if($product_price_percentage>0){ foreach($variant->$field as $k => $v){ foreach(get_object_vars($v) as $key => $value){ if(in_array($key, array('taxes_without_discount','taxes','taxes_orig'))){ foreach($value as $taxKey => $tax){ $variant->prices[$k]->taxes[$taxKey]->tax_amount = $tax->tax_amount*$product_price_percentage/100; } }elseif(!in_array($key,array('price_currency_id','price_orig_currency_id','price_min_quantity','price_access'))){ $variant->prices[$k]->$key = $value*$product_price_percentage/100; } } } } } }else{ if($field=='product_name'){ if(!empty($variant->characteristics)){ foreach($variant->characteristics as $val){ $variant->characteristics_text.=$separator.$val->characteristic_value; } } }elseif(!$perfs || $force){ $variant->$field = @$element->$field; } } } if(empty($variant->product_name)){ $variant->product_name=$variant->main_product_name; } $config =& hikashop_config(); if(!empty($variant->main_product_name) && $config->get('append_characteristic_values_to_product_name',1)){ $separator = JText::_('HIKA_VARIANT_SEPARATOR'); if($separator == 'HIKA_VARIANT_SEPARATOR') $separator = ': '; $variant->product_name = $variant->main_product_name.''.$separator.$variant->characteristics_text.''; } if(!$variant->product_published){ $variant->product_quantity=0; } $variant->variant_checked = true; } function _copy(&$src){ if(is_array($src)){ $array = array(); foreach($src as $k => $v){ $array[$k]=$this->_copy($v); } return $array; }elseif(is_object($src)){ $obj = new stdClass(); foreach(get_object_vars($src) as $k => $v){ $obj->$k=$this->_copy($v); } return $obj; }else{ return $src; } } function generateVariantData(&$element){ $config =& hikashop_config(); $perfs = $config->get('variant_increase_perf',1); if($perfs && !empty($element->main)){ $required_fields = array(); foreach (get_object_vars($element->main) as $name=>$value) { if(!is_array($name)&&!is_object($name)){ $required = false; foreach ($element->variants as $variant) { if(!empty($variant->$name) && (!is_numeric($variant->$name) || $variant->$name>0)){ $required = true; break; } } if($required){ foreach ($element->variants as $k=>$variant) { if(empty($variant->$name) || (is_numeric($variant->$name) && $variant->$name==0.0)){ if($name=='product_quantity' && $variant->$name==0){ continue; } $element->variants[$k]->$name=$element->main->$name; } } } } } } if(!isset($element->main->images))$element->main->images=null; } public function getTreeList($start = 0, $depth = 1, $serialized = false, $display = '', $limit = 200) { $app = JFactory::getApplication(); $db = JFactory::getDBO(); if(empty($display) || strpos($display, '%name%') === false) $display = '%name%'; if($depth <= 0) $depth = 1; if($start > 0) { $query = 'SELECT a.*, b.category_depth as `base_depth`' . ' FROM ' . hikashop_table('category') . ' AS a' . ' INNER JOIN ' . hikashop_table('category') . ' AS b ON a.category_left >= b.category_left AND a.category_right <= b.category_right'. ' WHERE b.category_id = ' . $start . ' AND a.category_type IN (\'product\',\'manufacturer\',\'vendor\',\'root\') AND a.category_depth >= b.category_depth AND a.category_depth <= (b.category_depth + ' . $depth . ')'. ' ORDER BY a.category_left ASC, a.category_name ASC'; } else { $query = 'SELECT a.*, 0 as `base_depth`' . ' FROM ' . hikashop_table('category') . ' AS a' . ' WHERE a.category_type IN (\'product\',\'manufacturer\',\'vendor\',\'root\') AND a.category_depth >= 0 AND a.category_depth <= ' . $depth . ' ORDER BY a.category_left ASC, a.category_name ASC'; } $db->setQuery($query); $category_elements = $db->loadObjectList(); $categories = array(); foreach($category_elements as &$element) { if(empty($element->value)){ $val = str_replace(' ', '_', strtoupper($element->category_name)); $element->value = JText::_($val); if($val == $element->value) { $element->value = $element->category_name; } } $element->category_name = $element->value; if($element->category_namekey == 'root') { $element->category_parent_id = -1; } if($element->category_depth < $element->base_depth + $depth) { $categories[] = $element->category_id; } unset($element); } $product_elements = array(); if(!empty($categories)) { $query = 'SELECT a.*, c.category_id FROM ' . hikashop_table('product') . ' AS a'. ' INNER JOIN ' . hikashop_table('product_category') . ' AS b ON a.product_id = b.product_id'. ' INNER JOIN ' . hikashop_table('category') . ' AS c ON c.category_id = b.category_id'. ' WHERE b.category_id IN (' . implode(',', $categories) . ')'. ' ORDER BY c.category_left ASC, c.category_name ASC, a.product_name ASC'; $db->setQuery($query, 0, $limit); $product_elements = $db->loadObjectList(); } if(!$serialized) { return array($category_elements, $product_elements); } $tree = array(); $nodes = array(); foreach($category_elements as $element) { $obj = new stdClass(); $obj->status = 2; $obj->name = $element->category_name; $obj->value = $element->category_id; if($element->category_type == 'root') { $obj->status = 5; $obj->icon = 'world'; $obj->noselection = 1; } if($element->category_depth == $element->base_depth + $depth) { $obj->status = 3; } $obj->data = array(); if(!empty($element->category_parent_id) && $element->category_id != $element->category_parent_id && isset($nodes[$element->category_parent_id])) { $nodes[$element->category_parent_id]->data[] =& $obj; } else { $tree[] =& $obj; } if($element->category_type != 'root') { $nodes[$element->category_id] =& $obj; } unset($obj); } unset($category_elements); foreach($product_elements as $element) { $obj = new stdClass(); $obj->status = 0; if(empty($display) || $display == '%name%') { $obj->name = $element->product_name; } else { if($element->product_quantity == -1) $element->product_quantity = JText::_('UNLIMITED'); $obj->name = str_replace( array('%name%', '%code%', '%qty%'), array($element->product_name, $element->product_code, $element->product_quantity), $display ); } $obj->value = $element->product_id; if(!empty($element->category_id) && isset($nodes[$element->category_id])) { $nodes[$element->category_id]->data[] =& $obj; } else { $tree[] =& $obj; } unset($obj); } unset($product_elements); foreach($nodes as &$node) { if(empty($node->data)) { unset($node->data); if($node->status == 2) $node->status = 4; } unset($node); } return $tree; } public function findTreeList($search = '', $start = 0, $serialized = false, $display = '', $limit = 200) { $app = JFactory::getApplication(); $db = JFactory::getDBO(); if(empty($display) || strpos($display, '%name%') === false) $display = '%name%'; if($start > 0) { $query = 'SELECT a.*' . ' FROM ' . hikashop_table('category') . ' AS a' . ' INNER JOIN ' . hikashop_table('category') . ' AS b ON a.category_left >= b.category_left AND a.category_right <= b.category_right'. ' WHERE b.category_id = ' . $start . ' AND a.category_type IN (\'product\',\'root\')'. ' ORDER BY a.category_left ASC, a.category_name ASC'; } else { $query = 'SELECT a.*' . ' FROM ' . hikashop_table('category') . ' AS a' . ' WHERE a.category_type IN (\'product\',\'root\')' . ' ORDER BY a.category_left ASC, a.category_name ASC'; } $db->setQuery($query); $category_elements = $db->loadObjectList(); $categories = array(); foreach($category_elements as &$element) { if(empty($element->value)){ $val = str_replace(' ', '_', strtoupper($element->category_name)); $element->value = JText::_($val); if($val == $element->value) { $element->value = $element->category_name; } } $element->category_name = $element->value; if($element->category_namekey == 'root') { $element->category_parent_id = -1; } $categories[] = $element->category_id; unset($element); } $product_elements = array(); if(!empty($categories)) { if(HIKASHOP_J30) $searchStr = "'%" . $db->escape($search, true) . "%'"; else $searchStr = "'%" . $db->getEscaped($search, true) . "%'"; $query = 'SELECT a.*, c.category_id FROM ' . hikashop_table('product') . ' AS a'. ' INNER JOIN ' . hikashop_table('product_category') . ' AS b ON a.product_id = b.product_id'. ' INNER JOIN ' . hikashop_table('category') . ' AS c ON c.category_id = b.category_id'. ' WHERE (a.product_name LIKE '.$searchStr.' OR a.product_code LIKE '.$searchStr.') AND b.category_id IN (' . implode(',', $categories) . ')'. ' ORDER BY c.category_left ASC, c.category_name ASC, a.product_name ASC'; $db->setQuery($query, 0, $limit); $product_elements = $db->loadObjectList(); } if(!$serialized) { return array($category_elements, $product_elements); } $tree = array(); $nodes = array(); foreach($category_elements as $element) { $obj = new stdClass(); $obj->status = 2; $obj->name = $element->category_name; $obj->value = $element->category_id; if($element->category_type == 'root') { $obj->status = 5; $obj->icon = 'world'; $obj->noselection = 1; } $obj->data = array(); if(!empty($element->category_parent_id) && $element->category_id != $element->category_parent_id && isset($nodes[$element->category_parent_id])) { $nodes[$element->category_parent_id]->data[] =& $obj; } else { $tree[] =& $obj; } if($element->category_type != 'root') { $nodes[$element->category_id] =& $obj; } unset($obj); } foreach($product_elements as $element) { $obj = new stdClass(); $obj->status = 0; if(empty($display) || $display == '%name%') { $obj->name = $element->product_name; } else { if($element->product_quantity == -1) $element->product_quantity = JText::_('UNLIMITED'); $obj->name = str_replace( array('%name%', '%code%', '%qty%'), array($element->product_name, $element->product_code, $element->product_quantity), $display ); } $obj->value = $element->product_id; if(!empty($element->category_id) && isset($nodes[$element->category_id])) { $nodes[$element->category_id]->data[] =& $obj; } else { $tree[] =& $obj; } unset($obj); } unset($product_elements); $reverse_categories = array_reverse($category_elements); foreach($reverse_categories as $element) { $id = (int)$element->category_id; if(isset($nodes[$id]) && empty($nodes[$id]->data) && $nodes[$id]->status != 5) { if(isset($element->category_parent_id) && isset($nodes[$element->category_parent_id])) { foreach($nodes[$element->category_parent_id]->data as $k => $v) { if(isset($v->value) && $v->status != 0 && $v->value == $id) unset($nodes[$element->category_parent_id]->data[$k]); } } $nodes[$id] = null; unset($nodes[$id]); } } foreach($tree as $k => $t) { if($t === null) unset($tree[$k]); } foreach($nodes as &$node) { if(empty($node->data)) { unset($node->data); } else { $node->data = array_values($node->data); } unset($node); } return $tree; } }