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

namespace ConcreteCoreTree;

use 
ConcreteCoreFoundationObject;
use 
Core;
use 
Database;
use 
Localization;
use 
GettextTranslations;

abstract class 
Tree extends Object
{
    protected 
$treeNodeSelectedIDs = array();

    abstract protected function 
loadDetails();

    abstract protected function 
deleteDetails();

    
/** Returns the standard name for this tree
     * @return string
     */
    
abstract public function getTreeName();

    
/** Returns the display name for this tree (localized and escaped accordingly to $format)
     * @param  string $format = 'html' Escape the result in html format (if $format is 'html'). If $format is 'text' or any other value, the display name won't be escaped.
     *
     * @return string
     */
    
abstract public function getTreeDisplayName($format 'html');

    abstract public function 
exportDetails(SimpleXMLElement $sx);

    
/**
     * @param SimpleXMLElement $sx
     *
     * @return static|null
     * @abstract
     */
    
public static function importDetails(SimpleXMLElement $sx)
    {
        return 
null;
    }

    public function 
setSelectedTreeNodeIDs($nodeIDs)
    {
        
$this->treeNodeSelectedIDs $nodeIDs;
    }

    public function 
getSelectedTreeNodeIDs()
    {
        return 
$this->treeNodeSelectedIDs;
    }

    public function 
getTreeTypeID()
    {
        return 
$this->treeTypeID;
    }
    public function 
getTreeTypeObject()
    {
        return 
TreeType::getByID($this->treeTypeID);
    }

    public function 
getTreeTypeHandle()
    {
        
$type $this->getTreeTypeObject();
        if (
is_object($type)) {
            return 
$type->getTreeTypeHandle();
        }
    }

    public function 
export(SimpleXMLElement $sx)
    {
        
$treenode $sx->addChild('tree');
        
$treenode->addAttribute('type'$this->getTreeTypeHandle());
        
$this->exportDetails($treenode);
        
$root $this->getRootTreeNodeObject();
        
$root->populateChildren();
        
$root->export($treenode);
    }

    public static function 
exportList(SimpleXMLElement $sx)
    {
        
$trees $sx->addChild('trees');
        
$db Database::connection();
        
$r $db->Execute('select treeID from Trees order by treeID asc');
        while (
$row $r->Fetchrow()) {
            
$tree = static::getByID($row['treeID']);
            
$tree->export($trees);
        }
    }

    public static function 
import(SimpleXMLElement $sx)
    {
        
$type TreeType::getByHandle((string) $sx['type']);
        
$class $type->getTreeTypeClass();
        
$tree call_user_func_array(array($class'importDetails'), array($sx));
        
$parent $tree->getRootTreeNodeObject();
        
$parent->importChildren($sx);
    }

    public function 
getTreeID()
    {
        return 
$this->treeID;
    }

    public function 
getRootTreeNodeObject()
    {
        return 
ConcreteCoreTreeNodeNode::getByID($this->rootTreeNodeID);
    }

    public function 
getRootTreeNodeID()
    {
        return 
$this->rootTreeNodeID;
    }

    
/**
     * Iterates through the segments in the path, to return the node at the proper display. Mostly used for export
     * and import.
     *
     * @param $path
     */
    
public function getNodeByDisplayPath($path)
    {
        
$root $this->getRootTreeNodeObject();

        if (
$path == '/' || !$path) {
            return 
$root;
        }

        
$computedPath '';
        
$tree $this;
        
$walk = function ($node$computedPath) use (&$walk, &$tree, &$path) {
            
$node->populateDirectChildrenOnly();

            if (
$node->getTreeNodeID() != $tree->getRootTreeNodeID()) {
                
$name $node->getTreeNodeName();
                
$computedPath .= '/' $name;
            }

            if (
$computedPath == $path) {
                return 
$node;
            } else {
                
$children $node->getChildNodes();
                foreach (
$children as $child) {
                    
$node $walk($child$computedPath);
                    if (
$node !== null) {
                        return 
$node;
                    }
                }
            }

            return;
        };
        
$node $walk($root$computedPath);

        return 
$node;
    }

    public function 
getRequestData()
    {
        return 
$this->requestData;
    }

    public function 
setRequest($data)
    {
        
$this->requestData $data;
    }

    public function 
delete()
    {
        
$db Database::connection();
        
// delete top level node
        
$node $this->getRootTreeNodeObject();
        if (
is_object($node)) {
            
$node->delete();
        }
        
$this->deleteDetails();
        
$db->Execute('delete from Trees where treeID = ?', array($this->treeID));
    }

    public function 
duplicate()
    {
        
$root $this->getRootTreeNodeObject();
        
$newRoot $root->duplicate();
        
$type $this->getTreeTypeObject();
        
$tree $type->addTree($newRoot);
        
$db Database::connection();
        
$nodes $newRoot->getAllChildNodeIDs();
        foreach (
$nodes as $nodeID) {
            
$db->Execute('update TreeNodes set treeID = ? where treeNodeID = ?', array($tree->getTreeID(), $nodeID));
        }

        return 
$tree;
    }

    public function 
getJSON()
    {
        
$root $this->getRootTreeNodeObject();
        
$root->setTree($this);
        
$root->populateDirectChildrenOnly();
        if (
is_array($this->getSelectedTreeNodeIDs())) {
            foreach (
$this->getSelectedTreeNodeIDs() as $magicNodes) {
                
$root->selectChildrenNodesByID($magicNodes);
            }
        }
        if (
$this->getSelectedTreeNodeIDs() > 0) {
            
$root->selectChildrenNodesByID($this->getSelectedTreeNodeIDs());
        }

        return 
$root->getTreeNodeJSON();
    }

    protected static function 
create(ConcreteCoreTreeNodeNode $rootNode)
    {
        
$db Database::connection();
        
$date Core::make('helper/date')->getOverridableNow();
        
$treeTypeHandle Core::make('helper/text')->uncamelcase(strrchr(get_called_class(), '\'));
        $type = TreeType::getByHandle($treeTypeHandle);
        $db->Execute('
insert into Trees (treeDateAddedrootTreeNodeIDtreeTypeIDvalues (?, ?, ?)', array(
            $date, $rootNode->getTreeNodeID(), $type->getTreeTypeID(),
        ));
        $treeID = $db->Insert_ID();
        $rootNode->setTreeNodeTreeID($treeID);

        return $treeID;
    }

    final public static function getByID($treeID)
    {
        $db = Database::connection();
        $row = $db->GetRow('
select from Trees where treeID = ?', array($treeID));
        if (!empty($row)) {
            $tt = TreeType::getByID($row['
treeTypeID']);
            $class = $tt->getTreeTypeClass();
            $tree = Core::make($class);
            $tree->setPropertiesFromArray($row);
            $tree->loadDetails();

            return $tree;
        }
    }

    /**
     * Export all the translations associates to every trees.
     *
     * @return Translations
     */
    public static function exportTranslations()
    {
        $translations = new Translations();
        $currentLocale = Localization::activeLocale();
        if ($currentLocale !== '
en_US') {
            Localization::changeLocale('
en_US');
        }
        try {
            $db = Database::get();
            $r = $db->Execute('
select treeID from Trees order by treeID asc');
            while ($row = $r->FetchRow()) {
                try {
                    $tree = static::getByID($row['
treeID']);
                } catch (Exception $x) {
                    $tree = null;
                }
                if (isset($tree)) {
                    /* @var $tree Tree */
                    $treeName = $tree->getTreeName();
                    if (is_string($treeName) && ($treeName !== '')) {
                        $translations->insert('
TreeName', $treeName);
                    }
                    $rootNode = $tree->getRootTreeNodeObject();
                    /* @var $rootNode ConcreteCoreTreeNodeNode */
                    if (isset($rootNode)) {
                        $rootNode->exportTranslations($translations);
                    }
                }
            }
        } catch (Exception $x) {
            if ($currentLocale !== '
en_US') {
                Localization::changeLocale($currentLocale);
            }
            throw $x;
        }
        if ($currentLocale !== '
en_US') {
            Localization::changeLocale($currentLocale);
        }

        return $translations;
    }
}
Онлайн: 0
Реклама