这篇文章着重于介绍在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. html

    有目标的学知识才行 要学习html语言,我突然发现我好像可以在markdown文本编辑器中编辑html标签,既然这样我就多玩玩.markdown完全兼容html,这真的是一个好事情.好像也有功能在ma ...

  2. ArcGIS Engine开发之图形查询

    图形查询是以用户通过鼠标操作生成的图形几何体为输入条件进行查询的查询,其查询结果为该几何体空间范围内的所有要素.常用的查询方式包括点选.线选.多边形选择.圆形选择和矩形选择等. 相关类与接口 图像查询 ...

  3. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  4. viewport理解

    viewport预备知识 dpr === dppx dpr:device pixel ratio 设备像素比 dppx:Number of dots per px unit 每像素有多少点 . 1dp ...

  5. 易企秀微场景2016最新完整版V10.5,小编亲测修复众多错误

    易企秀V10.5更新说明1.修复拨号英文错误2.修复转送场景问题3.修复设置场景密码乱码问题4.修复前台批量删除客户图片5.修复数据收集分页问题6.修复图片分类错乱问题7.修复音乐和特效冲突问题8.修 ...

  6. Appfuse:扩展自己的GenericManager

    通过代码生成机制的appfuse访问数据都通过GenericManager来实现,GenericManager默认提供了以下几个方法: package org.appfuse.service; imp ...

  7. jTemplates部分语法介绍

    1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*8==16} good {#else} fail {# ...

  8. PriorityQueue和Queue的一种变体的实现

    队列和优先队列是我们十分熟悉的数据结构.提供了所谓的“先进先出”功能,优先队列则按照某种规则“先进先出”.但是他们都没有提供:“固定大小的队列”和“固定大小的优先队列”的功能. 比如我们要实现:记录按 ...

  9. 无法安装Windows Live“OnCatalogResult:0x80190194”错误的解决方法

    今天想安装一个博客客户端,结果安装一直报错"OnCatalogResult:0x80190194",百度查到了解决发放再此记录下来,以备后用. 到官网下载了一个在线安装程序,可是一 ...

  10. Ubuntu在wps-office等qt5程序下不能切换中文fcitx输入法的问题

    经检查,是缺了fcitx-qt的包.比如qt5的程序,需要一个叫fcitx-libs-qt5的包. 如果您在基于qt的程序下不能使用基于fcitx的中文输入法,请检查以下包是否已安装: sudo ap ...