Ver 5.3.3 からはブロック毎のヘッダー・フッターをテーマファイルで指定できるようになったので
下記のハックは必要無くなりました。
元々のテンプレートを正確に反映するためにはブロック毎にヘッダー・フッター情報を
追加する必要がある。
下記はその為の修正を施した block_view.php のコード。
C5は /libraries/block_view.php に作成すると元のコアファイルを修正することなく
機能を上書できる。
ポイントは 224行目からの switch 文の case 'view': の部分。
237行目~249行目までを追加している。
これによりテンプレート毎に違ったブロック用ヘッダー・フッターを追加することを実現している。
Filename: /libraries/block_view.php
<?php
defined('C5_EXECUTE') or die(_("Access Denied."));
/**
* @package Blocks
* @category Concrete
* @author Andrew Embler <andrew@concrete5.org>
* @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org)
* @license http://www.concrete5.org/license/ MIT License
*
*/
/**
* An Active Record object attached to a particular block. Data is automatically loaded into this object unless the block is too complex.
*
* @package Blocks
* @category Concrete
* @author Andrew Embler <andrew@concrete5.org>
* @category Concrete
* @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org)
* @license http://www.concrete5.org/license/ MIT License
*
*/
class BlockRecord extends ADOdb_Active_Record {
public function __construct($tbl = null) {
if ($tbl) {
$this->_table = $tbl;
parent::__construct($tbl);
}
}
}
/**
* An object corresponding to a particular view of a block. These are those of the "add" state, the block's "edit" state, or the block's "view" state.
*
* @package Blocks
* @author Andrew Embler <andrew@concrete5.org>
* @category Concrete
* @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org)
* @license http://www.concrete5.org/license/ MIT License
*
*/
class BlockView extends View {
protected $block;
private $area;
private $blockObj;
/**
* Includes a file from the core elements directory. Used by the CMS.
* @access private
*/
public function renderElement($element, $args = array()) {
extract($args);
include(DIR_FILES_ELEMENTS_CORE . '/' . $element . '.php');
}
/**
* Creates a URL that can be posted or navigated to that, when done so, will automatically run the corresponding method inside the block's controller.
* <code>
* <a href="<?php echo $this->action('get_results')?>">Get the results</a>
* </code>
* @param string $task
* @param strign $extraParams Adds items onto the end of the query string. Useful for anchor links, etc...
* @return string $url
*/
public function action($task, $extraParams = null) {
try {
if (is_object($this->block)) {
return $this->block->getBlockPassThruAction() . '&method=' . $task . $extraParams;
}
} catch(Exception $e) {}
}
/**
* includes file from the current block directory. Similar to php's include()
* @access public
* @param string $file
* @param array $args
* @return void
*/
public function inc($file, $args = array()) {
extract($args);
$base = $this->getBlockPath($file);
extract($this->controller->getSets());
extract($this->controller->getHelperObjects());
include($base . '/' . $file);
}
/**
* Returns the path to the current block's directory
* @access public
* @return string
*/
public function getBlockPath($filename = null) {
$obj = $this->blockObj;
if ($obj->getPackageID() > 0) {
if (is_dir(DIR_PACKAGES . '/' . $obj->getPackageHandle())) {
$base = DIR_PACKAGES . '/' . $obj->getPackageHandle() . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle();
} else {
$base = DIR_PACKAGES_CORE . '/' . $obj->getPackageHandle() . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle();
}
} else if (file_exists(DIR_FILES_BLOCK_TYPES . '/' . $obj->getBlockTypeHandle() . '/' . $filename)) {
$base = DIR_FILES_BLOCK_TYPES . '/' . $obj->getBlockTypeHandle();
} else {
$base = DIR_FILES_BLOCK_TYPES_CORE . '/' . $obj->getBlockTypeHandle();
}
return $base;
}
/**
* Returns a relative path to the current block's directory. If a filename is specified it will be appended and searched for as well.
* @return string
*/
public function getBlockURL($filename = null) {
$obj = $this->blockObj;
if ($obj->getPackageID() > 0) {
if (is_dir(DIR_PACKAGES_CORE . '/' . $obj->getPackageHandle())) {
$base = ASSETS_URL . '/' . DIRNAME_PACKAGES . '/' . $obj->getPackageHandle() . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle();
} else {
$base = DIR_REL . '/' . DIRNAME_PACKAGES . '/' . $obj->getPackageHandle() . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle();
}
} else if (file_exists(DIR_FILES_BLOCK_TYPES . '/' . $obj->getBlockTypeHandle() . '/' . $filename)) {
$base = DIR_REL . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle();
} else {
$base = ASSETS_URL . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle();
}
return $base;
}
/**
* @access private
*/
public function setAreaObject($a) {
$this->area = $a;
}
/**
* Returns the template used in the block view
*/
public function getTemplate() {
return $this->template;
}
public function setBlockObject($obj) {
$this->blockObj = $obj;
}
/**
* Renders a particular view for a block or a block type
* @param Block | BlockType $obj
* @param string $view
* @param array $args
*/
public function render($obj, $view = 'view', $args = array()) {
if ($this->hasRendered) {
return false;
}
$this->blockObj = $obj;
$customAreaTemplates = array();
if ($obj instanceof BlockType) {
$bt = $obj;
$base = $obj->getBlockTypePath();
} else {
$bFilename = $obj->getBlockFilename();
$b = $obj;
$base = $b->getBlockPath();
$this->block = $b;
$this->c = $b->getBlockCollectionObject();
if ($bFilename == '' && is_object($this->area)) {
$customAreaTemplates = $this->area->getCustomTemplates();
$btHandle = $b->getBlockTypeHandle();
if (isset($customAreaTemplates[$btHandle])) {
$bFilename = $customAreaTemplates[$btHandle];
}
}
}
$btHandle = $obj->getBlockTypeHandle();
Localization::setDomain($base);
if (!isset($this->controller)) {
$this->controller = Loader::controller($obj);
}
if (in_array($view, array('view', 'add', 'edit'))) {
$_action = $view;
} else {
$_action = 'view';
}
$this->controller->setupAndRun($_action);
extract($this->controller->getSets());
extract($this->controller->getHelperObjects());
extract($args);
if ($this->controller->getRenderOverride() != '') {
$_filename = $this->controller->getRenderOverride() . '.php';
}
if ($view == 'scrapbook') {
$template = $this->getBlockPath(FILENAME_BLOCK_VIEW_SCRAPBOOK) . '/' . FILENAME_BLOCK_VIEW_SCRAPBOOK;
if (!file_exists($template)) {
$view = 'view';
}
}
if (!in_array($view, array('view', 'add', 'edit', 'scrapbook'))) {
// then we're trying to render a custom view file, which we'll pass to the bottom functions as $_filename
$_filename = $view . '.php';
$view = 'view';
}
switch($view) {
case 'view':
if (!isset($_filename)) {
$_filename = FILENAME_BLOCK_VIEW;
}
$bvt = new BlockViewTemplate($obj);
if ($bFilename) {
$bvt->setBlockCustomTemplate($bFilename); // this is PROBABLY already set by the method above, but in the case that it's passed by area we have to set it here
} else if ($_filename != FILENAME_BLOCK_VIEW) {
$bvt->setBlockCustomRender($_filename);
}
$template = $bvt->getTemplate();
$txt = Loader::helper('text');
$arHandle =$txt->sanitizeFileSystem($this->area->arHandle);
$v = View::getInstance();
if (file_exists($v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . "/{$arHandle}_block_header.php")) {
$header = $v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . "/{$arHandle}_block_header.php";
} elseif (file_exists($v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . '/block_header.php')){
$header = $v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . '/block_header.php';
}
if (file_exists($v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . "/{$arHandle}_block_footer.php")) {
$footer = $v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . "/{$arHandle}_block_footer.php";
} elseif (file_exists($v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . '/block_footer.php')){
$footer = $v->getThemeDirectory() . '/' . DIRNAME_BLOCK_TEMPLATES . '/block_footer.php';
}
break;
case 'add':
if (!isset($_filename)) {
$_filename = FILENAME_BLOCK_ADD;
}
$header = DIR_FILES_ELEMENTS_CORE . '/block_header_add.php';
$footer = DIR_FILES_ELEMENTS_CORE . '/block_footer_add.php';
break;
case 'edit':
if (!isset($_filename)) {
$_filename = FILENAME_BLOCK_EDIT;
}
$header = DIR_FILES_ELEMENTS_CORE . '/block_header_edit.php';
$footer = DIR_FILES_ELEMENTS_CORE . '/block_footer_edit.php';
break;
}
if (!isset($template)) {
$base = $this->getBlockPath($_filename);
$template = $base . '/' . $_filename;
}
if (isset($header)) {
include($header);
}
if ($template) {
include($template);
}
if (isset($footer)) {
include($footer);
}
$this->template = $template;
$this->header = $header;
$this->footer = $footer;
Localization::reset();
}
}