Файл: concrete5.7.5.6/concrete/blocks/page_list/controller.php
Строк: 401
<?php
namespace ConcreteBlockPageList;
use BlockType;
use CollectionAttributeKey;
use ConcreteCoreBlockBlockController;
use ConcreteCorePageFeed;
use Database;
use Page;
use Core;
use PageList;
use ConcreteCoreAttributeKeyCollectionKey;
use ConcreteCoreTreeNodeTypeTopic;
class Controller extends BlockController
{
protected $btTable = 'btPageList';
protected $btInterfaceWidth = "800";
protected $btInterfaceHeight = "350";
protected $btExportPageColumns = array('cParentID');
protected $btExportPageTypeColumns = array('ptID');
protected $btExportPageFeedColumns = array('pfID');
protected $btCacheBlockRecord = true;
protected $btCacheBlockOutput = null;
protected $btCacheBlockOutputOnPost = true;
protected $btCacheBlockOutputLifetime = 300;
protected $list;
/**
* Used for localization. If we want to localize the name/description we have to include this.
*/
public function getBlockTypeDescription()
{
return t("List pages based on type, area.");
}
public function getBlockTypeName()
{
return t("Page List");
}
public function getJavaScriptStrings()
{
return array(
'feed-name' => t('Please give your RSS Feed a name.'),
);
}
public function on_start()
{
$this->list = new PageList();
$this->list->disableAutomaticSorting();
//$pl->setNameSpace('b' . $this->bID);
$cArray = array();
switch ($this->orderBy) {
case 'display_asc':
$this->list->sortByDisplayOrder();
break;
case 'display_desc':
$this->list->sortByDisplayOrderDescending();
break;
case 'chrono_asc':
$this->list->sortByPublicDate();
break;
case 'random':
$this->list->sortBy('RAND()');
break;
case 'alpha_asc':
$this->list->sortByName();
break;
case 'alpha_desc':
$this->list->sortByNameDescending();
break;
default:
$this->list->sortByPublicDateDescending();
break;
}
$today = date('Y-m-d');
$end = $start = null;
switch ($this->filterDateOption) {
case 'now':
$start = "$today 00:00:00";
$end = "$today 23:59:59";
break;
case 'past':
$end = "$today 23:59:59";
if ($this->filterDateDays > 0) {
$past = date('Y-m-d', strtotime("-{$this->filterDateDays} days"));
$start = "$past 00:00:00";
}
break;
case 'future':
$start = "$today 00:00:00";
if ($this->filterDateDays > 0) {
$future = date('Y-m-d', strtotime("+{$this->filterDateDays} days"));
$end = "$future 23:59:59";
}
break;
case 'between':
$start = "{$this->filterDateStart} 00:00:00";
$end = "{$this->filterDateEnd} 23:59:59";
break;
case 'all':
default:
break;
}
if ($start) {
$this->list->filterByPublicDate($start, '>=');
}
if ($end) {
$this->list->filterByPublicDate($end, '<=');
}
$c = Page::getCurrentPage();
if (is_object($c)) {
$this->cID = $c->getCollectionID();
}
if ($this->displayFeaturedOnly == 1) {
$cak = CollectionAttributeKey::getByHandle('is_featured');
if (is_object($cak)) {
$this->list->filterByIsFeatured(1);
}
}
if ($this->displayAliases) {
$this->list->includeAliases();
}
$this->list->filter('cvName', '', '!=');
if ($this->ptID) {
$this->list->filterByPageTypeID($this->ptID);
}
if ($this->filterByRelated) {
$ak = CollectionKey::getByHandle($this->relatedTopicAttributeKeyHandle);
if (is_object($ak)) {
$topics = $c->getAttribute($ak->getAttributeKeyHandle());
if (count($topics) > 0 && is_array($topics)) {
$topic = $topics[array_rand($topics)];
$this->list->filter('p.cID', $c->getCollectionID(), '<>');
$this->list->filterByTopic($topic);
}
}
}
if ($this->filterByCustomTopic) {
$this->list->filterByTopic(intval($this->customTopicTreeNodeID));
}
$db = Database::connection();
$columns = $db->MetaColumnNames(CollectionAttributeKey::getDefaultIndexedSearchTable());
if (in_array('ak_exclude_page_list', $columns)) {
$this->list->filter(false, '(ak_exclude_page_list = 0 or ak_exclude_page_list is null)');
}
if (intval($this->cParentID) != 0) {
$cParentID = ($this->cThis) ? $this->cID : $this->cParentID;
if ($this->includeAllDescendents) {
$this->list->filterByPath(Page::getByID($cParentID)->getCollectionPath());
} else {
$this->list->filterByParentID($cParentID);
}
}
return $this->list;
}
public function view()
{
$list = $this->list;
$nh = Core::make('helper/navigation');
$this->set('nh', $nh);
if ($this->pfID) {
$this->requireAsset('css', 'font-awesome');
$feed = Feed::getByID($this->pfID);
if (is_object($feed)) {
$this->set('rssUrl', $feed->getFeedURL());
$link = new HtmlObjectElement('link');
$link->href($feed->getFeedURL());
$link->rel('alternate');
$link->type('application/rss+xml');
$link->title($feed->getTitle());
$this->addHeaderItem($link);
}
}
//Pagination...
$showPagination = false;
if ($this->num > 0) {
$list->setItemsPerPage($this->num);
$pagination = $list->getPagination();
$pages = $pagination->getCurrentPageResults();
if ($pagination->getTotalPages() > 1 && $this->paginate) {
$showPagination = true;
$pagination = $pagination->renderDefaultView();
$this->set('pagination', $pagination);
}
} else {
$pages = $list->getResults();
}
if ($showPagination) {
$this->requireAsset('css', 'core/frontend/pagination');
}
$this->set('pages', $pages);
$this->set('list', $list);
$this->set('showPagination', $showPagination);
}
public function add()
{
$this->requireAsset('core/topics');
$c = Page::getCurrentPage();
$uh = Core::make('helper/concrete/urls');
$this->set('c', $c);
$this->set('uh', $uh);
$this->set('includeDescription', true);
$this->set('includeName', true);
$this->set('bt', BlockType::getByHandle('page_list'));
$this->set('featuredAttribute', CollectionAttributeKey::getByHandle('is_featured'));
$this->set('thumbnailAttribute', CollectionAttributeKey::getByHandle('thumbnail'));
$this->loadKeys();
}
public function edit()
{
$this->requireAsset('core/topics');
$b = $this->getBlockObject();
$bCID = $b->getBlockCollectionID();
$bID = $b->getBlockID();
$this->set('bID', $bID);
$c = Page::getCurrentPage();
if ((!$this->cThis) && ($this->cParentID != 0)) {
$isOtherPage = true;
$this->set('isOtherPage', true);
}
if ($this->pfID) {
$feed = Feed::getByID($this->pfID);
if (is_object($feed)) {
$this->set('rssFeed', $feed);
}
}
$uh = Core::make('helper/concrete/urls');
$this->set('uh', $uh);
$this->set('bt', BlockType::getByHandle('page_list'));
$this->set('featuredAttribute', CollectionAttributeKey::getByHandle('is_featured'));
$this->set('thumbnailAttribute', CollectionAttributeKey::getByHandle('thumbnail'));
$this->loadKeys();
}
protected function loadKeys()
{
$attributeKeys = array();
$keys = CollectionKey::getList();
foreach ($keys as $ak) {
if ($ak->getAttributeTypeHandle() == 'topics') {
$attributeKeys[] = $ak;
}
}
$this->set('attributeKeys', $attributeKeys);
}
public function action_filter_by_topic($treeNodeID = false, $topic = false)
{
if ($treeNodeID) {
$this->list->filterByTopic(intval($treeNodeID));
$topicObj = Topic::getByID(intval($treeNodeID));
if (is_object($topicObj)) {
$seo = Core::make('helper/seo');
$seo->addTitleSegment($topicObj->getTreeNodeDisplayName());
}
}
$this->view();
}
public function action_filter_by_tag($tag = false)
{
$seo = Core::make('helper/seo');
$seo->addTitleSegment($tag);
$this->list->filterByTags(h($tag));
$this->view();
}
public function action_filter_by_date($year = false, $month = false, $timezone = 'user')
{
if (is_numeric($year)) {
$year = (($year < 0) ? '-' : '') . str_pad(abs($year), 4, '0', STR_PAD_LEFT);
if ($month) {
$month = str_pad($month, 2, '0', STR_PAD_LEFT);
$lastDayInMonth = date('t', strtotime("$year-$month-01"));
$start = "$year-$month-01 00:00:00";
$end = "$year-$month-$lastDayInMonth 23:59:59";
} else {
$start = "$year-01-01 00:00:00";
$end = "$year-12-31 23:59:59";
}
if ($timezone !== 'system') {
$dh = Core::make('helper/date');
/* @var $dh ConcreteCoreLocalizationServiceDate */
$start = $dh->toDB($start, $timezone);
$end = $dh->toDB($end, $timezone);
}
$this->list->filterByPublicDate($start, '>=');
$this->list->filterByPublicDate($end, '<=');
$seo = Core::make('helper/seo');
$srv = Core::make('helper/date');
$seo->addTitleSegment($srv->date('F Y', $start));
}
$this->view();
}
public function validate($args)
{
$e = Core::make('helper/validation/error');
$vs = Core::make('helper/validation/strings');
$pf = false;
if ($this->pfID) {
$pf = Feed::getByID($this->pfID);
}
if ($args['rss'] && !is_object($pf)) {
if (!$vs->handle($args['rssHandle'])) {
$e->add(t('Your RSS feed must have a valid URL, containing only letters, numbers or underscores'));
}
if (!$vs->notempty($args['rssTitle'])) {
$e->add(t('Your RSS feed must have a valid title.'));
}
if (!$vs->notempty($args['rssDescription'])) {
$e->add(t('Your RSS feed must have a valid description.'));
}
}
return $e;
}
public function getPassThruActionAndParameters($parameters)
{
if ($parameters[0] == 'topic') {
$method = 'action_filter_by_topic';
$parameters = array_slice($parameters, 1);
} elseif ($parameters[0] == 'tag') {
$method = 'action_filter_by_tag';
$parameters = array_slice($parameters, 1);
} elseif (Core::make('helper/validation/numbers')->integer($parameters[0])) {
// then we're going to treat this as a year.
$method = 'action_filter_by_date';
$parameters[0] = intval($parameters[0]);
if (isset($parameters[1])) {
$parameters[1] = intval($parameters[1]);
}
}
return array($method, $parameters);
}
public function isValidControllerTask($method, $parameters = array())
{
if (!$this->enableExternalFiltering) {
return false;
}
return parent::isValidControllerTask($method, $parameters);
}
public function save($args)
{
// If we've gotten to the process() function for this class, we assume that we're in
// the clear, as far as permissions are concerned (since we check permissions at several
// points within the dispatcher)
$db = Database::connection();
$bID = $this->bID;
$c = $this->getCollectionObject();
if (is_object($c)) {
$this->cID = $c->getCollectionID();
}
$args = $args + array(
'enableExternalFiltering' => 0,
'includeAllDescendents' => 0,
'includeDate' => 0,
'truncateSummaries' => 0,
'displayFeaturedOnly' => 0,
'topicFilter' => '',
'displayThumbnail' => 0,
'displayAliases' => 0,
'truncateChars' => 0,
'paginate' => 0,
'rss' => 0,
'pfID' => 0,
'filterDateOption' => '',
'cParentID' => null,
);
$args['num'] = ($args['num'] > 0) ? $args['num'] : 0;
$args['cThis'] = ($args['cParentID'] == $this->cID) ? '1' : '0';
$args['cParentID'] = ($args['cParentID'] == 'OTHER') ? $args['cParentIDValue'] : $args['cParentID'];
if (!$args['cParentID']) {
$args['cParentID'] = 0;
}
$args['enableExternalFiltering'] = ($args['enableExternalFiltering']) ? '1' : '0';
$args['includeAllDescendents'] = ($args['includeAllDescendents']) ? '1' : '0';
$args['includeDate'] = ($args['includeDate']) ? '1' : '0';
$args['truncateSummaries'] = ($args['truncateSummaries']) ? '1' : '0';
$args['displayFeaturedOnly'] = ($args['displayFeaturedOnly']) ? '1' : '0';
$args['filterByRelated'] = ($args['topicFilter'] == 'related') ? '1' : '0';
$args['filterByCustomTopic'] = ($args['topicFilter'] == 'custom') ? '1' : '0';
$args['displayThumbnail'] = ($args['displayThumbnail']) ? '1' : '0';
$args['displayAliases'] = ($args['displayAliases']) ? '1' : '0';
$args['truncateChars'] = intval($args['truncateChars']);
$args['paginate'] = intval($args['paginate']);
$args['rss'] = intval($args['rss']);
$args['ptID'] = intval($args['ptID']);
if (!$args['filterByRelated']) {
$args['relatedTopicAttributeKeyHandle'] = '';
}
if (!$args['filterByCustomTopic']) {
$args['customTopicAttributeKeyHandle'] = '';
$args['customTopicTreeNodeID'] = 0;
}
if ($args['rss']) {
if (isset($this->pfID) && $this->pfID) {
$pf = Feed::getByID($this->pfID);
}
if (!is_object($pf)) {
$pf = new ConcreteCorePageFeed();
$pf->setTitle($args['rssTitle']);
$pf->setDescription($args['rssDescription']);
$pf->setHandle($args['rssHandle']);
}
$pf->setParentID($args['cParentID']);
$pf->setPageTypeID($args['ptID']);
$pf->setIncludeAllDescendents($args['includeAllDescendents']);
$pf->setDisplayAliases($args['displayAliases']);
$pf->setDisplayFeaturedOnly($args['displayFeaturedOnly']);
$pf->setDisplayAliases($args['displayAliases']);
$pf->displayShortDescriptionContent();
$pf->save();
$args['pfID'] = $pf->getID();
} elseif (isset($this->pfID) && $this->pfID && !$args['rss']) {
// let's make sure this isn't in use elsewhere.
$cnt = $db->fetchColumn('select count(pfID) from btPageList where pfID = ?', array($this->pfID));
if ($cnt == 1) { // this is the last one, so we delete
$pf = Feed::getByID($this->pfID);
if (is_object($pf)) {
$pf->delete();
}
}
$args['pfID'] = 0;
}
if ($args['filterDateOption'] != 'between') {
$args['filterDateStart'] = null;
$args['filterDateEnd'] = null;
}
if ($args['filterDateOption'] == 'past') {
$args['filterDateDays'] = $args['filterDatePast'];
} elseif ($args['filterDateOption'] == 'future') {
$args['filterDateDays'] = $args['filterDateFuture'];
} else {
$args['filterDateDays'] = null;
}
$args['pfID'] = intval($args['pfID']);
parent::save($args);
}
public function isBlockEmpty()
{
$pages = $this->get('pages');
if (isset($this->pageListTitle) && $this->pageListTitle) {
return false;
}
if (count($pages) == 0) {
if ($this->noResultsMessage) {
return false;
} else {
return true;
}
} else {
if ($this->includeName || $this->includeDate || $this->displayThumbnail
|| $this->includeDescription || $this->useButtonForLink
) {
return false;
} else {
return true;
}
}
}
public function cacheBlockOutput()
{
if ($this->btCacheBlockOutput === null) {
if (!$this->enableExternalFiltering && !$this->paginate) {
$this->btCacheBlockOutput = true;
} else {
$this->btCacheBlockOutput = false;
}
}
return $this->btCacheBlockOutput;
}
}