这篇文章着重于介绍在9.0中如何开发一个插件应用的示例,step by step来了解下在9.0中一个基础的应用包是如何开发的。
1、目录结构
OK,首先是目录结构,下面是一个应用我们推荐的目录。
 
应用包安装目录 src/extensions 应用包将会被安装到这个目录下, 包名和应用别名保持一致。应用目录结构:
------admin    (可选,后台管理模块)
------controller (可选,前台管理模块)
------conf      (配置目录,存储配置信息,数据表安装信息,默认数据信息等,如果这些都没有该目录可选)
------service   (可选,数据服务目录,如果没有核心服务,例如你只输出hello那么该目录可选)
------template  (模板目录,可选)

Manifest.xml     (必须, 应用安装配置文件, 在应用安装包根目录下)
 
 
2、Manifest.xml
在应用包中,Manifest.xml是一个必不可少的文件,它提供了安装的基本信息和配置,应用安装将依据它来进行安装流程,在phpwind9的src/applications/appcenter/conf/Manifest.xml中详细描述了Manifest.xml文件每个配置的说明,这里不再详细展开说明,只是简单介绍下用到的基础配置。

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<application>       
    <name>wind management</name>                 
<!-- 必填 应用名称,将显示在应用列表中 -->       
    <alias>alias</alias>                     
<!-- 必填 不可重复 应用别名,和目录包名保持一致, 用于系统唯一标识该应用,格式为(公司或个人名_英文别名),例如phpwind_bank-->       
    <version>1.0.0</version>                    
 <!-- 必填 应用版本信息 -->       
    <pw-version>0.8.0</pw-version>               
<!-- 必填 支持的PW版本信息,多个版本用逗号分割 -->           
    <description>wind management</description>    <!-- 可选 应用描述信息,将显示在应用列表,用来描述应用特点、案例、使用方式等 -->       
    <charset>UTF-8</charset>                 
<!-- 必填 应用编码信息,标识该应用包的编码类型-->
    <website>http://path/to/homepage</website>      <!-- 可选 应用主页信息-->   
    <author-name></author-name>                
 <!-- 可选 作者名称-->
    <author-email></author-email>        
 <!-- 可选 作者email-->
    <author-icon></author-icon>                    
 <!-- 可选 应用的图标地址-->
</application>

注意上面的alias值,alias是应用包的唯一标识,为了防止应用冲突,我们强烈建议采用(公司或个人名_应用别名)的格式,否则将可能安装失败。
 
3、step by step
(1)创建目录
在src/extensions下新建一个应用文件夹shilong_hello,(即你的alias哦),然后依据上面的目录结构规范在文件夹内创建controller目录、template目录、service目录以及Manifest.xml。在Manifest.xml中填写下应用的基本信息,如下:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<application>
<name>插件教程</name>
 
<!--插件唯一标识,不可重复,建议以(公司/个人名称)_(插件名称)定义  -->
<alias>shilong_hello</alias>
         
<version>1.0</version>
<pw-version>9.0</pw-version>
<type>app</type>
<description>插件教程实例</description>
<charset>utf-8</charset>
<author-name>long.shi</author-name>
<author-email>pw@aliyun-inc.com</author-email>
</application>
     
<!--添加到前台应用-应用中心列表-->
<installation-service>appList</installation-service>
     
</manifest>

以上你可能注意到,我多加了一项配置为<installation-service>appList</installation-service>,它是可选的,作用是将把这个应用添加到前台应用-应用中心列表里。
(2)接下来,研究过windframework的人应该会比较熟悉之后的流程了。
 
a. service 层
在phpwind9.0中提供了丰富的服务接口,在这个例子里,我们想编写自己服务接口,并调用勋章、用户等提供的基本接口。
在service目录里新建一个服务类PwTestService,(服务名称自由定义),编码过程如下:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class PwTestService {
    /**
     * 获取勋章日志
     *
     * @return array
     */
    public function getMedalLogList($page) {
        $logDs = Wekit::load('medal.PwMedalLog');
        list($start, $limit) = Pw::page2limit($page, 5);
        $logs = $logDs->getInfoList(0, 0, 0, $start, $limit);// 调用勋章日志接口
        $status = array(
            '1' => '正在申请',
            '2' => '已申请',
            '3' => '领取了',
            '4' => '领取了'
            );
        $uids = $medalids = array();
        foreach ($logs as $id => ;$v) {
            $uids[$v['uid']] = '';
            $medalids[$v['medal_id']] = '';
        }
         
        //调用用户接口
        $usernames = Wekit::load('user.PwUser')->fetchUserByUid(array_keys($uids));
         
        //调用勋章基本信息接口
        $medals = Wekit::load('medal.PwMedalInfo')->fetchMedalInfo(array_keys($medalids));
         
        //调用勋章服务
        $medalService = Wekit::load('SRV:medal.srv.PwMedalService');
        foreach ($logs as $id => ;$v) {
            $v['status'] = $status[$v['award_status']];
            $v['username'] = $usernames[$v['uid']]['username'];
            $v['medalname'] = $medals[$v['medal_id']]['name'];
            $v['medalpath'] = $medalService->getMedalImage($medals[$v['medal_id']]['path'], $medals[$v['medal_id']]['icon']);
        }
        return $logs;
    }
     
}


b. controller层

在前台模块文件夹controller中新建IndexController类继承基类PwBaseController,并提供一个run()方法。它就是我们前台访问的入口。

复制代码

1
2
3
4
public function run() {
        //待续
 
    }

上面我们编写了自己的服务接口,接下来在run()里我们将调用刚刚编写的服务接口获取数据。

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* (non-PHPdoc)
     * [url=u.php?uid=22279]@see[/url]    WindController::run()
     *
     * 我的应用入口
     */
    public function run() {
        $logs = $this->_loadService()->getMedalLogList(1);
         
        /* 赋予模板中的变量 */
        $this->setOutput($logs, 'logs');
    }
     
    /**
     * 调用自身服务接口,路径为SRC:extensions.{alias}下
     *
     * @return PwTestService
     */
    private function _loadService() {
        return Wekit::load('SRC:extensions.shilong_hello.service.PwTestService');
    }


c. template层

在phpwind9中,默认的模板文件名为controller_action,所以我们在template目录中新建模板文件index_run.htm,即上面的run()这个action将去渲染index_run.htm这个模板文件。你也可以在controller中 调用setTemplate()自定义模板名。编码内容如下:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html>
<head>
<!-- 调用论坛公共头部 -->
<template source='TPL:common.head' load='true' />
<!-- 调用整站css文件 -->
<link rel="stylesheet" href="{[url=u.php?uid=132338]@theme[/url]  :css}/message.css" />
</head>
<body>
<div class="wrap">
<!-- 调用论坛公共头部 -->
<template source='TPL:common.header' load='true' />
    <div class="main_wrap">
        <div class="bread_crumb">
            <a href="{[url=u.php?uid=1848949]@url[/url]  :}" class="home">首页</a><em>></em>插件教程
        </div>
        <div class="main cc">
        <div class="box message_list" id="home_push_list">
        <!-- 调用当前目录的index_list.htm模板文件 -->
        <template source="index_list" />
        </div>
        <div class="more_loading"><a href="#" id="home_push_list_more">查看更多<em class="core_arrow"></em></a></div>
        </div>
    </div>
<!-- 调用全站统一底部文件 -->   
<template source='TPL:common.footer' load='true' />
</div>
 
</body>
</html>


d.  压缩包规范

1.安装包格式是zip
2.安装包最大不能超过10m
3.安装包格式必须为gbk或者utf8。上传后会自动转换为gbk,utf8,big5 3种格式的包
4.安装包内的应用放置路径为:zip->应用包名(如:bank)->应用文件(必须有Manifest文件)
5.添加应用时类型选择了应用,Manifest中的type必须为app进入我们的src/extensions目录,把我们刚刚开发的shilong_hello文件夹打包成zip格式吧。注意上面的d.4说明项,不可在shilong_hello文件夹内打包。
 
至此,一个简单的插件已经成型了,想本地安装测试下吗?进入后台-云平台-应用管理-本地安装中上传我们刚刚的压缩包进行安装,安装前注意先删除原有的src/extensions/shilong_hello文件夹,否则文件夹名冲突,导致安装写入失败。
开发完之后,就可以去应用中心提交应用等待审核了。
预览效果图:

[教程]phpwind9.0应用开发基础教程的更多相关文章

  1. iOS 9音频应用开发基础教程

    iOS 9音频应用开发基础教程(大学霸内部资料)   介绍:iOS 9音频应用开发基础教程(内部资料)是iOS 9音频应用开发专向教程.本书采用Swift 2.0语言开发基于iOS 9的音频应用.实现 ...

  2. iOS 9应用开发基础教程下册

    iOS 9应用开发基础教程下册   介绍: 本教程是国内第一本iOS 9开发应用教程.本教程基于Xcode 7.0,使用Swift 2.0语言讲解如何开发iOS 9的应用App. 学习建议:本教程针对 ...

  3. Xamarin图表开发基础教程(8)OxyPlot框架

    Xamarin图表开发基础教程(8)OxyPlot框架 [示例OxyPlotFormsDemo]在Xamarin.Forms中实现线图的显示. (1)打开Xamarin.Forms项目. (2)将Ox ...

  4. Xamarin图表开发基础教程(6)OxyPlot框架

    Xamarin图表开发基础教程(6)OxyPlot框架 Xamamin iOS中绘制线图OxyPlotiOSDemo [示例OxyPlotiOSDemo]下面将实现线图的显示.具体的操作步骤如下: ( ...

  5. Xamarin图表开发基础教程(4)OxyPlot框架

    Xamarin图表开发基础教程(4)OxyPlot框架 XamaminAndroid中绘制线图OxyPlotAndroidDemo [示例1-1:OxyPlotAndroidDemo]下面实现线图的绘 ...

  6. RPG游戏开发基础教程

    RPG游戏开发基础教程 第一步 下载RPG Maker 开发工具包 1.RPG Maker 是什么? RPG Maker 是由Enterbrain公司推出的RPG制作工具. 中文译名为RPG制作大师. ...

  7. 商业规则引擎IBM WebSphere ILog JRules概述,开发基础教程

    Ilog Jrules开发基础教程有7篇,地址规则引擎Ilog Jrules开发基础教程[连载1]-- 概述篇 概述篇 规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来 ...

  8. Xamarin图表开发基础教程(13)OxyPlot框架支持的其它图表

    Xamarin图表开发基础教程(13)OxyPlot框架支持的其它图表 除了以上提到的图表外,OxyPlot组件还包含了6种类型的其它图表,分别为等高线图.箱线图.饼图.热图.散点图和散点误差图,如图 ...

  9. Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型

    Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型 OxyPlot组件中支持5种类型的金融图表,它们分别为销量图.高低图.股票K线图.股票走势图和旧式股票图,如图1.20~1. ...

随机推荐

  1. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  2. Java面试题整理一(侧重多线程并发)

    1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...

  3. vue.js初级入门之最基础的双向绑定操作

    首先在页面引入vue.js以及其他需要用到的或者可能要用到的插件(这里我多引用了bootstrap和jquery) 引用的时候需要注意文件的路径,准备工作这样基本就完成了,下面正式开始入门. vue. ...

  4. 如何利用BI实现人力资源可视化管理

    随着通信行业改革的不断深化,行业的发展形势和生存环境正发生巨大变化,通信和信息的边界越来越模糊,市场竞争也随之愈演愈烈.近年来,某通讯运营商在业务的转型.网络的转型取得了巨大的突破,但人力资源管理的转 ...

  5. UICollectionViewCell定制Button

    UICollectionViewCell定制Button 效果 特点 1.能够动态设置每行显示的按钮的个数,以及控件的摆放格式 2.实现单选或者多选的功能,实现点击事件 3.自定制按钮的显示样式 用法 ...

  6. Eclipse for Java EE软件操作集锦(二)

    看本文章之前请确保已经了解eclipse建立web工程,如果有疑问请查看本系列文章第一篇 eclipse软件操作集锦(一) 1.我们添加一个servlet 配置一下web.xml测试一下是否能正常显示 ...

  7. Atitit. 项目文档目录大纲 总集合  v2

    Atitit. 项目文档目录大纲 总集合  v2 -----Atitti.原有项目源码的架构,框架,配置与环境说明 v3 q511 -----Atitit.开发环境 与 工具 以及技术框架 以及 注意 ...

  8. redis参考文档

    本文为之前整理的关于redis的文档,放到博客上一份,也方便我以后查阅. redis简介 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统, 通过提供多种键值数据类型来适应不同场景下的缓存 ...

  9. [Python核心编程] 第1章 欢迎来到Python世界

    什么是Python Python的起源 Python的特点 下载Python 安装Python 运行Python Python文档 比较Python 其他实现   1.什么是Python        ...

  10. php在5.5.0默认提供了Zend OPcache

    eaccelerator无法兼容php5.5.0,好在php在5.5.0默认提供了Zend OPcache,所以一直习惯eaccelerator的朋友如果要升级到php5.5.0的话,可能要暂时和ea ...