Вход Регистрация
Файл: 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;
    }

    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), 0strrpos($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;
            }
        }
    }


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