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

namespace ConcreteCorePageStack;

use 
Area;
use 
ConcreteCoreMultilingualPageSectionSection;
use 
GlobalArea;
use 
Config;
use 
Database;
use 
Core;
use 
Page;
use 
PageType;

/**
 * Class Stack.
 *
 * @package ConcreteCorePageStack
 */
class Stack extends Page
{
    const 
ST_TYPE_USER_ADDED 0;
    const 
ST_TYPE_GLOBAL_AREA 20;

    const 
MULTILINGUAL_CONTENT_SOURCE_CURRENT 100// in multilingual sites, loads based on current page's locale
    
const MULTILINGUAL_CONTENT_SOURCE_DEFAULT 200// in multilingual sites, loads based on default locale (ignores current)

    /**
     * @param string $type
     *
     * @return int
     */
    
public static function mapImportTextToType($type)
    {
        switch (
$type) {
            case 
'global_area':
                return static::
ST_TYPE_GLOBAL_AREA;
                break;
            default:
                return static::
ST_TYPE_USER_ADDED;
                break;
        }
    }

    
/**
     * @param $stackName
     *
     * @return Stack
     */
    
public static function getOrCreateGlobalArea($stackName)
    {
        
$stack = static::getByName($stackName);
        if (!
$stack) {
            
$stack = static::addStack($stackName, static::ST_TYPE_GLOBAL_AREA);
        }

        return 
$stack;
    }

    
/**
     * @param string $stackName
     * @param string $cvID
     * @param int $multilingualContentSource
     *
     * @return Page
     */
    
public static function getByName($stackName$cvID 'RECENT'$multilingualContentSource self::MULTILINGUAL_CONTENT_SOURCE_CURRENT)
    {
        
$c Page::getCurrentPage();
        if (
is_object($c) && (!$c->isError())) {
            
$identifier sprintf('/stack/name/%s/%s/%s/%s'$stackName$c->getCollectionID(), $cvID$multilingualContentSource);
            
$cache Core::make('cache/request');
            
$item $cache->getItem($identifier);
            if (!
$item->isMiss()) {
                
$cID $item->get();
            } else {
                
$item->lock();
                
$db Database::connection();
                
$ms false;
                
$detector Core::make('multilingual/detector');
                if (
$detector->isEnabled()) {
                    
$ms self::getMultilingualSectionFromType($multilingualContentSource);
                }

                if (
is_object($ms)) {
                    
$cID $db->GetOne('select cID from Stacks where stName = ? and stMultilingualSection = ?', array($stackName$ms->getCollectionID()));
                } else {
                    
$cID $db->GetOne('select cID from Stacks where stName = ?', array($stackName));
                }
                
$item->set($cID);
            }
        } else {
            
$cID Database::connection()->GetOne('select cID from Stacks where stName = ?', array($stackName));
        }

        return 
$cID ? static::getByID($cID$cvID) : false;
    }

    
/**
     * @param int    $cID
     * @param string $cvID
     *
     * @return bool|Page
     */
    
public static function getByID($cID$cvID 'RECENT')
    {
        
$c parent::getByID($cID$cvID);

        if (static::
isValidStack($c)) {
            return 
$c;
        }

        return 
false;
    }

    
/**
     * @param Stack $stack
     *
     * @return bool
     */
    
protected static function isValidStack($stack)
    {
        return 
$stack->getPageTypeHandle() == STACKS_PAGE_TYPE;
    }

    private static function 
addStackToCategory(ConcreteCorePagePage $parent$name$type 0)
    {
        
$data = array();
        
$data['name'] = $name;
        if (!
$name) {
            
$data['name'] = t('No Name');
        }
        
$pagetype PageType::getByHandle(STACKS_PAGE_TYPE);
        
$page $parent->add($pagetype$data);

        
// we have to do this because we need the area to exist before we try and add something to it.
        
Area::getOrCreate($pageSTACKS_AREA_NAME);

        
// finally we add the row to the stacks table
        
$db Database::connection();
        
$stackCID $page->getCollectionID();
        
$v = array($name$stackCID$type);
        
$db->Execute('insert into Stacks (stName, cID, stType) values (?, ?, ?)'$v);

        
$stack = static::getByID($stackCID);

        return 
$stack;
    }

    protected function 
getMultilingualSectionFromType($type)
    {
        
$detector Core::make('multilingual/detector');
        if (
$type == self::MULTILINGUAL_CONTENT_SOURCE_DEFAULT) {
            
$ms Section::getDefaultSection();
        } else {
            
$c Page::getCurrentPage();
            
$ms Section::getBySectionOfSite($c);
            if (!
is_object($ms)) {
                
$ms $detector->getPreferredSection();
            }
        }

        return 
$ms;
    }

    
/**
     * @param string $stackName
     * @param int    $type
     *
     * @return Page
     */
    
public static function addStack($stackName$type 0$multilingualStackToReturn self::MULTILINGUAL_CONTENT_SOURCE_CURRENT)
    {
        
$return false;
        
$db Database::connection();
        if (
Core::make('multilingual/detector')->isEnabled()) {
            
$returnFromSection self::getMultilingualSectionFromType($multilingualStackToReturn);
            
$list Section::getList();
            foreach (
$list as $section) {
                
$cID $db->GetOne('select cID from Stacks where stName = ? and stMultilingualSection = ?', array($stackName$section->getCollectionID()));
                if (!
$cID) {
                    
$category StackCategory::getCategoryFromMultilingualSection($section);
                    if (!
is_object($category)) {
                        
$category StackCategory::createFromMultilingualSection($section);
                    }
                    
$stack self::addStackToCategory($category->getPage(), $stackName$type);
                    if (
is_object($returnFromSection) && $returnFromSection->getCollectionID() == $section->getCollectionID()) {
                        
$return $stack;
                    }
                }
            }
            
StackList::rescanMultilingualStacks();
        } else {
            
$parent Page::getByPath(STACKS_PAGE_PATH);
            
$return self::addStackToCategory($parent$stackName$type);
        }

        return 
$return;
    }

    
/**
     * @param |ConcreteCorePageCollection $nc
     * @param bool $preserveUserID
     *
     * @return Stack
     */
    
public function duplicate($nc null$preserveUserID false)
    {
        if (!
is_object($nc)) {
            
// There is not necessarily need to provide the parent
            // page for the duplicate since for stacks, that is
            // always the same page.
            
$nc Page::getByPath(STACKS_PAGE_PATH);
        }
        
$page parent::duplicate($nc$preserveUserID);

        
// we have to do this because we need the area to exist before we try and add something to it.
        
Area::getOrCreate($pageSTACKS_AREA_NAME);

        
$db Database::connection();
        
$v = array($page->getCollectionName(), $page->getCollectionID(), $this->getStackType());
        
$db->Execute('insert into Stacks (stName, cID, stType) values (?, ?, ?)'$v);

        
// Make sure we return an up-to-date record
        
return static::getByID($page->getCollectionID());
    }

    
/**
     * @return int
     */
    
public function getStackType()
    {
        
$db Database::connection();

        return 
$db->GetOne('select stType from Stacks where cID = ?', array($this->getCollectionID()));
    }

    
/**
     * @param $data
     *
     * @return bool
     */
    
public function update($data)
    {
        if (isset(
$data['stackName'])) {
            
$txt Core::make('helper/text');
            
$data['cName'] = $data['stackName'];
            
$data['cHandle'] = str_replace('-'Config::get('concrete.seo.page_path_separator'), $txt->urlify($data['stackName']));
        }
        
$worked parent::update($data);

        if (isset(
$data['stackName'])) {
            
// Make sure the stack path is always up-to-date after a name change
            
$this->rescanCollectionPath();

            
$db Database::connection();
            
$stackName $data['stackName'];
            
$db->Execute('update Stacks set stName = ? WHERE cID = ?', array($stackName$this->getCollectionID()));
        }

        return 
$worked;
    }

    
/**
     * @return bool
     */
    
public function delete()
    {
        if (
$this->getStackType() == static::ST_TYPE_GLOBAL_AREA) {
            
GlobalArea::deleteByName($this->getStackName());
        }

        
parent::delete();
        
$db Database::connection();

        return 
$db->Execute('delete from Stacks where cID = ?', array($this->getCollectionID()));
    }

    
/**
     * @return string
     */
    
public function getStackName()
    {
        
$db Database::connection();

        return 
$db->GetOne('select stName from Stacks where cID = ?', array($this->getCollectionID()));
    }

    
/**
     * @return bool
     */
    
public function display()
    {
        
$ax Area::get($thisSTACKS_AREA_NAME);
        
$ax->disableControls();
        
$ax->display($this);

        return 
true;
    }

    
/**
     * @param Page $pageNode
     */
    
public function export($pageNode$includePublicDate false)
    {
        
$p $pageNode->addChild('stack');
        
$p->addAttribute('name'Core::make('helper/text')->entities($this->getCollectionName()));
        if (
$this->getStackTypeExportText()) {
            
$p->addAttribute('type'$this->getStackTypeExportText());
        }

        
$db Database::connection();
        
// you shouldn't ever have a sub area in a stack but just in case.
        
$r $db->Execute('select arHandle from Areas where cID = ? and arParentID = 0', array($this->getCollectionID()));
        while (
$row $r->FetchRow()) {
            
$ax Area::get($this$row['arHandle']);
            
$ax->export($p$this);
        }
    }

    
/**
     * @return bool|string
     */
    
public function getStackTypeExportText()
    {
        switch (
$this->getStackType()) {
            case static::
ST_TYPE_GLOBAL_AREA:
                return 
'global_area';
                break;
            default:
                return 
false;
                break;
        }
    }

    public function 
getMultilingualSection()
    {
        
$db Database::connection();
        
$cID $db->GetOne('select stMultilingualSection from Stacks where cID = ?', array($this->getCollectionID()));
        if (
$cID) {
            return 
Section::getByID($cID);
        }
    }

    public function 
updateMultilingualSection(Section $section)
    {
        
$db Database::connection();
        
$db->Execute('update Stacks set stMultilingualSection = ? where cID = ?', array($section->getCollectionID(), $this->getCollectionID()));
    }
}
Онлайн: 1
Реклама