Новосибирск +7(983)

По всем вопросам :

Телеграм : @radgura

Тонкая сортирова атрибутов JoomShopping

Стандартная сортировка атрибутов настраивается в самом атрибуте, но иногда возникает потребность в более тонкой сортировке, например у вас есть 2 цвета белый и хром, на белый цвет нужно добавить наценку +900р, и он должен стоять вторым в списке, стандартными средствами этого не сделать.

Для настройки нужно добаить колонку `orders` в таблицу #__jshopping_products_attr2

Далее открываем файл:

public_html/components/com_jshopping/tables/product.php

В файл добавляем функцию сортировки массива с объектами:

function sort_attr($array, $sortby, $direction='asc') 
{
$sortedArr = array();
$tmp_Array = array();
foreach($array as $k => $v) {$tmp_Array[] = strtolower($v->$sortby);}
if($direction=='asc')
{
asort($tmp_Array);
}
else
{
arsort($tmp_Array);
}
foreach($tmp_Array as $k=>$tmp)
{
$sortedArr[] = $array[$k];
}
return $sortedArr;
}

В функцию getAttribValue добавляем выборку поля:

function getAttribValue($attr_id, $other_attr = array(), $onlyExistProduct = 0){
$jshopConfig = JSFactory::getConfig();
$allattribs = JSFactory::getAllAttributes(1);
$lang = JSFactory::getLang();
if ($allattribs[$attr_id]->independent==0){
$where = "";
foreach($other_attr as $k=>$v){
$where.=" and PA.attr_".(int)$k."=".(int)$v;
}
if ($onlyExistProduct) $where.=" and PA.count>0 ";
$sorting = $jshopConfig->attribut_dep_sorting_in_product;
if ($sorting=="") $sorting = "V.value_ordering";
$field = "attr_".(int)$attr_id;
$query = "SELECT distinct PA.$field as val_id, V.`".$lang->get("name")."` as value_name, V.image
FROM `#__jshopping_products_attr` as PA
INNER JOIN #__jshopping_attr_values as V ON PA.$field=V.value_id
WHERE PA.product_id=".(int)$this->product_id." ".$where."
ORDER BY ".$sorting;
}else{
$sorting = $jshopConfig->attribut_nodep_sorting_in_product;
if ($sorting=="") $sorting = "V.value_ordering";
$query = "SELECT PA.attr_value_id as val_id, V.`".$lang->get("name")."` as value_name, V.image, price_mod, addprice,PA.`orders`
FROM `#__jshopping_products_attr2` as PA
INNER JOIN #__jshopping_attr_values as V ON PA.attr_value_id=V.value_id
WHERE PA.product_id=".(int)$this->product_id." and PA.attr_id=".(int)$attr_id."
ORDER BY ".$sorting.' asc ,PA.`orders` desc';
}
extract(js_add_trigger(get_defined_vars(), "after"));
$this->_db->setQuery($query);
return $this->_db->loadObjectList();
}

В функцию getBuildSelectAttributes добавляем проверку на необходимость сортировки и переопределение первого элемента в массиве атрибутов:

function getBuildSelectAttributes($attributeValues, $attributeActive, $displayonlyattrtype = null,$product_id=0){
$jshopConfig = JSFactory::getConfig();
if (!$jshopConfig->admin_show_attributes) return array();
$dispatcher = JDispatcher::getInstance();
$attrib = JSFactory::getAllAttributes();
$userShop = JSFactory::getUserShop();
$selects = array();$attrorder=array();
$db = JFactory::getDBO(); if (isset($this) and isset($this->product_id) and $this->product_id*1>0) { $db->setquery("select a.*,(select `name_ru-Ru` from #__jshopping_attr_values v where v.value_id=a.attr_value_id and a.attr_id=v.attr_id) as name from #__jshopping_products_attr2 a where product_id='".$this->product_id."' ");$attrsdb=$db->loadobjectlist(); foreach($attrsdb as $attr) $attrorder[$attr->attr_id][$attr->name]=$attr->orders; } foreach($attrib as $k=>$v)
{
$attr_id = $v->attr_id;
if ($displayonlyattrtype){$v->attr_type = $displayonlyattrtype;}
if (isset($attributeValues[$attr_id]) && $attributeValues[$attr_id])
{
if (isset($attributeActive[$attr_id]))
{
$_firstval = $attributeActive[$attr_id];
}
else
{
$_firstval = 0;
}
$selects[$attr_id] = new stdClass();
$selects[$attr_id]->attr_id = $attr_id;
$selects[$attr_id]->attr_name = $v->name;
$selects[$attr_id]->attr_description = $v->description;
$selects[$attr_id]->groupname = $v->groupname;
$selects[$attr_id]->firstval = $_firstval;
$selects[$attr_id]->attributeValues = $attributeValues[$attr_id][0]->orders;
$options = $attributeValues[$attr_id];
$attrimage = array();$need_reorder=0;
foreach($options as $k2=>$v2)
{
$attrimage[$v2->val_id] = $v2->image;
$addPrice = $v2->addprice;
$addPrice = getPriceFromCurrency($addPrice, $this->currency_id);
$addPrice = getPriceCalcParamsTax($addPrice, $this->product_tax_id);
if ($userShop->percent_discount)
{
$addPrice = getPriceDiscount($addPrice, $userShop->percent_discount);
}
$options[$k2]->addprice = $addPrice;
$options[$k2]->orders = $v2->orders; $options[$k2]->val_id=$v2->val_id; if ($v2->orders*1>0) $need_reorder=1; }
if ($need_reorder==1) { $options=self::sort_attr($options,'orders','asc');//сортировка //переназначаем первый элемент if ($selects[$attr_id]->firstval*1>0) { $selects[$attr_id]->firstval=$options[0]->val_id; $_firstval=$options[0]->val_id; $attributeActive[$attr_id]=$_firstval; } }
if ($v->attr_type==1){ ...................

 

Далее вам нужна форма для редактирования поля `orders` - но это на ваше усмотрние.

 

 

Комментарии (0)

Здесь ещё нет оставленных комментариев.

Оставьте свой комментарий

  1. Добавление комментария от гостя.
Вложения (0 / 3)
Share Your Location

Как с нами связаться

По всем вопросам пишите  

Телеграм: @radgura

OnLine заказ

Отправить сообщение

Нажимая на кнопку «Отправить сообщение», я соглашаюсь:
* с условиями публичной оферты
* обработку моих персональных данных


RAD компоненты

Please publish modules in offcanvas position.