UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: diii3 от 18 Февраля 2012, 10:30:59

Название: Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 18 Февраля 2012, 10:30:59
Здравствуйте! Подскажите, пожалуйста, можно ли сделать чтобы при выводе списка объектов категории каталога, они выводились по дате последнего добавления?
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: BaceH от 18 Февраля 2012, 20:53:23
можно, можно кастомом, можно usel, вам что больше нравиться?
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 18 Февраля 2012, 22:09:32
спасибо за выбор) мне то, что проще сделать))
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 21 Февраля 2012, 19:35:31
так, что надо сделать-то?))
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: admin от 21 Февраля 2012, 21:10:19
дата создания в объектах не сохраняется, так что можно отсортировать только по id , а так как id увеличивается постепенно, то можно сказать что, то что раньше создали имеет более ранний (меньший) id.

так как нельзя сделать сортировку usel результатов по id, то пишешь кастомный макрос,  который делает selector выборку с сортировкой по id
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 21 Февраля 2012, 21:59:04
я извиняюсь, но может есть пример? любой с этим selector?
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: admin от 22 Февраля 2012, 06:29:19
в файле /classes/modules/catalog/__custom.php делаешь копию функции getObjectsList и вносишь туда сортировку по id/ В итоге у тебя получиться такой код в этом файле
<?php
abstract class __custom_catalog {
//TODO: Write here your own macroses

public function getObjectsListIdSort($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0) {
if($this->breakMe()) return;
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("tpls/catalog/{$template}.tpl", "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);
}

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->setOrderByObjectId();
}

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

$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[] = $this->parseTemplate($template_line, $line_arr, $element_id);

templater::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 $this->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 $this->parseTemplate($template_block_empty, $block_arr, $category_id);;
}

}
};
?>

и не забываем прописать права на эту функцию то есть создаем файл  /classes/modules/catalog/permissions.custom.php в котором будет следующее содержимое
<?php
$permissions = Array(
'view' => Array('getObjectsListIdSort')
);
?>

после этого макрос udata://catalog/getObjectsListIdSort будет работать с такимиже параметрами и по той же логике что и getObjectsList, только основная сортировка будет у него по objectId
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 22 Февраля 2012, 09:27:51
Вы знаете, не работает, но сам код вроде рабочий. Когда подключаю функцию getObjectsListIdSort в вывод объектов каталога, то никакие объекты не выводятся. После этого пробую прописать сам код функции getObjectsList на место кода getObjectsListIdSort  в __custom.php, то же самое, может функция getObjectsListIdSort  не запускается? права установил как надо. Дальше пробую копировать ваш код вместо кода getObjectsList  в class.php, функция работает, но обратной сортировки нет......
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: BaceH от 22 Февраля 2012, 10:04:16
покажите содержимое вашего  /classes/modules/catalog/__custom.php.
при вашем тестировании сортировка вообще не происходит? или происходит но не так как хотелось бы?
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 22 Февраля 2012, 10:17:03
вообще не происходит...

у меня в этом файле еще вами созданная функция добавления, а потом getObjectsListIdSort

<?php
   abstract class __custom_catalog {
      //TODO: Write here your own macroses
      
      public function addCatalogObjectCust() {
         $hierarchy = umiHierarchy::getInstance();
         $hierarchyTypes = umiHierarchyTypesCollection::getInstance();
         $objectTypes = umiObjectTypesCollection::getInstance();
         $cmsController = cmsController::getInstance();
         $parent_id = (int) getRequest('param0');
         $object_type_id = (int) getRequest('param1');
         $title = htmlspecialchars(trim(getRequest('title')));
         $parentElement = $hierarchy->getElement($parent_id);
         $tpl_id      = $parentElement->getTplId();
         $domain_id   = $parentElement->getDomainId();
         $lang_id   = $parentElement->getLangId();
         $hierarchy_type_id = $hierarchyTypes->getTypeByName("catalog", "object")->getId();
         if(!$object_type_id) {
            $object_type_id = $objectTypes->getBaseType("catalog", "object");
         }

         $object_type = $objectTypes->getType($object_type_id);
         if($object_type->getHierarchyTypeId() != $hierarchy_type_id) {
            exit($object_type->getHierarchyTypeId().'='.$hierarchy_type_id);
            $this->errorNewMessage("Object type and hierarchy type doesn't match");
            $this->errorPanic();
         }
         $element_id = $hierarchy->addElement($parent_id, $hierarchy_type_id, $title, $title, $object_type_id, $domain_id, $lang_id, $tpl_id);
         permissionsCollection::getInstance()->setDefaultPermissions($element_id);
         
         $element = $hierarchy->getElement($element_id, true);
         $element->setIsActive(true);
         $element->setIsVisible(false);
         $element->setName($element_id);
         $element->setAltName($element_id);
         
         $data = $cmsController->getModule("data");
         if($data instanceof def_module) {
            $object_id = $element->getObjectId();
            $data->saveEditedObject($object_id, true);
         }
         $element->getObject()->commit();
         $element->commit();
         $parentElement->setUpdateTime(time());
         $parentElement->commit();
         
         
   /*      //отправка письма менеджеру   
         $email_from = 'info@umihelp.ru';//regedit::getInstance()->getVal("//settings/email_from");
         $fio_from = 'admin';//regedit::getInstance()->getVal("//settings/fio_from");

         $admin_email = 'admin@umihelp.ru';//regedit::getInstance()->getVal("//settings/admin_email");

         $someMail = new umiMail();
         $someMail->addRecipient($admin_email);
         $someMail->setFrom($email_from, $fio_from);
         $someMail->setSubject("Add new page on site");
         $someMail->setContent($mail_content);
         $someMail->commit();
         $someMail->send();*/
         
         
         
         
        $Name = "vladcity33.ru"; //senders name
          $email = "info@vladcity33.ru"; //senders e-mail adress
          $recipient = "vladcity33@mail.ru"; //recipient
          $mail_body = "Add new object on site! Category ID = $parent_id . Object ID = $element_id"; //mail body
          $subject = "Add new object on site"; //subject
          $header = "From: ". $Name . " <" . $email . ">\r\n"; //optional headerfields
 

          if(mail($recipient, $subject, $mail_body, $header)){
          return true;
          } else {
          return false;
          }   
      
         
         
         
         if($is_xslt) {
            return Array("node:result" => "ok");
         } else {
            if($element->getIsActive()) {
               $referer_url = $hierarchy->getPathById($element_id);
            } else {
               $referer_url = getServer('HTTP_REFERER');
            }
            $this->redirect($referer_url);
         }
      }
      
      
      
      
      
      
      
      
      
      
      
      public function getObjectsListIdSort($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0) {
         if($this->breakMe()) return;
         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("tpls/catalog/{$template}.tpl", "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);
         }
         
         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->setOrderByObjectId();
         }

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

         $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[] = $this->parseTemplate($template_line, $line_arr, $element_id);

               templater::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 $this->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 $this->parseTemplate($template_block_empty, $block_arr, $category_id);;
         }

      }
      
      
      
      
      
      
      
      
      
      
   };
?>
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: BaceH от 22 Февраля 2012, 11:10:49
попробуйте так:
			public function getObjectsListIdSort($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0, $field_id = false, $asc = true) {

if($this->breakMe()) return;
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->setOrderFilter();
$sel->setOrderByObjectId(false);
}


$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[] = $this->parseTemplate($template_line, $line_arr, $element_id);

templater::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 $this->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 $this->parseTemplate($template_block_empty, $block_arr, $category_id);;
}

}

и проверьте данные вывода xml по запросу :
http://ваш_сайт/udata/catalog/getObjectsListIdSort//ид_категории_с товаром/10/0
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 22 Февраля 2012, 12:20:10
Спасибо большое!! Это я опять начудил) Права не правильно добавил) Все работает!!
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 22 Февраля 2012, 12:27:15
Черт, теперь не работает добавление объекта каталога)....
Название: Re:Вывод объектов каталога по дате последнего добавления
Отправлено: diii3 от 22 Февраля 2012, 12:32:35
Извиняюсь, все работает! Спасибо еще раз!!