Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Page/Type/Composer/Control/BlockControl.php
Строк: 308
<?php
namespace ConcreteCorePageTypeComposerControl;

use 
ConcreteCoreBlockViewBlockView;
use 
Loader;
use 
ConcreteCoreFoundationObject;
use 
Controller;
use 
Package;
use 
Block;
use 
BlockType;
use 
Environment;
use 
Page;
use 
Area;
use 
PageTemplate;
use 
ConcreteCorePageTypeComposerFormLayoutSet as PageTypeComposerFormLayoutSet;

class 
BlockControl extends Control
{

    protected 
$btID;
    protected 
$ptComposerControlTypeHandle = 'block';
    protected 
$bt = false;
    protected 
$b = false;
    protected 
$controller;

    public function 
setBlockTypeID($btID)
    {
        
$this->btID = $btID;
        
$this->setPageTypeComposerControlIdentifier($btID);
    }

    public function 
getBlockTypeID()
    {
        return 
$this->btID;
    }

    public function 
export($node)
    {
        
$bt = $this->getBlockTypeObject();
        
$node->addAttribute('handle', $bt->getBlockTypeHandle());
    }

    public function 
shouldPageTypeComposerControlStripEmptyValuesFromPage()
    {
        return 
true;
    }

    public function 
removePageTypeComposerControlFromPage()
    {
        
$b = $this->getPageTypeComposerControlBlockObject($this->page);
        
$b->deleteBlock();
    }

    public function 
getPageTypeComposerControlBlockObject(Page $c)
    {
        
$db = Loader::db();
        if (!
is_object($this->b)) {
            
$setControl = $this->getPageTypeComposerFormLayoutSetControlObject();
            
$r = $db->GetRow(
                
$q = 'select cdb.bID, cdb.arHandle from PageTypeComposerOutputBlocks cdb inner join CollectionVersionBlocks cvb on (cdb.bID = cvb.bID and cvb.cID = cdb.cID and cvb.cvID = ?) where cdb.ptComposerFormLayoutSetControlID = ? and cdb.cID = ?',
                array(
                    
$c->getVersionID(),
                    
$setControl->getPageTypeComposerFormLayoutSetControlID(),
                    
$c->getCollectionID()
                )
            );
            if (!
$r['bID']) {
                
// this is the first run. so we look for the proxy block.
                
$pt = PageTemplate::getByID($c->getPageTemplateID());
                
$outputControl = $setControl->getPageTypeComposerOutputControlObject($pt);
                if (
is_object($outputControl)) {
                    
$cm = $c->getPageTypeObject();
                    
$mc = $cm->getPageTypePageTemplateDefaultPageObject($pt);
                    
$r = $db->GetRow(
                        
'select bco.bID, cvb.arHandle from btCorePageTypeComposerControlOutput bco inner join CollectionVersionBlocks cvb on cvb.bID = bco.bID where ptComposerOutputControlID = ? and cvb.cID = ?',
                        array(
                            
$outputControl->getPageTypeComposerOutputControlID(),
                            
$mc->getCollectionID()
                        )
                    );
                }
            }
            if (
$r['bID']) {
                
$b = Block::getByID($r['bID'], $c, $r['arHandle']);
                
$this->setPageTypeComposerControlBlockObject($b);
                return 
$this->b;
            }
        }
        return 
$this->b;
    }

    public function 
setPageTypeComposerControlBlockObject($b)
    {
        
$this->b = $b;
    }

    public function 
getBlockTypeObject()
    {
        if (!
is_object($this->bt)) {
            
$this->bt = BlockType::getByID($this->btID);
        }
        return 
$this->bt;
    }

    public function 
getPageTypeComposerControlPageNameValue(Page $dc)
    {
        if (
is_object($this->b)) {
            
$controller = $this->b->getController();
            return 
$controller->getPageTypeComposerControlPageNameValue();
        }
    }

    public function 
canPageTypeComposerControlSetPageName()
    {
        
$bt = $this->getBlockTypeObject();
        
$controller = $bt->getController();
        if (
method_exists($controller, 'getPageTypeComposerControlPageNameValue')) {
            return 
true;
        }
        return 
false;
    }

    public function 
isPageTypeComposerControlValueEmpty()
    {
        
$bt = $this->getBlockTypeObject();
        
$controller = $bt->getController();
        if (
method_exists($controller, 'isPageTypeComposerControlValueEmpty')) {
            
$bx = $this->getPageTypeComposerControlBlockObject($this->page);
            if (
is_object($bx)) {
                
$controller = $bx->getController();
                return 
$controller->isPageTypeComposerControlValueEmpty();
            }
        }
        return 
false;
    }

    public function 
pageTypeComposerFormControlSupportsValidation()
    {
        
$bt = $this->getBlockTypeObject();
        
$controller = $bt->getController();
        if (
method_exists($controller, 'validate_composer')) {
            return 
true;
        }
        return 
false;
    }

    public function 
addAssetsToRequest(Controller $cnt)
    {
        
$bt = $this->getBlockTypeObject();
        
$controller = $bt->getController();
        
$controller->setupAndRun('composer');
    }


    public function 
getPageTypeComposerControlCustomTemplates()
    {
        
$bt = $this->getBlockTypeObject();
        
$txt = Loader::helper('text');
        
$templates = array();
        if (
is_object($bt)) {
            
$blocktemplates = $bt->getBlockTypeComposerTemplates();
            if (
is_array($blocktemplates)) {
                foreach (
$blocktemplates as $tpl) {
                    if (
strpos($tpl, '.') !== false) {
                        
$name = substr($txt->unhandle($tpl), 0, strrpos($tpl, '.'));
                    } else {
                        
$name = $txt->unhandle($tpl);
                    }
                    
$templates[] = new CustomTemplate($tpl, $name);
                }
            }
        }
        return 
$templates;
    }

    public function 
addToPageTypeComposerFormLayoutSet(PageTypeComposerFormLayoutSet $set, $import = false)
    {
        
$layoutSetControl = parent::addToPageTypeComposerFormLayoutSet($set, $import);
        
$pagetype = $set->getPageTypeObject();
        
$pagetype->rescanPageTypeComposerOutputControlObjects();
        return 
$layoutSetControl;
    }

    protected function 
getController($obj)
    {
        if (!isset(
$this->controller)) {
            
$this->controller = $obj->getController();
            
$this->controller->setupAndRun('composer');
        }
        return 
$this->controller;
    }

    public function 
render($label, $customTemplate, $description)
    {
        
$obj = $this->getPageTypeComposerControlDraftValue();
        if (!
is_object($obj)) {
            if (
$this->page) {
                
// we HAVE a page, but we don't have a block object, which means something has gone wrong.
                // we've lost the association. So we abort.
                
Loader::element('page_types/composer/controls/invalid_block');
                return;
            }
            
$obj = $this->getBlockTypeObject();
        }

        
$this->getController($obj);

        
$env = Environment::get();
        
$form = Loader::helper('form');
        
$set = $this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerFormLayoutSetObject();

        if (
$customTemplate) {
            
$rec = $env->getRecord(
                
DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle(
                ) . 
'/' . DIRNAME_BLOCK_TEMPLATES_COMPOSER . '/' . $customTemplate
            
);
            if (
$rec->exists()) {
                
$template = DIRNAME_BLOCK_TEMPLATES_COMPOSER . '/' . $customTemplate;
            }
        }

        if (!isset(
$template)) {
            
$template = FILENAME_BLOCK_COMPOSER;
        }

        
$this->inc($template, array('control' => $this, 'obj' => $obj, 'description' => $description));
    }

    public function 
action($task)
    {
        
$obj = $this->getPageTypeComposerControlDraftValue();
        if (!
is_object($obj)) {
            
// we don't have a page, an area, or ANYTHING YET.
            
$arguments = array('/ccm/system/block/action/add_composer',
                
$this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerFormLayoutSetControlID(),
                
$task
            
);
            return 
call_user_func_array(array('URL', 'to'), $arguments);
        } else {
            
$area = $obj->getBlockAreaObject();
            
$c = $area->getAreaCollectionObject();
            
$arguments = array('/ccm/system/block/action/edit_composer',
                
$c->getCollectionID(),
                
urlencode($area->getAreaHandle()),
                
$this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerFormLayoutSetControlID(),
                
$task
            
);
            return 
call_user_func_array(array('URL', 'to'), $arguments);
        }
    }

    public function 
inc($file, $args = array())
    {
        
extract($args);
        if (!isset(
$obj)) {
            
$obj = $this->getPageTypeComposerControlDraftValue();
            if (!
is_object($obj)) {
                
$obj = $this->getBlockTypeObject();
            }
        }

        
$controller = $this->getController($obj);

        
extract($controller->getSets());
        
extract($controller->getHelperObjects());
        
$label = $this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerControlDisplayLabel();
        
$env = Environment::get();


        
$pkg = false;
        if (
$obj->getPackageID() > 0) {
            
$pkg = Package::getByID($obj->getPackageID());
        }

        
$view = $this;

        
$path = $env->getPath(DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle() . '/' . $file, $pkg);
        include(
$path);
    }

    public function 
getPageTypeComposerControlDraftValue()
    {
        if (
is_object($this->page)) {
            return 
$this->getPageTypeComposerControlBlockObject($this->page);
        }
    }

    public function 
publishToPage(Page $c, $data, $controls)
    {
        
// for blocks, we need to also grab their output
        
$bt = $this->getBlockTypeObject();
        
$pt = PageTemplate::getByID($c->getPageTemplateID());
        
$setControl = $this->getPageTypeComposerFormLayoutSetControlObject();

        
$b = $this->getPageTypeComposerControlBlockObject($c);
        if (!
is_object($b)) {
            return;
        }

        
// delete the block that this set control has placed on this version, because
        // we are going to replace it with a new one.
        
$db = Loader::db();
        
$q = 'select cvb.arHandle, cdb.bID, cdb.cbDisplayOrder from PageTypeComposerOutputBlocks cdb inner join CollectionVersionBlocks cvb on (cdb.bID = cvb.bID and cvb.cID = cdb.cID and cvb.cvID = ?) where cdb.ptComposerFormLayoutSetControlID = ? and cdb.cID = ?';
        
$v = array($c->getVersionID(), $setControl->getPageTypeComposerFormLayoutSetControlID(), $c->getCollectionID());
        
$row = $db->GetRow($q, $v);
        if (
$row['bID'] && $row['arHandle']) {
            
$db->Execute(
                
'delete from PageTypeComposerOutputBlocks where ptComposerFormLayoutSetControlID = ? and cID = ?',
                array(
$setControl->getPageTypeComposerFormLayoutSetControlID(), $c->getCollectionID())
            );
        }

        
$arHandle = $b->getAreaHandle();
        
$blockDisplayOrder = $b->getBlockDisplayOrder();
        
$bFilename = $b->getBlockFilename();
        
$b->deleteBlock();
        
$ax = Area::getOrCreate($c, $arHandle);
        
$b = $c->addBlock($bt, $ax, $data);
        
$this->setPageTypeComposerControlBlockObject($b);
        
$b->setAbsoluteBlockDisplayOrder($blockDisplayOrder);
        if (
$bFilename) {
            
$b->setCustomTemplate($bFilename);
        }

        
// make a reference to the new block
        
$this->recordPageTypeComposerOutputBlock($b);
    }

    public function 
recordPageTypeComposerOutputBlock(ConcreteCoreBlockBlock $block)
    {
        
$db = Loader::db();
        
$setControl = $this->getPageTypeComposerFormLayoutSetControlObject();
        
$db->Execute(
            
'insert into PageTypeComposerOutputBlocks (cID, arHandle, ptComposerFormLayoutSetControlID, cbDisplayOrder, bID) values (?, ?, ?, ?, ?)',
            array(
                
$block->getBlockCollectionID(),
                
$block->getAreaHandle(),
                
$setControl->getPageTypeComposerFormLayoutSetControlID(),
                
$block->getBlockDisplayOrder(),
                
$block->getBlockID()
            )
        );
    }

    public function 
validate()
    {
        
$b = $this->getPageTypeComposerControlBlockObject($this->page);
        if (
is_object($b)) {
            
$controller = $b->getController();
            if (
method_exists($controller, 'validate_composer')) {
                
$e1 = $controller->validate_composer();
            }
            if (
is_object($e1)) {
                return 
$e1;
            }
        }
    }


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