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 Jul 23, 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 (主题风格样式文件)
下面介绍主题包中的几个文件。
- config.php
- page-zone.phtml
- layout-front.phtml
- block.phtml
- paginator.phtml
- layout-simple.phtml
- layout-admin.phtml
- asset/css/style.css
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>
- 组成
| | | | | | | / module custom render | | content | | ﹨ widget module render | --> block body | | | | | |
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