Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 1 Гость просматривают эту тему.

*

fantom103

  • *
  • 9
  • +0/-0
    • Просмотр профиля
public function getCountObjects($id_parent){
$id_parent = (int) $id_parent;
$hierarchy = umiHierarchy::getInstance();
$element = $hierarchy->getElement($id_parent);
if($element && $element->getMethod() == 'category'){
  $count =  $element->count_object->$pages;
  if(!is_null($count)){
 if($count > 0){
return "<span class='total_object'>{$count}</span>";
 }
 else{
return "<span class='is_not_count'></span>";
 }
  }else{
$hierarchyTypes = umiHierarchyTypesCollection::getInstance();
$hierarchyType = $hierarchyTypes->getTypeByName("catalog", "object");
$hierarchyTypeId = $hierarchyType->getId();
$count = $hierarchy->getChildsCount($id_parent, false, true, 0, $hierarchyTypeId);
$element->setValue('count_object',$count);
$element->commit();
if($count > 0) return "<span class='total_object'>{$count}</span>";  
  }  
}
}
Вот рабочий кастом. который подсчитывает кол-во объектов в разделе каталога...
Не подскажите что и где нужно добавить, чтобы кол-во объектов выводилось с учетом фильтра?
фильтр у меня такой ?fields_filter[stores_state]=118.

это фильтр по составному полю, а точнее склады.

Буду Вам очень благодарен за любую помощь!!!
С уважением, Дмитрий.
« Последнее редактирование: 02 Октября 2014, 11:25:38 от fantom103 »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
если у вас ?fields_filter[stores_state]=118 работает в адресной строке (что с опционном поле совсем не факт). То есть, подставив его в адресную строку на странице с выводом товаров, вы видите, что фильтрация применяется правильно.
Тогда вам надо немного переделать макрос. Вместо функции getChildsCount использовать selector выборку. В которой вы и зададите фильтрацию по полю.
Ия еще несного поменят вывод результата, чтобы return был в самом конце функции, а не прописывался 2 раза в разных блоках (причем в последнем выводе  не было учета того, что количество может быть равным 0)

public function getCountObjects($id_parent){
$id_parent = (int) $id_parent;
$hierarchy = umiHierarchy::getInstance();
$element = $hierarchy->getElement($id_parent);
if($element && $element->getMethod() == 'category'){
$count =  $element->count_object->$pages;
if(is_null($count)){
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('stores_state')->equals(118);
$pages->where('hierarchy')->page($id_parent)->childs(0);    
$count = $pages->length;

$element->setValue('count_object',$count);
$element->commit();
}
if($count > 0){
return "<span class='total_object'>{$count}</span>";
}
else{
return "<span class='is_not_count'></span>";
}
}
}

*

fantom103

  • *
  • 9
  • +0/-0
    • Просмотр профиля
moy_sait/razdel/name?fields_filter[stores_state]=118 да работает в адресной строке.
где stores_state - состояние на складе(составной тип)
118 - id склада

если изменить строку:
$count = $hierarchy->getChildsCount($id_parent, false, true, 0, $hierarchyTypeId);

на selector:

$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('stores_state')->equals(118);
$pages->where('hierarchy')->page($id_parent)->childs(0);  
$count = $pages->length;

,то выдает ошибку:

Ошибка (Exception): Произошла критическая ошибка. Скорее всего, потребуется участие разработчиков. Подробности по ссылке 17000

пробовал искать по другому полю(типа кнопка-флажок):
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('chapaevsk')->equals(true);
$pages->where('hierarchy')->page($id_parent)->childs(4);  
$count = $pages->length;

все пырцает!))
Вывод напрашивается что в строке:
$pages->where('stores_state')->equals(118);

явно что то не то...
Вообщем спасибо за помощь! Буду лопатить документацию по API UMI selector
« Последнее редактирование: 02 Октября 2014, 11:24:36 от fantom103 »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
попробуйте строчку
$pages->where('stores_state')->equals(118);

заменить на
$pages->where('stores_state')->equals(array('rel'=>118));

*

fantom103

  • *
  • 9
  • +0/-0
    • Просмотр профиля
Вот теперь другое дело, только в моем случае будет не так:
$pages->where('hierarchy')->page($id_parent)->childs(0); 

а вот так:
$pages->where('hierarchy')->page($id_parent)->childs(4); 

БОЛЬШОЕ ВАМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Вот теперь другое дело, только в моем случае будет не так:
$pages->where('hierarchy')->page($id_parent)->childs(0); 

а вот так:
$pages->where('hierarchy')->page($id_parent)->childs(4); 

странно, в вашем изначальном коде есть строчка
$count = $hierarchy->getChildsCount($id_parent, false, true, 0, $hierarchyTypeId);
и 0 в параметрах функции, это как раз глубина, но возможно, код вы приводили просто для примера

*

fantom103

  • *
  • 9
  • +0/-0
    • Просмотр профиля
да это я из статьи пример привел!

если я указываю childs(0), то ничего не возвращает. Просто в моем каталоге есть вложенные подразделы.

Спасибо!