Запрет отображения товара, отсутствующего на складе.

Материал из Umicms
Перейти к:навигация, поиск

Задача - Необходимо чтобы товар не отображался в каталоге, если он отсутствует на складе.

Решение.

В модуле «Шаблоны данных» добавим в типе «Объект каталога»добавим поле, отвечающее за состояние на складе: 'test_storage' и сделаем его обязательным. В файл ..\classes\modules\catalog\__custom.php после слов "//TODO: Write your own macroses here" добавим кастомных метод:

public function getObjectsList_custom($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0, $field_id = false, $asc = true) {
                        if(!$template) $template = "default";

                        if (!$i_need_deep) $i_need_deep = intval(getRequest('param4'));
                        if (!$i_need_deep) $i_need_deep = 0;
                        $i_need_deep = intval($i_need_deep);
                        if ($i_need_deep === -1) $i_need_deep = 100;

                        $hierarchy = umiHierarchy::getInstance();

                        list($template_block, $template_block_empty, $template_block_search_empty, $template_line) = def_module::loadTemplates("catalog/".$template, "objects_block", "objects_block_empty", "objects_block_search_empty", "objects_block_line");

                        $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();

                        $category_id = $this->analyzeRequiredPath($path);

                        if($category_id === false && $path != KEYWORD_GRAB_ALL) {
                                    throw new publicException(getLabel('error-page-does-not-exist', null, $path));
                        }

                        $category_element = $hierarchy->getElement($category_id);

                        $per_page = ($limit) ? $limit : $this->per_page;
                        $curr_page = getRequest('p');
                        if($ignore_paging) $curr_page = 0;

                        $sel = new umiSelection;
                        $sel->setElementTypeFilter();
                        $sel->addElementType($hierarchy_type_id);



                        if($path != KEYWORD_GRAB_ALL) {
                                    $sel->setHierarchyFilter();
                                    $sel->addHierarchyFilter($category_id, $i_need_deep);
                        }

                        $sel->setPermissionsFilter();
                        $sel->addPermissions();

                        $hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);
                        $type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());


                        if($path === KEYWORD_GRAB_ALL) {
                                    $curr_category_id = cmsController::getInstance()->getCurrentElementId();
                        } else {
                                    $curr_category_id = $category_id;
                        }


                        if($path != KEYWORD_GRAB_ALL) {
                                    $type_id = $hierarchy->getDominantTypeId($curr_category_id, $i_need_deep, $hierarchy_type_id);
                        }

                        if(!$type_id) {
                                    $type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());
                        }


                        if($type_id) {
                                    $this->autoDetectOrders($sel, $type_id);
                                    $this->autoDetectFilters($sel, $type_id);

                                    if($this->isSelectionFiltered) {
                                               $template_block_empty = $template_block_search_empty;
                                               $this->isSelectionFiltered = false;
                                    }
                        } else {
                                    $sel->setOrderFilter();
                                    $sel->setOrderByName();
                        }

                        if($curr_page !== "all") {
                                    $curr_page = (int) $curr_page;
                                    $sel->setLimitFilter();
                                    $sel->addLimit($per_page, $curr_page);
                        }

                        if($field_id) {
                                    if (is_numeric($field_id)) {
                                               $sel->setOrderByProperty($field_id, $asc);
                                    } else {
                                               if ($type_id) {
                                                           $field_id = umiObjectTypesCollection::getInstance()->getType($type_id)->getFieldId($field_id);
                                                           if ($field_id) {
                                                                       $sel->setOrderByProperty($field_id, $asc);
                                                           } else {
                                                                       $sel ->setOrderByOrd($asc);
                                                           }
                                               } else {
                                                           $sel ->setOrderByOrd($asc);
                                               }
                                    }
                        }
                        else {
                                    $sel ->setOrderByOrd($asc);
                        }

                        $iTypeId = umiObjectTypesCollection::getInstance()->getBaseType('catalog', 'object');
                        $oType    = umiObjectTypesCollection::getInstance()->getType($iTypeId);
                        $iFieldId = $oType->getFieldId('test_storage');
                        $sel->addPropertyFilterNotEqual($iFieldId,0);
                        
                        $result = umiSelectionsParser::runSelection($sel);
                        $total = umiSelectionsParser::runSelectionCounts($sel);

                        if(($sz = sizeof($result)) > 0) {
                                    $block_arr = Array();

                                    $lines = Array();
                                    for($i = 0; $i < $sz; $i++) {
                                               $element_id = $result[$i];
                                               $element = umiHierarchy::getInstance()->getElement($element_id);

                                               if(!$element) continue;

                                               $line_arr = Array();
                                               $line_arr['attribute:id'] = $element_id;
                                               $line_arr['attribute:alt_name'] = $element->getAltName();
                                               $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
                                               $line_arr['xlink:href'] = "upage://" . $element_id;
                                               $line_arr['node:text'] = $element->getName();

                                               $lines[] = def_module::parseTemplate($template_line, $line_arr, $element_id);

                                               $this->pushEditable("catalog", "object", $element_id);
                                               umiHierarchy::getInstance()->unloadElement($element_id);
                                    }

                                    $block_arr['subnodes:lines'] = $lines;
                                    $block_arr['numpages'] = umiPagenum::generateNumPage($total, $per_page);
                                    $block_arr['total'] = $total;
                                    $block_arr['per_page'] = $per_page;
                                    $block_arr['category_id'] = $category_id;

                                    if($type_id) {
                                               $block_arr['type_id'] = $type_id;
                                    }

                                    return def_module::parseTemplate($template_block, $block_arr, $category_id);
                        } else {
                                    $block_arr['numpages'] = umiPagenum::generateNumPage(0, 0);
                                    $block_arr['lines'] = "";
                                    $block_arr['total'] = 0;
                                    $block_arr['per_page'] = 0;
                                    $block_arr['category_id'] = $category_id;

                                    return self::parseTemplate($template_block_empty, $block_arr, $category_id);;
                        }

            }
            };

В шаблоне, по которому выводится список объектов каталога, обычно это tpls/catalog/default.tpl, измением название метода getObjectsList() на:

%catalog getObjectsList_custom('default', '%category_id%')%

В файле ..\classes\modules\catalog\permissions.custom.php расширим существующую группу прав:

$permissions = array(
                        'tree' => array(),
                        'view' => array('getObjectsList_custom')
);