forked from pi-engine/pi
-
Notifications
You must be signed in to change notification settings - Fork 0
Dev.Front Theme File.zh_cn
lavenderli edited this page Aug 7, 2013
·
11 revisions
主题包主要包含asset、template、locale、module、config.php,目录结构如下:
{theme name}/ ├── asset/ (资源文件) │ ├── css/ │ ├── image/ │ ├── js/ │ └── locale/ ├── locale/ (翻译文件) │ ├── en/ │ └── zh-cn/ ├── module/ (模块主题文件) ├── template/ (模板文件) └── config.php (主题配置文件)
对于一个主题包,至少要包含以下文件。
template/layout-front.phtml (区块功能,配合后台实现拖拽功能) template/layout-simple.phtml (只有模块内容,没有区块功能) template/layout-style.phtml (带有样式的简单内容输出模板) template/layout-content.phtml (不带样式的简单内容输出模板) template/paginator.phtml (分页显示模板) template/error.phtml (错误模板) template/error-404.phtml (404模板) template/error-denied.phtml (拒绝访问模板) asset/css/style.css (主题风格样式文件)
下面具体介绍主题包中的部分文件。
<? php
return array(
// 版本号
'version' => '0.0.0',
// 当前主题类型(front/admin/both)
'type' => 'front',
// 主题标题
'title' => 'PI Theme',
// 作者信息
'author' => 'Taiwen Jiang',
//截图,相对于asset路径。如果注释掉这段代码,使用系统默认的static/image/screenshot.png
'screenshot' => 'image/screenshot.png',
// License or theme images and scripts
'license' => 'Creative Common License http://creativecommons.org/licenses/by/3.0/',
// 描述
'description' => 'PI Engine official theme',
//指定当前主题继承哪个主题,实现模板的继承,比如(err-404,err-exception, paginator模板继承)
//当一个系统下建了多个主题,很有用。默认值为当前主题。
//可以注释掉这个属性。
'parent' => '{theme name}',
//描述浏览器兼容性
'browser' => 'Internet Explorer: 6+; Chrome: 17+; Firefox: 10+; Safari: 5.1+; Opera: 9.8+;'
);
<table>
<tr>
<td>{1}</td>
<td>
<table>
<tr>
<td colspan="2">{2}</td>
</tr>
<tr>
<td>{3}</td>
<td>{4}</td>
</tr>
<tr>
<td colspan="2">{content}</td>
</tr>
<tr>
<td>{5}</td>
<td>{6}</td>
</tr>
</table></td>
<td>{7}</td>
</tr>
<tr>
<td colspan="3">{8}</td>
</tr>
</table>
- 作用:后台操作
setting --> pages --> dress up
,前台根据它写layout-front模板代码。选择一个front页面进行dress up,程序通过Controller Action找到对应的页面就行页面拖拽。注意:只有前台页面能进行dress up。 - 原理:利用table布局,实现一个主题下的layout,后台操作读取这个layout,进行拖拽操作。
- 标识:{num}和{content}分别代表区块区域和模块区域,一个区块区域可放1个或者多个区块或者没有区块。
- 实践:可以调整区域位置和模块区域的位置,修改这个文件后,后台读取这个文件重新生成布局。注意:一个主题下面的layout-front和page-zone.phtml需要对应上。 根据以上page-zone模板代码,实际产生的后台效果
<?php
<!-- load translate file -->
$this->i18nTheme('main');
<!-- load theme css -->
$this->css($this->assetTheme('css/style.css'), 'prepend');
?>
<!DOCTYPE HTML>
<html lang="<?php echo $locale; ?>">
<head>
<!-- Charset -->
<meta charset="<?php echo $charset; ?>">
</head>
<body id="pi-<?php echo Pi::service('module')->current(); ?>" class="<?php echo $locale; ?>">
<!-- header -->
<div class="header">
</div>
<!-- naviagtion -->
<div class="container nav">
<?php
$navigation = $this->nav('front');
echo $navigation->menu();
?>
</div>
<?php
/* breadcrumbs */
$breadcrumbs = $navigation->breadcrumbs()->setSeparator('>')->render();
if ($breadcrumbs) {
echo "<div class='breadcrumb'>$breadcrumbs</div>";
}
?>
<!-- page content -->
<?php
$blocks = $this->blocks();
?>
<div class="container">
<div class="row">
<?php if (isset($blocks['1'])) {?>
<div class="pi-zone-1">
<?php foreach ($blocks['1'] as $key => $block) {
include 'block.phtml';
} ?>
</div>
<?php } ?>
<div>
<?php if(isset($blocks['2'])) { ?>
<div class="pi-zone-2">
<?php foreach ($blocks['2'] as $key => $block) {
include 'block.phtml';
} ?>
</div>
<?php } ?>
<?php if(isset($blocks['3'])) { ?>
<div class="pi-zone-3">
<?php foreach ($blocks['3'] as $key => $block) {
include 'block.phtml';
} ?>
</div>
<?php } ?>
<?php if (isset($blocks['4'])) { ?>
<div class="pi-zone-4">
<?php foreach ($blocks['4'] as $key => $block) {
include 'block.phtml';
} ?>
</div>
<?php } ?>
</div>
</div>
</div>
...
<!-- footer -->
<div class="container footer">
</div>
</body>
</html>
- 组成
- 顶部
- 导航
- 菜单
- 面包屑
- 页面内容
- 模块内容
- 区块内容
- 底部
- 程序
- 顶部一般在一个主题下是写死的,静态html。
- 导航
- 菜单
- 代码:
$navigation = $this->nav('front')
,echo $navigation->menu()
- 后台操作:
operation->system->navigation
,导航可维护。
- 代码:
- 面包屑:
$navigation->breadcrumbs()
,后台控制,前台判断是否输出,有则输出,没有就不输出。
- 菜单
- 页面内容
- 模块
- 后台ControllerAction控制程序
$this->view()->setTemplate({name})
设定模块前台模板,模块模板文件路径:{module name}/template/front/{controller}-{action}.phtml
,如果模块的模板名字是{controller}-{action}.phtml规范的话,则可以不用调用setTemplate这个方法,程序自动去调用指定的模块。 - 模块程序通过
$this->view()->assign(array('title' => $title))
给模板设置值,前台模板就可以调用$title这个变量,调试这个变量使用d($title);
。 - 最后模块的这个模板就生成了模块内容。
- 后台ControllerAction控制程序
- 区块
- 代码:
$blocks = $this->blocks();
$blocks就是这个页面所有的区块数组。 - 模板路径:
{theme name}/template/block.phtml
,通过循环$blocks,block.phmtl每次引入,区块模板里面的$block变量就能读出当前区块的数据,并渲染内容。
- 代码:
- 拖拽 (dress up)
- 后台:
Setting->page->{module}->dress up
- 如果没有找到相应的页面的话,可以通过新增页面,输入ControllerAction指定需要拖拽控制的页面。
- 后台:
- 模块
- 底部一般写死,静态html,当然如果想动态维护,可以做成静态区块。
<div id="block-<?php echo $block['name']; ?>" class="block">
<div class="block-header">
<?php if ($block['subline']) { ?>
<div class="block-header-subline"></div>
<?php } ?>
<h4 class="block-header-title"><?php echo $block['title']; ?></h4>
<div>
<div class="block-body">
<?php echo $block['content']; ?>
</div>
</div>
- 组成
<!-- Block structure --> ---------------------------------------------- | title subline1,subline2 | --> block header ---------------------------------------------- | | | | | | | / module custom render | | content | | ﹨ widget module render | --> block body | | | | | | -----------------------------------------------
- 代码:区块模板代码,在不同的主题下可以进行定制,可以根据项目需求,实现不同的区块。
- 多个:一个主题可同时存在多个block模板,如
block-noheader.phtml
,block-tab.phtml
,然后针对不同的区域引用不同的区块模板,以实现样式多样性。
<?php if(isset($blocks['2'])) { ?>
<div class="pi-zone-2">
<?php foreach ($blocks['2'] as $key => $block) {
include 'block.phtml';
} ?>
</div>
<?php } ?>
<?php if(isset($blocks['3'])) { ?>
<div class="pi-zone-3">
<?php foreach ($blocks['3'] as $key => $block) {
include 'block-noheader.phtml';
} ?>
</div>
<?php } ?>
<?php if ($this->pageCount <= 1) { return; } ?>
<div class="pagination<?php if (!empty($class)) { echo ' ' . $class; } ?>">
<ul>
<!-- First page link -->
<?php if ($this->previous) { ?>
<li><a href="<?php echo $this->first->url; ?>"><?php _e('First'); ?></a>
<?php } ?>
<!-- Previous page link -->
<?php if ($this->previous) { ?>
<li><a href="<?php echo $this->previous->url; ?>"><?php _e('< Previous'); ?></a>
<?php } ?>
<!-- Numbered page links -->
<?php foreach ($this->pagesInRange as $page): ?>
<li class="<?php echo ($page->number == $this->current) ? 'active' : ''; ?>">
<a href="<?php echo $page->url; ?>"><?php echo $page->number; ?></a>
<?php endforeach; ?>
<!-- Next page link -->
<?php if ($this->next) { ?>
<li><a href="<?php echo $this->next->url; ?>"><?php _e('Next >'); ?></a>
<?php } ?>
<!-- Last page link -->
<?php if ($this->next) { ?>
<li><a href="<?php echo $this->last->url; ?>"><?php _e('Last1'); ?></a>
<?php } ?>
</ul>
</div>
引用: $this->paginationControl($paginator, 'sliding', 'paginator.phtml', array('class' => 'pagination-centered'))
第四个参数,可以不传,传了的话,就是给模板赋值一个类。
如果一个页面不需要拖拽功能,或者说没有区块概念,后台程序$this->view()->setLayout('layout-simple')
设置layout模板
提示:可以使用以下代码控制在不同模式下生成不同的模板内容。例如,网站实际使用过程中不需要输出详细的错误信息,但调试时会需要这些信息,使用如下代码则可以在两种模式之间切换。
<div> production </div>
<?php if ('production' == Pi::environment()) return; ?>
<div> development... </div>
一般开发者开发的都是前台主题,如果后台主题想定制,可以增加这个模板,然后在后台设置。
每个主题必须有个样式文件,控制一个主题下的风格。详细介绍参照css