-
Notifications
You must be signed in to change notification settings - Fork 114
Dev.Front Module File.zh_cn
{module name}/ ├── asset/ │ ├── js/ │ ├── css/ │ │ ├── front.css (模块前台样式) │ │ └── admin.css (模块后台样式) │ ├── image/ ├── config/ │ ├── block.php (模块的区块) │ ├── module.php (模块相关信息) │ ├── navigation.php (模块前台,后台导航) │ ├── page.php (模块页面[admin,front,feed]) ├── locale/ (模块翻译文件) ├── sql/ (模块sql文件) ├── src/ │ ├── Controller / │ │ ├── Admin (后台控制器) │ │ ├── Front (前台控制器) │ ├── Form (模块表单) │ ├── Model (模块模型) │ ├── Installer (模块安装) ├── template/ (翻译文件) │ ├── admin/ (后台模板) │ ├── block/ (区块模板) │ ├── front/ (前台模板)
一个模块的css一般都需要包含2个css文件,一个front.css
,一个admin.css
,为了避免模块样式跟主题样式冲突,模块的css文件名字都必须以模块名开头,如article模块,使用article-{name}。
/* common */; .article-mb { margin-bottom: 5px; } .article-mb-large { margin-bottom: 10px; } .article-hr { height: 0; border-top: 1px dashed #d5d5d5; } ... /* block */; .article-hottopic { } .article-hottopic-p { } .article-hottopic-title { } /* list page */; .article-list-item { } .article-list-title { } .article-list-posttime { } ... /* detail page */; .article-detail-title { } .article-detail-p { } ... /* classify page */ .article-classify-item { } .article-classify-posttime { } /* search page */ .article-search-item { } .article-search-title { } .article-search-time { } //以上命名规范参照这个形式 .{module name}-{page name}-{what} { } .{module name}-{block name}-{what} { }
一般情况下,一个模块的后台不需要写样式,使用默认的bootstrap即可完成任务,如果较复杂的后台则需要按前台规范来写。
/* add page */ .tag-add-btn { } /* list page */ .tag-list-item { } ...
一般情况都使用Backbone来书写js。包括Model
,View
两层即可。
开发模块的时候,先安装模块,然后后续会进行配置的修改,比如增加一个区块,修改导航,更改了配置文件过后,都要在module已安装列表点对应module update操作才能生效,如果是产品模式下,必须要修改了版本号才能update生效。
return array( // Module meta 'meta' => array( // required 'title' => 'DEMO Sandbox', // Description, for admin, optional 'description' => 'Examples and tests for developers.', // Version number, required 'version' => '0.0.0' ), // Author information 'author' => array( // Author full name, required 'name' => 'Taiwen Jiang', // Email address, optional 'email' => '[email protected]', // Website link, optional 'website' => 'http://www.xoopsengine.org', // Credits and aknowledgement, optional 'credits' => 'Zend Framework Team; Pi Engine Team; EEFOCUS Team.' ), // Module dependency: list of module directory names, optional 'dependency' => array( ), // Maintenance actions 'maintenance' => array( 'resource' => array( 'database' => array( 'sqlfile' => 'sql/mysql.sql', 'schema' => array( 'learn' => 'table' ... ) ) ) ) );
创建一个模块需要的表,module.php
配置sqlfile
,这样当安装模块的时候,程序会在安装成功过后执行sql文件里面的语句。schema
则是在模块卸载的时候,需要删除的表(如果模块里已经有数据,注意备份已有的数据)。具体详情参照module-database,这里不具体描述。
return array( 'admin' => array( 'nav1' => array( 'label' => 'nav1', 'route' => 'admin', 'controller' => 'index', 'action' => 'index', 'pages' => array( ) ), 'nav2' => array( 'label' => 'nav2', 'visible' => 0, ... ) ), 'front' => array( 'frontnav1' => array( 'label' => 'frontnav1', 'uri' => 'http://www.eefocus.com/', 'target' => '_blank' ... ), 'frontnav2' => array( 'label' => 'frontnav2', 'route' => 'default', 'controller' => 'test', 'action' => 'test' ... ), ) );
导航分为前后台导航,每个导航可选的属性有label
,route
,controller
,action
,visible
,pages
。模块一旦安装,会在core_navigation_node
生成对应的记录。
前台导航手动渲染: $this->navigation('{module name}-front',array(...))->render()
,其他方法参照navigation。注意:模块前台导航会多一个uri属性,可以直接写成绝对路径。
后台导航是自动在后台渲染,后台导航的作用就是供模块后台管理程序的使用。一旦管理某个模块的时候,程序会自动创建模块导航,但是后台界面上,只会显示一级导航。
- module.php增加配置
'block' => 'block.php'
。 config目录下创建block.php。
return array( 'block-a' => array( 'title' => __('document block a'), // __翻译函数 'description' => __('document block a'), 'render' => array('block', 'blocka'), // param : {class}, {method} 'template' => 'block-a' // template文件名,文件位置是在template/block/ ), 'block-b' => array( 'title' => __('document block b'), 'description' => __('document block b'), 'render' => array('block', 'blockb'), 'template' => 'block-b', 'config' => array( // 后台区块配置 'config1' => array( 'title' => 'config1', 'description' => 'this config description', 'value' => 'value1' ), 'config2' => array( 'title' => 'config2', 'description' => 'this config description', 'edit' => 'checkbox', 'value' => 1 ) ) ) );
区块名字,在模块安装或者更新过后,在表core_block
中的真正的名字是{module name}-{block name}
,也就是说区块真正的名字是模块名+配置里面的名字。
区块可配置, 一旦区块多了config
属性,便可以在后台setting->block->{module name}->edit
进行配置编辑。
2. src目录下创建Block.php (区块程序)
namespace Module\{module Name}; class Block { public static function blocka($options = array(), $module = null) { /* options可以通过后台设置,这里获取 */ $block = array( 'caption' => __('Block A'), 'content' => "content render by $module", 'options' => $options, ); return $block; } public static function blockb($options = array(), $module = null) { ... } }
- template/block目录下创建block-a.phtml。
//根据这个值,进行html代码的书写。 <?php d($block); ?> <h3><?php echo $block['content']; ?></h3>
- 区块创建好了,如何应用到页面上呢?
- 通过php方法在页面中输出:
echo $this->widget('{block name}')
。 - 通过dress up拖拽到指定页面中去。
- 通过php方法在页面中输出:
模块后台参数配置,module.php增加配置'config' => 'config.php'
以下展示一个程序流程:
- 在src下创建
Controller/Admin
,Controller/Front
- 以Front为例,创建
IndexController
namespace Module\{module name}\Controller\Front; use Pi; use Pi\Mvc\Controller\ActionController; class IndexController extends ActionController { public function indexAction() { $title = 'test'; $this->view()->assign(array( 'title' => $title )); /* 如果模板的文件名字是对应{controller}-{action}的话,则可以去掉这段代码 */ $this->view()->setTemplate('index-index'); } }
一旦这个方法写好后,客户端请求{site}/{module name}/{controller}/{action}
这个url,就能请求到这个方法。
- controller写好后,就是view渲染了,创建
template/front/{controller}-{action}.phtml
模板。
<!-- 加载当前模块的css --> <?php $this->css($this->assetModule('front.css')); ?> <!-- 模板html --> <h2><?php echo $title; ?></h2>
最后访问{site}/{module name}/{controller}/{action}就能看到这个页面