ECJiaWiki:如何快速创建一个App模块

来自ECJiaWiki
跳转至: 导航搜索

第一步:apps目录下面创建应用

例如:创建一个“测试信息管理”的应用模块。(test)

创建应用文件夹

说明:所有app应用模块都在apps目录下,所以需要在该文件夹下创建一个“test”文件夹;

第二步:app应用写入配置文件

增加“test”应用配置:'test' => 'test',

创建应用文件夹

说明:手动创建的应用模块需要在configs目录下app.php文件中进行内置;

第三步:创建菜单文件

1、在“test”应用根目录下创建“apis”文件夹;
2、然后在apis文件夹下面创建该应用的菜单文件:test_admin_menu_api.class.php;
3、文件名称以应用的名称为前缀test_;

创建应用菜单文件

defined('IN_ECJIA') or exit('No permission resources.');
/**
 * ECJIA后台test应用模块菜单
 */
class test_admin_menu_api extends Component_Event_Api {
	public function call(&$options) {
                //一级菜单:需要参数‘菜单动作’,‘菜单名称’,‘无需填写’,‘排序’;
		$menus = ecjia_admin::make_admin_menu('01_test','测试管理', '', 1);
		$submenus = array(
                          //二级菜单:需要参数‘菜单动作’,‘菜单名称’,‘菜单链接’,‘排序’;
		          ecjia_admin::make_admin_menu('01_test_list', '测试列表', RC_Uri::url('test/admin/init'), 1)
                                 ->add_purview(array('test_manage')),//是添加使用该菜单的权限;
		);
        $menus->add_submenu($submenus);
        return $menus;
    }
}

说明:该文件是应用的“菜单”设置文件,可以设置一级和二级菜单;

第四步:创建权限文件

1、然后在apis文件夹下面创建该应用的菜单文件:test_admin_purview_api.class.php;
2、文件名称以应用的名称为前缀test_;

创建应用权限文件

defined('IN_ECJIA') or exit('No permission resources.');
/**
 * test后台权限
 */
class test_admin_purview_api extends Component_Event_Api {
    public function call(&$options) {
        $purviews = array(
            //需要参数(‘动作名称’,‘动作代号’)
            array('action_name' => '测试信息管理', 'action_code' => 'test_manage', 'relevance' => ''),
            array('action_name' => '编辑测试资料', 'action_code' => 'test_update', 'relevance' => ''),
            array('action_name' => '删除测试资料', 'action_code' => 'test_delete', 'relevance' => ''),
        );
        return $purviews;
    }
}

说明:该文件是应用的“权限”设置文件;

该权限文件中的配置项需要和“控制器”中相对应方法中的权限保持一致,后续会详细讲到;

第五步:创建应用核心配置文件

在以上步骤中添加了应用的菜单但是发现后台并未显示,所以需要操作以下步骤即可:

1、在应用根目录下创建一个config文件夹;
2、然后在该文件夹下面创建该应用的核心配置文件:package.cfg.php;

应用核心配置文件

defined('IN_ROYALCMS') or exit('No permission resources.');
/**
 * test模块中心应用
 */
return array(
	'identifier' 	=> 'ecjia.test',
	'directory' 	=> 'test',
	'name'	        => 'test',  
	'description' 	=> 'test_desc',			/* 描述对应的语言项 */
	'author' 	    => 'ECJIA TEAM',		/* 作者 */
	'website' 	    => 'http://www.ecjia.com',	/* 网址 */
	'version' 	    => '1.0.0',			/* 版本号 */
	'copyright' 	=> 'ECJIA Copyright 2014.',
);

说明:该文件是应用的“核心”文件;

创建完之后清楚浏览器和模板缓存,在后台就能看到该应用啦!如下图所示:

成功设置菜单效果

第六步:控制器创建

1、控制器是处理该模块有关逻辑的php文件;
2、一般我们都创建一个默认为“admin”的控制器为该应用的主控制器;当然你可以根据需要的情况以admin_为前缀创建多个控制器。
3、在第三步创建菜单中说道菜单链接也就是和该控制有相呼应的关系;
如下:应用的二级菜单ecjia_admin::make_admin_menu('01_test_list', '测试列表', RC_Uri::url('test/admin/init'),1)->add_purview(array('test_manage')),
RC_Uri::url('test/admin/init')【test:应用名称】 【admin:控制器名称】【init:控制器中方法】
所以当触发该二级菜单,就会请求该控制器中的init方法,在此方法中可以和数据库交互处理相应的逻辑进行;

创建应用文件夹

class admin extends ecjia_admin {
	public function __construct() {//全局
		parent::__construct();
		/* 加载系统中需要的 js和css */
		RC_Script::enqueue_script('jquery-validate');
		RC_Script::enqueue_script('jquery-form');
		RC_Script::enqueue_script('smoke');
		RC_Style::enqueue_style('chosen');
		RC_Script::enqueue_script('jquery-chosen');
		RC_Style::enqueue_style('uniform-aristo');
		RC_Script::enqueue_script('jquery-uniform');
		RC_Style::enqueue_style('bootstrap-editable', RC_Uri::admin_url('statics/lib/x-editable/bootstrap-editable/css/bootstrap-editable.css'));
		RC_Script::enqueue_script('bootstrap-editable.min', RC_Uri::admin_url('statics/lib/x-editable/bootstrap-editable/js/bootstrap-editable.min.js'));
		//模块导航条设置
		ecjia_screen::get_current_screen()->add_nav_here(new admin_nav_here('测试列表', RC_Uri::url('test/admin/init')));
	}

	/**
	 * 测试账号列表
	 */
	public function init() {
		$this->admin_priv('test_manage');//模块权限,必须和第四部中设置的权限相一致;

		ecjia_screen::get_current_screen()->remove_last_nav_here(); //导航条设置
		ecjia_screen::get_current_screen()->add_nav_here(new admin_nav_here('测试列表'));
		
		$this->assign('ur_here', '测试列表'); //页面标题设置
		$this->assign('action_link',	array('text' => '添加测试信息', 'href' => RC_Uri::url('test/admin/add'))); //按钮入口
		
		$test_list = $this->get_test_list();//调用私有方法“get_test_list”,可以在此方法中于数据库交互得到想要的东西,在此可返回;
		$this->assign('test_list', $test_list);//赋值给模板

		$this->display('test_list.dwt');//模板加载(以上返回得到的信息以及请求该方法加载的页面就和该设置有关)
	}

	/**
	 * 私有方法,获取数据库中测试信息列表也就是int方法中$this->get_test_list()调用;
	 */
	private function get_test_list() {
		$db_test = RC_DB::table('test');//加载数据表

	        $db_test->where('code', 'test');//查询条件

		$count = $db_test->count();//计算总数
		$page = new ecjia_page($count, 10, 5);//分页处理
		$data = $db_test
		->selectRaw('id,name,add_time,code')//设置要查询的字段
		->orderby('id', 'asc')//排序
		->take(10)//每页显示条数
		->skip($page->start_id-1)
		->get();
		$res = array();
		if (!empty($data)) {
			foreach ($data as $row) {
				$row['add_time'] = RC_Time::local_date(ecjia::config('time_format'), $row['add_time']);//对时间戳进行处理
				$res[] = $row;
			}
		}
		return array('list' => $res,  'page' => $page->show(2), 'desc' => $page->page_desc());//数组返回所有信息
	}
}

说明:控制器创建好,在此和数据库进行交互处理之后得到信息需要返回到模板中进行查看才是关键;

在init方法中最后是加载相应的模板文件;

第七步:模板创建

1、模板是将控制器处理过得信息很直观展示出来的页面;
2、例如我们刚才在init方法中进行逻辑处理是“查询测试信息列表”;当然你可以根据需要的情况创建其他模板。
3、在上一步控制器创建init方法中最后一步是加载模板文件如下:
   $this->display('test_list.dwt');
   所以我们所创建的模板文件名称必须和此一致;
4、在test应用根目录下创建“templates”文件夹用来储存模板文件;
   然后在创建“admin”文件夹存放平台后台模板,因为也有其他平台的模板文件例如“merchant”商家,所以在此需要区分;

创建模板文件

<?php defined('IN_ECJIA') or exit('No permission resources.');?>//权限判断
<!--{extends file="ecjia.dwt.php"} -->//全局模板加载

<!-- {block name="footer"} -->
<script type="text/javascript">
	ecjia.admin.test.init();//js调用
</script>
<!-- {/block} -->

<!-- {block name="main_content"} -->
<div>
	<h3 class="heading"> 
		<!-- {if $ur_here}{$ur_here}{/if} -->//标题调用
	</h3>
</div>

<div class="row-fluid list-page">
	<div class="span12">
		<table class="table table-striped smpl_tbl table-hide-edit">
                        //列表title
			<thead>
				<tr>
					<th class="w120">测试信息编号</th>
					<th class='w100'>测试信息名称</th>
					<th class="w100">测试信息代号</th>
					<th>添加时间</th>
				</tr>
			</thead>
                        //列表中相对应的值
			<tbody>
				<!-- {foreach from=$test_list.list item=list} -->
				<tr>
					<td>{$list.id}</td>
					<td class="hide-edit-area">
						<div>{$list.name}</div>
                                                //鼠标滑过效果,增加预览功能连接(需要去控制器重增加相应的方法和模板)
						<div class="edit-list">
					          <a class="data-pjax" href='{url path="test/admin/detail" args="id={$list.id}"}'>{t}预览{/t}</a>
						</div>
					</td>
					<td>{$list.code}</td>
					<td>{$list.add_time}</td>
				</tr>
				<!-- {foreachelse} -->
                                //当数据为空时
				<tr>
					<td class="no-records" colspan="4">{lang key='system::system.no_records'}</td>
				</tr>
				<!-- {/foreach} -->
			</tbody>
		</table>
        //分页加载
		<!-- {$test_list.page} --> 
	</div>
</div>
<!-- {/block} -->

效果图:

列表效果图

说明:

1、模板中头部js调用,需要到控制器重全局进行加载;(js和css以及图片都是如此,第九步会说到这些文件存储的目录)

2、模板中列表标题都是直接写入,也可以通过查看步骤八“语言包创建设置”实现中英文切换模式

第八步:语言包创建以及设置使用说明

1、模板以及控制其中都可以进行语言包设置,其次调用来实现中英文模式切换效果;
2、在“test”应用根目录下创建“languages”文件夹;
3、然后再该文件夹下创建“en_US”[存储英文语言包]和“zh_CN”[存储中文语言包];
4、创建语言包文件
①应用描述语言包文件:package.lang.php
②应用语言包test.lang.php  为应用名称+.lang.php

创建应用文件夹

说明:步骤七中并未使用语言包调用,所以无法实现中英文切换模式;

大家可以用根据步骤八创建相应的语言包,然后在模板和控制器重进行调用,就可以完美实现中英文切换模式啦;

语言包使用详细说明请查看:

Ecjia后台RC_Lang使用说明以及语言包升级说明

第九步:JS、CSS和图片存储创建以及调用方法

1、在test应用根目录下创建“statics”文件夹用来储存js,css和图片;
   如下图所示:

js和css以及图片的目录


说明:所有控制器中需要在全局进行加载:

例如:

js和css加载

RC_Script::enqueue_script('test', RC_App::apps_url('statics/js/test.js', __FILE__), array(), false, false);
RC_Style::enqueue_style('test', RC_App::apps_url('statics/css/test.css', __FILE__));

第十步:其他文件创建说明以及与数据库的交互

1、以上九都是创建一个模块必不可少的。
   如果使用类以及接口:

创建应用文件夹

2、RC_DB-数据库之查询构建器

  在控制器怎样快速与数据库交互得到自己想要的数据
  请详细查看: ECJia到家RC_DB-数据库之查询构建器