Отключение пагинации для макроса blogs20 postList — различия между версиями
(Новая страница: «'''Актуально для версии 2.9.1''' ==Задача== Требуется выводить список блогов на всех страницах …») |
Whoa (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии 1 участника) | |||
Строка 7: | Строка 7: | ||
==Решение== | ==Решение== | ||
− | Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его '''postsListCustom'''. В файл ''\classes\modules\blogs20\__custom.php'' копируем макрос '''postsList''' из файла ''\classes\modules\blogs20\class.php'' и переименовывае в '''postListCustom'''. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса '''blogs20''' и заменить все обращения в макросе к классу '''self::''' на '''def_module::'''. В конечном итоге у нас должен получиться следующий код: | + | Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его '''postsListCustom'''. В файл ''\classes\modules\blogs20\__custom.php'' копируем макрос '''postsList''' из файла ''\classes\modules\blogs20\class.php'' и переименовывае в '''postListCustom'''. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса '''blogs20''' и затем заменить все обращения в макросе к классу '''self::''' на '''def_module::'''. В конечном итоге у нас должен получиться следующий код: |
<source lang="php"> | <source lang="php"> | ||
+ | <?php | ||
+ | abstract class __custom_blogs20 extends blogs20 { | ||
+ | //TODO: Write here your own macroses | ||
+ | public function postsListCustom($blogId = false, $template = 'default', $limit = false, $page = 0) { | ||
+ | list($sTemplateBlock, $sTemplateLine, $sTemplateEmpty) = | ||
+ | def_module::loadTemplates('blogs20/'.$template, 'posts_list_block', 'posts_list_line', 'posts_list_block_empty'); | ||
+ | |||
+ | if ($page > 0) { $page = 1; } | ||
+ | if ($page == 0) { | ||
+ | $page = (int)getRequest('p'); | ||
+ | } | ||
+ | |||
+ | $oBlog = null; | ||
+ | |||
+ | $oHierarchy = umiHierarchy::getInstance(); | ||
+ | if($blogId == false) { | ||
+ | $iTmp = (int)getRequest('param0'); | ||
+ | if($iTmp) $blogId = $iTmp; | ||
+ | } | ||
+ | |||
+ | $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId(); | ||
+ | |||
+ | $sel = new selector('pages'); | ||
+ | $sel->types('hierarchy-type')->id($hierarchy_type_id); | ||
+ | $sel->where('is_spam')->notequals(1); | ||
+ | |||
+ | $typesCollection = umiObjectTypesCollection::getInstance(); | ||
+ | $typeId = $typesCollection->getTypeByHierarchyTypeId($hierarchy_type_id); | ||
+ | $postType = $typesCollection->getType($typeId); | ||
+ | |||
+ | if($blogId) { | ||
+ | $oBlog = $oHierarchy->getElement($blogId); | ||
+ | if(!$oBlog) { | ||
+ | throw new publicException(getLabel('error-page-does-not-exist', null, $blogId)); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if($blogId != false) { | ||
+ | $userId = cmsController::getInstance()->getModule('users')->user_id; | ||
+ | $aFriendList = $oBlog->getValue('friendlist'); | ||
+ | $aFriendList[] = umiObjectsCollection::getInstance()->getObjectIdByGUID('system-supervisor'); | ||
+ | if($aFriendList === NULL) { | ||
+ | $aFriendList = Array(); | ||
+ | } | ||
+ | |||
+ | $aAuthorList = permissionsCollection::getInstance()->getUsersByElementPermissions($blogId, 2); | ||
+ | $aAuthorList[] = $oBlog->getObject()->getOwnerId(); | ||
+ | $sel->where('hierarchy')->page($blogId)->childs(1); | ||
+ | if(!in_array($userId, $aFriendList) && !in_array($userId, $aAuthorList)) { | ||
+ | $sel->where('only_for_friends')->notequals(1); | ||
+ | } | ||
+ | } else { | ||
+ | $sel->where('only_for_friends')->notequals(1); | ||
+ | } | ||
+ | |||
+ | def_module::applyTimeRange($sel, $postType); | ||
+ | |||
+ | $sel->order('publish_time')->desc(); | ||
+ | |||
+ | if($limit) { | ||
+ | $sel->limit($page * $limit, $limit); | ||
+ | } else { | ||
+ | $sel->limit($page * $this->posts_per_page, $this->posts_per_page); | ||
+ | } | ||
+ | |||
+ | $result = $sel->result(); | ||
+ | $total = $sel->length(); | ||
+ | if(!empty($result)) { | ||
+ | $aLines = array(); | ||
+ | foreach($result as $oPost) { | ||
+ | $iPostId = $oPost->getId(); | ||
+ | if(!$oPost) continue; | ||
+ | if(!$blogId) { | ||
+ | $oBlog = $oHierarchy->getElement( $oPost->getRel() ); | ||
+ | } | ||
+ | $sPostLink = $oHierarchy->getPathById($iPostId, true); | ||
+ | $sBlogLink = $oHierarchy->getPathById($oBlog->getId(), true); | ||
+ | $aLineParam = array(); | ||
+ | $aLineParam['attribute:id'] = $iPostId; | ||
+ | $aLineParam['attribute:author_id'] = $oPost->getObject()->getOwnerId(); | ||
+ | $aLineParam['name'] = $oPost->getName(); | ||
+ | $aLineParam['post_link'] = $sPostLink; | ||
+ | $aLineParam['blog_link'] = $sBlogLink; | ||
+ | $aLineParam['bid'] = $oBlog->getId(); | ||
+ | $aLineParam['blog_name'] = $oBlog->getName(); | ||
+ | $aLineParam['blog_title'] = $oBlog->getValue('title'); | ||
+ | $aLineParam['title'] = $oPost->getValue('title'); | ||
+ | $aLineParam['cut'] = system_parse_short_calls($this->prepareCut($oPost->getValue('content'), | ||
+ | $sPostLink, $template), $iPostId); | ||
+ | $aLineParam['subnodes:tags'] = $this->prepareTags($oPost->getValue('tags'), $template); | ||
+ | $aLineParam['comments_count'] = $this->getCommentsCount($iPostId); | ||
+ | $aLineParam['publish_time'] = ($t = $oPost->getValue('publish_time')) ? $t->getFormattedDate('U') : ''; | ||
+ | $aLines[] = def_module::parseTemplate($sTemplateLine, $aLineParam, $iPostId); | ||
+ | $this->pushEditable("blogs20", "post", $iPostId); | ||
+ | } | ||
+ | |||
+ | $aBlockParam = array(); | ||
+ | $aBlockParam['void:lines'] = $aBlockParam['subnodes:items'] = $aLines; | ||
+ | $aBlockParam['bid'] = $blogId; | ||
+ | $aBlockParam['per_page'] = $limit ? $limit : $this->posts_per_page; | ||
+ | $aBlockParam['total'] = $total; | ||
+ | |||
+ | return def_module::parseTemplate($sTemplateBlock, $aBlockParam); | ||
+ | } else { | ||
+ | return def_module::parseTemplate($sTemplateEmpty, array('bid'=>$blogId)); | ||
+ | } | ||
+ | } | ||
+ | }; | ||
+ | ?> | ||
</source> | </source> | ||
+ | |||
+ | Помимо всего выше перечисленного мы добавили четвертую передаваемую переменную '''$page''' от значения которой будет включаться или выключаться пагинация. Мы видим, что при передаваемом значении больше нуля пагинация будет отключена. Теперь мы можем добавить макрос вывода блогов или статей блога макросом blogs20 postListCustom и для отключения пагинации добавить четвертым передаваемым значением число 1. | ||
+ | |||
+ | [[category:Написание кастомных макросов]] [[Категория:Модуль Блоги20]] |
Текущая версия на 15:00, 21 ноября 2018
Актуально для версии 2.9.1
Задача
Требуется выводить список блогов на всех страницах сайта и отключить зависимость от пагинации, что бы все время выводились например только последние добавленные статьи или блоги.
Решение
Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его postsListCustom. В файл \classes\modules\blogs20\__custom.php копируем макрос postsList из файла \classes\modules\blogs20\class.php и переименовывае в postListCustom. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса blogs20 и затем заменить все обращения в макросе к классу self:: на def_module::. В конечном итоге у нас должен получиться следующий код:
<?php
abstract class __custom_blogs20 extends blogs20 {
//TODO: Write here your own macroses
public function postsListCustom($blogId = false, $template = 'default', $limit = false, $page = 0) {
list($sTemplateBlock, $sTemplateLine, $sTemplateEmpty) =
def_module::loadTemplates('blogs20/'.$template, 'posts_list_block', 'posts_list_line', 'posts_list_block_empty');
if ($page > 0) { $page = 1; }
if ($page == 0) {
$page = (int)getRequest('p');
}
$oBlog = null;
$oHierarchy = umiHierarchy::getInstance();
if($blogId == false) {
$iTmp = (int)getRequest('param0');
if($iTmp) $blogId = $iTmp;
}
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();
$sel = new selector('pages');
$sel->types('hierarchy-type')->id($hierarchy_type_id);
$sel->where('is_spam')->notequals(1);
$typesCollection = umiObjectTypesCollection::getInstance();
$typeId = $typesCollection->getTypeByHierarchyTypeId($hierarchy_type_id);
$postType = $typesCollection->getType($typeId);
if($blogId) {
$oBlog = $oHierarchy->getElement($blogId);
if(!$oBlog) {
throw new publicException(getLabel('error-page-does-not-exist', null, $blogId));
}
}
if($blogId != false) {
$userId = cmsController::getInstance()->getModule('users')->user_id;
$aFriendList = $oBlog->getValue('friendlist');
$aFriendList[] = umiObjectsCollection::getInstance()->getObjectIdByGUID('system-supervisor');
if($aFriendList === NULL) {
$aFriendList = Array();
}
$aAuthorList = permissionsCollection::getInstance()->getUsersByElementPermissions($blogId, 2);
$aAuthorList[] = $oBlog->getObject()->getOwnerId();
$sel->where('hierarchy')->page($blogId)->childs(1);
if(!in_array($userId, $aFriendList) && !in_array($userId, $aAuthorList)) {
$sel->where('only_for_friends')->notequals(1);
}
} else {
$sel->where('only_for_friends')->notequals(1);
}
def_module::applyTimeRange($sel, $postType);
$sel->order('publish_time')->desc();
if($limit) {
$sel->limit($page * $limit, $limit);
} else {
$sel->limit($page * $this->posts_per_page, $this->posts_per_page);
}
$result = $sel->result();
$total = $sel->length();
if(!empty($result)) {
$aLines = array();
foreach($result as $oPost) {
$iPostId = $oPost->getId();
if(!$oPost) continue;
if(!$blogId) {
$oBlog = $oHierarchy->getElement( $oPost->getRel() );
}
$sPostLink = $oHierarchy->getPathById($iPostId, true);
$sBlogLink = $oHierarchy->getPathById($oBlog->getId(), true);
$aLineParam = array();
$aLineParam['attribute:id'] = $iPostId;
$aLineParam['attribute:author_id'] = $oPost->getObject()->getOwnerId();
$aLineParam['name'] = $oPost->getName();
$aLineParam['post_link'] = $sPostLink;
$aLineParam['blog_link'] = $sBlogLink;
$aLineParam['bid'] = $oBlog->getId();
$aLineParam['blog_name'] = $oBlog->getName();
$aLineParam['blog_title'] = $oBlog->getValue('title');
$aLineParam['title'] = $oPost->getValue('title');
$aLineParam['cut'] = system_parse_short_calls($this->prepareCut($oPost->getValue('content'),
$sPostLink, $template), $iPostId);
$aLineParam['subnodes:tags'] = $this->prepareTags($oPost->getValue('tags'), $template);
$aLineParam['comments_count'] = $this->getCommentsCount($iPostId);
$aLineParam['publish_time'] = ($t = $oPost->getValue('publish_time')) ? $t->getFormattedDate('U') : '';
$aLines[] = def_module::parseTemplate($sTemplateLine, $aLineParam, $iPostId);
$this->pushEditable("blogs20", "post", $iPostId);
}
$aBlockParam = array();
$aBlockParam['void:lines'] = $aBlockParam['subnodes:items'] = $aLines;
$aBlockParam['bid'] = $blogId;
$aBlockParam['per_page'] = $limit ? $limit : $this->posts_per_page;
$aBlockParam['total'] = $total;
return def_module::parseTemplate($sTemplateBlock, $aBlockParam);
} else {
return def_module::parseTemplate($sTemplateEmpty, array('bid'=>$blogId));
}
}
};
?>
Помимо всего выше перечисленного мы добавили четвертую передаваемую переменную $page от значения которой будет включаться или выключаться пагинация. Мы видим, что при передаваемом значении больше нуля пагинация будет отключена. Теперь мы можем добавить макрос вывода блогов или статей блога макросом blogs20 postListCustom и для отключения пагинации добавить четвертым передаваемым значением число 1.