Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Page/Feed.php
Строк: 464
<?php

namespace ConcreteCorePage;
use 
ConcreteCoreBackupContentExporter;
use 
ConcreteCoreBlockViewBlockView;
use 
ConcreteCoreHttpRequest;
use 
ConcreteCorePermissionAccessEntityGroupEntity;
use 
Database;
/**
 * @Entity
 * @Table(name="PageFeeds")
 */
class Feed
{

    protected 
$itemsPerFeed = 20;
    protected 
$checkPagePermissions = true;

    
/**
     * @Column(type="string")
     */
    
protected $customTopicAttributeKeyHandle = null;


    
/**
     * @Column(columnDefinition="integer unsigned")
     */
    
protected $customTopicTreeNodeID = 0;

    
/**
     * @Column(columnDefinition="integer unsigned")
     */
    
protected $iconFID = 0;

    
/**
     * @return mixed
     */
    
public function getIconFileID()
    {
        return 
$this->iconFID;
    }

    
/**
     * @param mixed $iconFID
     */
    
public function setIconFileID($iconFID)
    {
        
$this->iconFID = $iconFID;
    }

    
/**
     * @param mixed $cParentID
     */
    
public function setParentID($cParentID)
    {
        
$this->cParentID = $cParentID;
    }

    
/**
     * @return mixed
     */
    
public function getParentID()
    {
        return 
$this->cParentID;
    }

    
/**
     * @param mixed $pfDescription
     */
    
public function setDescription($pfDescription)
    {
        
$this->pfDescription = $pfDescription;
    }

    
/**
     * @return mixed
     */
    
public function getDescription()
    {
        return 
$this->pfDescription;
    }

    
/**
     * @param mixed $pfDisplayAliases
     */
    
public function setDisplayAliases($pfDisplayAliases)
    {
        
$this->pfDisplayAliases = $pfDisplayAliases;
    }

    
/**
     * @return mixed
     */
    
public function getDisplayAliases()
    {
        return 
$this->pfDisplayAliases;
    }

    
/**
     * @param mixed $pfDisplayFeaturedOnly
     */
    
public function setDisplayFeaturedOnly($pfDisplayFeaturedOnly)
    {
        
$this->pfDisplayFeaturedOnly = $pfDisplayFeaturedOnly;
    }

    
/**
     * @return mixed
     */
    
public function getDisplayFeaturedOnly()
    {
        return 
$this->pfDisplayFeaturedOnly;
    }

    
/**
     * @return mixed
     */
    
public function getID()
    {
        return 
$this->pfID;
    }

    
/**
     * @param mixed $pfIncludeAllDescendents
     */
    
public function setIncludeAllDescendents($pfIncludeAllDescendents)
    {
        
$this->pfIncludeAllDescendents = $pfIncludeAllDescendents;
    }

    
/**
     * @return mixed
     */
    
public function getIncludeAllDescendents()
    {
        return 
$this->pfIncludeAllDescendents;
    }

    
/**
     * @param mixed $pfTitle
     */
    
public function setTitle($pfTitle)
    {
        
$this->pfTitle = $pfTitle;
    }

    
/**
     * @return mixed
     */
    
public function getTitle()
    {
        return 
$this->pfTitle;
    }

    
/**
     * @return mixed
     */
    
public function getCustomTopicAttributeKeyHandle()
    {
        return 
$this->customTopicAttributeKeyHandle;
    }

    
/**
     * @param mixed $customTopicAttributeKeyHandle
     */
    
public function setCustomTopicAttributeKeyHandle($customTopicAttributeKeyHandle)
    {
        
$this->customTopicAttributeKeyHandle = $customTopicAttributeKeyHandle;
    }

    
/**
     * @return mixed
     */
    
public function getCustomTopicTreeNodeID()
    {
        return 
$this->customTopicTreeNodeID;
    }

    
/**
     * @param mixed $customTopicTreeNodeID
     */
    
public function setCustomTopicTreeNodeID($customTopicTreeNodeID)
    {
        
$this->customTopicTreeNodeID = $customTopicTreeNodeID;
    }

    
/**
     * @param mixed $ptID
     */
    
public function setPageTypeID($ptID)
    {
        
$this->ptID = $ptID;
    }

    
/**
     * @return mixed
     */
    
public function getPageTypeID()
    {
        return 
$this->ptID;
    }

    
/**
     * @Column(type="string")
     */
    
protected $pfDescription;

    
/**
     * @Column(type="string")
     */
    
protected $pfHandle;

    
/**
     * @param mixed $pfHandle
     */
    
public function setHandle($pfHandle)
    {
        
$this->pfHandle = $pfHandle;
    }

    
/**
     * @return mixed
     */
    
public function getHandle()
    {
        return 
$this->pfHandle;
    }

    
/**
     * @Column(type="string")
     */
    
protected $pfTitle;

    
/**
     * @Id @Column(columnDefinition="integer unsigned")
     * @GeneratedValue
     */
    
protected $pfID;

    
/**
     * @Column(columnDefinition="integer unsigned")
     */
    
protected $cParentID;

    
/**
     * @Column(columnDefinition="integer unsigned")
     */
    
protected $ptID;

    
/**
     * @Column(type="boolean")
     */
    
protected $pfIncludeAllDescendents = false;

    
/**
     * @Column(type="boolean")
     */
    
protected $pfDisplayAliases = false;

    
/**
     * @Column(type="string")
     */
    
protected $pfContentToDisplay = 'S'; // short description

    /**
     * @Column(type="string")
     */
    
protected $pfAreaHandleToDisplay;

    public function 
displayShortDescriptionContent()
    {
        
$this->pfContentToDisplay = 'S';
        
$this->pfAreaHandleToDisplay = null;
    }

    public function 
displayAreaContent($arHandle)
    {
        
$this->pfContentToDisplay = 'A';
        
$this->pfAreaHandleToDisplay = $arHandle;
    }

    public function 
getTypeOfContentToDisplay()
    {
        return 
$this->pfContentToDisplay;
    }

    public function 
getAreaHandleToDisplay()
    {
        return 
$this->pfAreaHandleToDisplay;
    }

    public function 
getFeedURL()
    {
        return 
URL::to('/rss/' . $this->getHandle());
    }
    
/**
     * @Column(type="boolean")
     */
    
protected $pfDisplayFeaturedOnly = false;

    public static function 
getList()
    {
        
$db = Database::get();
        
$em = $db->getEntityManager();
        return 
$em->getRepository('ConcreteCorePageFeed')->findBy(array(), array('pfTitle' => 'asc'));
    }

    public function 
save()
    {
        
$db = Database::get();
        
$em = $db->getEntityManager();
        
$em->persist($this);
        
$em->flush();
    }

    public static function 
exportList(SimpleXMLElement $node)
    {
        
$child = $node->addChild('pagefeeds');
        
$list = static::getList();
        foreach(
$list as $feed) {
            
$feedNode = $child->addChild('feed');
            if (
$feed->getParentID()) {
                
$feedNode->addChild('parent', ContentExporter::replacePageWithPlaceHolder($feed->getParentID()));
            }
            
$feedNode->addChild('title', $feed->getTitle());
            
$feedNode->addChild('description', $feed->getDescription());
            
$feedNode->addChild('handle', $feed->getHandle());
            if (
$feed->getIncludeAllDescendents()) {
                
$feedNode->addChild('descendents', 1);
            }
            if (
$feed->getDisplayAliases()) {
                
$feedNode->addChild('aliases', 1);
            }
            if (
$feed->getDisplayFeaturedOnly()) {
                
$feedNode->addChild('featured', 1);
            }
            if (
$feed->getPageTypeID()) {
                
$feedNode->addChild('pagetype', ContentExporter::replacePageTypeWithPlaceHolder($feed->getPageTypeID()));
            }
            if (
$feed->getTypeOfContentToDisplay() == 'S') {
                
$type = $feedNode->addChild('contenttype');
                
$type->addAttribute('type', 'description');
            } else {
                
$area = $feedNode->addChild('contenttype');
                
$area->addAttribute('type', 'area');
                
$area->addAttribute('handle', $feed->getAreaHandleToDisplay());
            }
        }
    }

    public function 
delete()
    {
        
$em = Database::get()->getEntityManager();
        
$em->remove($this);
        
$em->flush();
    }

    public static function 
getByID($id)
    {
        
$db = Database::get();
        
$em = $db->getEntityManager();
        
$r = $em->find('ConcreteCorePageFeed', $id);
        return 
$r;
    }

    public static function 
getByHandle($pfHandle)
    {
        
$db = Database::get();
        
$em = $db->getEntityManager();
        return 
$em->getRepository('ConcreteCorePageFeed')->findOneBy(
            array(
'pfHandle' => $pfHandle)
        );
    }

    public function 
ignorePermissions()
    {
        
$this->checkPagePermissions = false;
    }

    
/**
     * @return ConcreteCorePagePageList
     */
    
public function getPageListObject()
    {
        
$pl = new PageList();
        
$pl->setItemsPerPage($this->itemsPerFeed);
        
$pl->sortByPublicDateDescending();
        if (!
$this->checkPagePermissions) {
            
$pl->ignorePermissions();
        } else {
            
$vp = ConcreteCorePermissionKeyKey::getByHandle('view_page');
            
$guest = Group::getByID(GUEST_GROUP_ID);
            
$access = GroupEntity::getOrCreate($guest);
            
// we set page permissions to be Guest group only, because
            // authentication won't work with RSS feeds
            
$pl->setPermissionsChecker(function($page) use ($vp, $access) {
                
$vp->setPermissionObject($page);
                
$pa = $vp->getPermissionAccessObject($page);
                if (!
is_object($pa)) {
                    return 
false;
                }
                return 
$pa->validateAccessEntities(array($access));
            });
        }
        if (
$this->cParentID) {
            if (
$this->pfIncludeAllDescendents) {
                
$parent = Page::getByID($this->cParentID);
                if (
is_object($parent) && !$parent->isError()) {
                    
$pl->filterByPath($parent->getCollectionPath());
                }
            } else {
                
$pl->filterByParentID($this->cParentID);
            }
        }
        if (
$this->getCustomTopicAttributeKeyHandle()) {
            
$pl->filterByTopic(intval($this->getCustomTopicTreeNodeID()));
        }
        if (
$this->pfDisplayAliases) {
            
$pl->includeAliases();
        }
        if (
$this->ptID) {
            
$pl->filterByPageTypeID($this->ptID);
        }
        if (
$this->pfDisplayFeaturedOnly) {
            
$pl->filterByAttribute('is_featured', true);
        }
        return 
$pl;
    }

    protected function 
getPageFeedContent(Page $p)
    {
        
$content = false;
        switch(
$this->pfContentToDisplay) {
            case 
'S':
                
$content = $p->getCollectionDescription();
                break;
            case 
'A':
                
$a = new Area($this->getAreaHandleToDisplay());
                
$blocks = $a->getAreaBlocksArray($p);
                
$r = Request::getInstance();
                
$r->setCurrentPage($p);
                
ob_start();
                foreach(
$blocks as $b) {
                    
$bv = new BlockView($b);
                    
$bv->render('view');
                }
                
$content = ob_get_contents();
                
ob_end_clean();
                break;
        }

        
$f = $p->getAttribute('thumbnail');
        if (
is_object($f)) {
            
$content = '<p><img src="' . $f->getURL() . '" /></p>' . $content;
        }
        return 
$content;
    }

    public function 
getOutput($request = null)
    {
        
$pl = $this->getPageListObject();
        
$link = false;
        if (
$this->cParentID) {
            
$parent = Page::getByID($this->cParentID);
            
$link = $parent->getCollectionLink();
        } else {
            
$link = URL::to('/');
        }
        
$pagination = $pl->getPagination();
        if (
$pagination->getTotalResults() > 0) {
            
$writer = new ZendFeedWriterFeed();
            
$writer->setTitle($this->getTitle());
            
$writer->setDescription($this->getDescription());
            if (
$this->getIconFileID()) {
                
$f = File::getByID($this->getIconFileID());
                if (
is_object($f)) {
                    
$data = array(
                        
'uri' => $f->getURL(),
                        
'title' => $f->getTitle(),
                        
'link' => (string) $link
                    
);
                    
$writer->setImage($data);
                }
            }
            
$writer->setLink((string) $link);

            foreach(
$pagination->getCurrentPageResults() as $p) {
                
$entry = $writer->createEntry();
                
$entry->setTitle($p->getCollectionName());
                
$entry->setDateCreated(strtotime($p->getCollectionDatePublic()));
                
$content = $this->getPageFeedContent($p);
                if (!
$content) {
                    
$content = t('No Content.');
                }
                
$entry->setDescription($content);
                
$entry->setLink((string) $p->getCollectionLink(true));
                
$writer->addEntry($entry);
            }

            
$ev = new FeedEvent();
            if (isset(
$parent)) {
                
$ev->setPageObject($parent);
            }
            
$ev->setFeedObject($this);
            
$ev->setWriterObject($writer);
            
$ev->setRequest($request);

            
$ev = Events::dispatch('on_page_feed_output', $ev);

            
$writer = $ev->getWriterObject();

            return 
$writer->export('rss');
        }
    }

}
Онлайн: 3
Реклама