第十四课 感谢

最后更新于:2022-04-01 20:42:26

##感谢 首先感谢同事 **bobball** 的辛苦编写,一直做项目开发,长期没有做这种文章编写,写起来还是有一定难度的,为了要表达清晰,简单明了,不要太过于技术描述累赘,让一些读者看了感觉太枯燥而达不到效果。相信我的同事也是使出蛮荒之力了,呵呵~~~(开个玩笑)如果大家喜欢,可以关注我们公众号或者加入我们的QQ交流群! >[info]感谢看云提供这么好的平台给技术人员互相交流 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-04-02_551cacc9d213c.jpg) >[info][看云官网](http://www.kancloud.cn/explore) : http://www.kancloud.cn #### 看云`KanCloud`的愿景是做国内最专业的技术文档/书籍和用户手册的写作、电子出版、阅读和托管平台,致力于提供最佳的在线文档创作和阅读体验,企业版可用于构建企业的文档中心和知识库。 >[warning]感谢 iWebShop 开源电子商务产品,为电商助力 ![](http://www.aircheng.com/images/logo/logo.png) >[info][iWebshop官网](http://www.aircheng.com) : http://www.aircheng.com #### `iWebShop` 是一款基于【PHP 语言】+【MYSQL 数据库】开发的开源 WEB 电商 B2B2C系统(平台自营+商家入驻)。 >[success]感谢八叔模板堂提供本书封面设计,同时提供 iWebShop 模板和定制化开发服务 ![](http://www.8sk.cn/Yourphp/Tpl/Home/Default/Public/images/logo.png) >[info][八叔模板堂官网](http://www.8sk.cn) : http://www.8sk.cn ####八叔模板堂由深圳市晟艺互动传媒有限公司创建于2015年,深圳市晟艺互动传媒有限公司是一家连续10年为中国互联网用户提供服务的运营商,作为Iwebshop业内最大的一家电子商务服务运营商,长期专注于为企业提供Iwebshop高端定制、Iwebshop手机模板定制、Iwebshop网店模板制作,真正为客户提供”一站式”全网营销解决方案。 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 ![](http://www.sunzoon.com/templates/main/images/sz_logo.png) >[info][三众科技官网](http://www.sunzoon.com) : http://www.sunzoon.com [三众简悦官网](http://it.sunzoon.com) : http://it.sunzoon.com 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第十三课 插件开发–增加文章评论

最后更新于:2022-04-01 20:42:23

>[danger]上节课我们讲了如何开发插件,这一节课我们用一个实例来讲解如何开发一个评论插件 有些做过其他系统的插件开发的同学,再来学iWebShop的插件开发,很容易就上手,有些也可能发现iWebShop插件开发时,对前端页面的控制目前支持得还不是很灵活。因此,我做这个评论插件,我就采用以下方法开发: 后端维护的功能,用插件实现,前端评论,使用我们之前学的模板开发的方式来做 ## 一、建立插件 在插件目录下增加“comment”目录,创建如下三个文件: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160819193459.png) comment.php中加入以下代码: ~~~ class comment extends pluginBase{ //【必填】插件中文名称 public static function name() { return "三众科技评论插件"; } //【必填】插件的功能简介 public static function description() { return "文章评论插件"; } //安装插件代码 public static function install() { $commentDB = new IModel('article_comment');//表名article_comment //判断表是否存在 if($commentDB->exists()) { return true; } $data = array( "comment" => self::name(), "column" => array( "id" => array("type" => "int(11) unsigned",'auto_increment' => 1), "content" => array("type" => "text","comment" => "评论内容"), "create_time" => array("type" => "int(11) unsigned","default" => "0","comment" => "评论时间"), "recontents" => array("type" => "text","comment" => "回复内容"), "recomment_time" => array("type" => "int(11) unsigned","default" => "0","comment" => "回复时间"), "aid" => array("type" => "int(11) unsigned","default" => "0","comment" => "文章id"), "uid" => array("type" => "int(11) unsigned","default" => "0","comment" => "用户id") ), "index" => array("primary" => "id","key" => "aid,uid"), ); $commentDB->setData($data); //开始创建表 return $commentDB->createTable(); } //卸载插件代码 public static function uninstall() { $commentDB = new IModel('article_comment'); //删除表 return $commentDB->dropTable(); } //插件参数配置 public static function configName() { //在本拿了中无参数配置 } } ~~~ 之后在后台中就可以安装插件了 ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160819114735-1024x325.png)  以上为每个插件必须的,如不需要操作数据库的,可以不用写数据库代码。 ## 二、管理后台功能维护 功能注册,comment.php中加入以下代码: ~~~ public function reg() { //后台插件管理中增加该插件链接 plugin::reg("onSystemMenuCreate",function(){ $link = "/plugins/system_comment_list"; Menu::$menu["插件"]["插件管理"][$link] = $this->name(); }); //后台评论列表的链接 plugin::reg("onBeforeCreateAction@plugins@system_comment_list",function(){ self::controller()->system_comment_list = function(){$this->comment_list();}; }); //后台评论详情的链接 plugin::reg("onBeforeCreateAction@plugins@system_comment_edit",function(){ self::controller()->system_comment_edit = function(){$this->comment_edit();}; }); //后台评论回复的链接 plugin::reg("onBeforeCreateAction@plugins@system_comment_update",function(){ self::controller()->system_comment_update = function(){$this->comment_update();}; }); //后台评论删除的链接 plugin::reg("onBeforeCreateAction@plugins@system_comment_del",function(){ self::controller()->system_comment_del = function(){$this->comment_del();}; }); } ~~~ 功能实现,comment.php中加入以下代码: ~~~ public function comment_list() { $this->redirect('system_comment_list'); } public function comment_edit() { $id = IFilter::act(IReq::get('id')); $commentDB = new IQuery('article_comment as c'); $commentDB->join=" left join article as b on c.aid = b.id left join user as a on c.uid = a.id "; $commentDB->where=" c.id=$id "; $commentDB->fields ="c.id,FROM_UNIXTIME(c.create_time) as create_time,a.username,b.title,c.recomment_time,c.recontents,c.content"; $items = $commentDB->find(); $this->redirect('system_comment_edit',array('comment' => current($items))); } //回复评论 public function comment_update() { $id = IFilter::act(IReq::get('id')); $recontents = IFilter::act(IReq::get('recontents')); $data = array(); $data['recontents']=$recontents; $data['recomment_time']=time(); //保存数据库 $commentDB = new IModel('article_comment'); $commentDB->setData($data); $commentDB->update('id = '.$id); $this->redirect('system_comment_list'); } //回复删除 public function comment_del() { $commentDB = new IModel('article_comment'); $id = IFilter::act(IReq::get('id')); $commentDB->del('id = '.$id); $this->redirect('system_comment_list'); } ~~~ 后台管理页面,评论列表:system_comment_list.html ~~~
文章>评论管理
{set:$page= (isset($_GET['page'])&&(intval($_GET['page'])>0))?intval($_GET['page']):1;} {query: name=article_comment as c join=left join article as b on c.aid eq b.id left join user as a on c.uid eq a.id fields=c.id,FROM_UNIXTIME(c.create_time) as create_time,a.username,b.title,c.recomment_time page=$page order = c.id desc} {/query}
评论人 评论文章 评论时间 操作
{$item['username']} {$item['title']} {$item['create_time']} 查看 删除
{$query->getPageBar()}
~~~ 后台管理页面,评论详情:system_comment_edit.html ~~~
文章>查看评论
评论人: {$comment['username']}
评论时间:{$comment['create_time']}
评论文章:{$comment['title']}
评论内容:{$comment['content']}
回复评论:
~~~ 评论列表页: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160819201409.png) 评论详情页面: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160819201620.png) ## 三、前台功能 找到site\article,加入以下代码,用于显示评论 ~~~
{set:$where="c.aid=".$this->articleRow['id'];} {set:$page= (isset($_GET['page'])&&(intval($_GET['page'])>0))?intval($_GET['page']):1;} {query: name=article_comment as c join=left join user as a on c.uid eq a.id fields=c.id,c.content,FROM_UNIXTIME(c.create_time) as create_time,a.username,c.recomment_time,FROM_UNIXTIME(c.recomment_time) as reply_time,c.recontents page=$page pagesize=3 where=$where order = c.id desc}
{$item['username']}

评论内容:{$item['create_time']}

{$item['content']}

{if:$item['recomment_time']>0}

回复: {$item['reply_time']}

{$item['recontents']}

{/if}
{/query} {$query->getPageBar()}
评论内容:
~~~ ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160819202116.png) 打开site.php,加入以下代码 ~~~ public function article_comment_add() { if(!isset($this->user['user_id']) || !$this->user['user_id']) { IError::show(403,"未登录用户不能评论"); } if(!IReq::get('aid')) { IError::show(403,"传递的参数不完整"); } if(trim(IReq::get('content'))=="") { IError::show(403,"评论必须输入"); } $aid = IFilter::act(IReq::get('aid'),'int'); $data = array( 'content' => IFilter::act(IReq::get("content")), 'create_time' => time(), 'aid'=>$aid, 'uid'=>$this->user['user_id'], ); $tb_comment = new IModel("article_comment"); $tb_comment->setData($data); $re = $tb_comment->add(); if($re) { $this->redirect("/site/article_detail/id/".$aid); } else { IError::show(403,"评论失败"); } } ~~~ 以下代码用于实现评论提交功能。 ### 后记 以上只是举了一个例子说明如何做一个插件,还有前台的视图和控制器的代码实现,但就目前而言,iwebShop的插件还是比较适合做那些没界面的功能,或是在线留言等这些js控件的前端功能,一旦前台界面有交互,还是用非插件的模式实现比较方便点,每个工具都有优缺点,能实现功能的就是好工具 >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第十二课 插件开发介绍

最后更新于:2022-04-01 20:42:21

在讲插件开发之前,如果对iWebShop的整体架构没做了解,先看回我们之前的教程,之后再来学习插件的开发 >[info]iWebShop从 V4.4版本开始全面支持插件机制,插件是什么东西?打个比方,如果iWebShop是一个手机操作系统,插件就是APP。回到理论,插件是一种可以热插拔的(动态安装和卸载),可以实现一定功能性并且对目前现有运行系统不会产生任何影响的一种松散耦合的设计模式,而且易扩展,可以让更多的开发者参与进来,让产品自身的功能更加丰富彩,它也可以通过动态的安装组合,实现不同的产品架构。 ## 一、拦截器(钩子) 说到插件就不得不提到钩子,插件之所以能够动态的加载到系统运行的各个环节中,主要是依赖于钩子。什么是钩子呢?钩子就是iWebShop 系统在运行中预留的一些事件函数, 我们把插件注册(挂接)到 iWebShop的某个事件上面,当 iWebShop 运行到这个事件的时候就会自动触发并且调用插件。简单来说,就是程序运行到一个有“钩子”标志的代码时,会调用相应的插件。 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812120955.png) iWebShop为开发者预留的大量的钩子,同时也支持开发者自己定义钩子事件。 ## 二、插件存放目录 iWebShop的所有插件都存放到plugins目录下,其下的每个子目录代表每个插件,并且每个插件目录下面还要新建一个与插件目录名称一样的插件入口文件,比如插件名字叫“sonline” ,那么我们要在 plugins目录下新建一个sonline目录,并且在这个 sonline目录下还要新建一个 sonline.php 类文件 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812113124.png) 把插件所需要的所有东西都放到自己的目录里面: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812113620.png) ## 三、插件功能 ### 插件核心类 plugin.php classes/plugin.php 是插件的核心类,所有插件的注册,调用,配置等等都必须要依靠它,想深入了解iWebShop插件机制的,可以深入了解这个文件。 ### 插件内置钩子事件 打开plugin.php,有系统内置的所有钩子,如图: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812112941-1024x397.png) 在进行开发的时候,可以好好利用这些内置的钩子。 之前我们讲过iWebShop在运行机制,实际上在这个运行过程当中,会自动触发plugin核心类的注册事件,以达到调用各个插件的目的。 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812110612-1024x202.png) 以上流程图就是iWebShop整个运行所触发的事件,我们的插件就要注册(挂接)到这些事件上。这里有个情况,就是这里的事件触发是广泛的 比如onCreateController 这个事件会监听所有控制器的创建,但是有的时候,我们的插件仅仅是针对某个控制器的,比如前台访问统计,或者是后台的订单自动取消等,这些功能仅需要监听(注册)site.php和 order.php控制器,于是我们可以把事件名称做一下变形,比如:onCreateController@site onCreateController@order 这样就可以为某个控制器绑定事件了 同理动作 (action) 也是如此, 那么我们只需要继续追加@动作 ID 比如, 我们要在首页 (site/index)动作中做处理,那么监听的事件名字:onCreateAction@site@index 按照层级关系追加就可以了,控制器(controller)包含动作(action) 下面我们介绍最常用的事件: **【onCreateController】** 控制器(controller)创建完成,可以得到当前正在运行的控制器,并且给控制器动态增加方法,设置数据等操作。 **【onCreateAction】** 动作(action)创建完成,此时还没有执行动作(action) **【onCreateView】** 视图(view)创建完成 **【onFinshView】** 视图(view)调用结束 **【onFinishAction】** 动作(action)调用结束 **【onFinishController】** 控制器完成结束 ### 插件注册接口 reg `public static function reg($event,$classObj,$method = "")` $event :事件名称 $classObj:类对象或者匿名函数 $method:方法名称,当$classObj为类对象时此参数有意义,否则无用 核心插件类中有一个重要的接口 通过此静态方法,把事件与插件进行注册绑定(挂接) ,简单说就是把某个$event事件交由一个函数或者对象方法去处理 打开 orderAutoUpdate 插件的 orderAutoUpdate.php,以看到以下代码: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812123649-1.png) 上面的注册表示,当系统运行 order/order_list 或 ucenter/order 的时候,运行自定义插件里面的 orderUpdate 方法 ### 事件触发接口 trigger `public static function trigger($event,$data = null)` $event : 事件名称 $data : 传送参数 当系统运行到每个事件的时候,都要运行此接口,用来通知各个插件,由于插件父类(pluginBase)已经预留了以上的一些系统级事件(比如:onCreateController),并且会自动调用,所以开发者注册此类系统事件不需要手动调用trigger函数,但是如果是非系统事件就必须要在代码中手动触发,比如 classes/menu.php 中的创建后台菜单事件,就必须要调用 plugin::trigger 接口,如图: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812142434.png) 这相当定义一个节点,当程序运行到此处时,触发事件 ### 插件基类公开接口 核心文件中有个重要的插件基类 class pluginBase 用户开发的所有插件都必须要继承(extends)这个类,这个插件基类包含了很多工具函数,都是开发者要用到的,所以熟悉和了解此类库对开发插件具有重大意义,这些接口随着日后的更新也会越来越完善。以下为官方提供的接口说明: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812111505-1024x37.png)![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160812111348-1024x495.png) 具体的用法我们在后续的实例中说明。 ### 思考 在每个操作上加上了钩子,会不会影响系统的性能? 答案是当然会影响性能,比不上你在每个程序的钩子节点上加入代码来得效率高。但做一个系统不能单纯只考虑性能的角度出发,钩子不滥用的话,系统的开销是不大的。用这一点的性能换取系统的扩展性,是完全值得去做后一些事。 以上文章的内容有多处引用官方的文档,以免误导读者,详细的用法我会在之后的文章开展。 >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第十一课 iWebShop 系统内置 JS的使用

最后更新于:2022-04-01 20:42:19

上节课程我们讲到: >[info] iWebShop 系统默认提供了大量的优秀 JS 工具和插件,比如日历,jquery,artDialog 弹出框 UI,artTemplate模板引擎等等…所有系统内置的 JS 都在\lib\web\js\jspackage_class.php 有兴趣的用户可以自己扩展一些常用工具,在模板里面引用更为简单。 这次课程我就说明一下有哪些常用的JS工具,由于每一个JS工具的用法都能写一本帮助文档,所以这里只介绍JS工具的功能及用法 ## 一、iWebShop使用了哪些JS工具 打开\lib\web\js\jspackage_class.php 文件,文件开头就是以下代码: ~~~ //系统JS注册表 private static $JSPackages = array( 'jquery' => array( 'js' => array( 'jquery/jquery-1.11.3.min.js', 'jquery/jquery-migrate-1.2.1.min.js' ) ), 'form' => array('js' => 'form/form.js'), 'dialog' => array( 'js' => array( 'artdialog/artDialog.js', 'artdialog/plugins/iframeTools.js' ), 'css' => 'artdialog/skins/aero.css' ), 'kindeditor' => array( 'js' => array( 'editor/kindeditor-min.js', 'editor/lang/zh_CN.js' ), 'callback' => 'initKindEditior' ), 'validate' => array( 'js'=>'autovalidate/validate.js', 'css'=>'autovalidate/style.css' ), 'my97date' => array('js' => 'my97date/wdatepicker.js'), 'artTemplate' => array( 'js' => array( 'artTemplate/artTemplate.js', 'artTemplate/artTemplate-plugin.js' ) ), 'cookie' => array('js' => 'cookie/jquery.cookie.js'), 'admanage' => array('js' => 'admanage/adloader.js'), 'chart' => array('js' => 'highcharts/highcharts.js'), ); ~~~ 每一种JS工具的源码放在 \lib\web\js\source下面。如果要做扩展,就修改jspackage_class.php,在source下增加相应的JS文件,就可以调用了。 ## 二、JS工具介绍 **adloader.js** iwebshop自己开发的广告加载器,60行的代码,很简洁。要使用广告的页面记得要引入这个js文件,广告的设置在管理员后台 **autovalidate** iWebShop开发的表单验证插件。 **form.js** 这个也是iWebShop自己开发的插件,主要完成表单回写的功能,在表单初始化时用比较多。 **jquery** 目前应用最广的JS库,好多第三方的工具都是基于jqurey开发的。 **artdialog** 对话框组件,详细用法可看:[http://lab.seaning.com/](http://lab.seaning.com/) **artTemplate** 性能很好的javascript 模板引擎 [https://github.com/aui/artTemplate](https://github.com/aui/artTemplate) **jquery.cookie** 对cookie进行操作的工具:[https://github.com/carhartl/jquery-cookie](https://github.com/carhartl/jquery-cookie) **kindeditor** 一个富文件框的编辑器:[http://kindeditor.net/doc.php](http://kindeditor.net/doc.php) **highcharts** 一个图表工具:[http://www.hcharts.cn/](http://www.hcharts.cn/) **my97date** 日期控件:[http://www.my97.net/](http://www.my97.net/) ## 三、validate.js,form.js的使用 这两个js文件是为iWebShop量身定做的,下面就通过官方提供的例子说明这两个js的使用方法。 ### validate.js 首先要通过 js 标签引入此插件:{js:validate} form 表单中的 input 标签中 type 为 text,password,select-one,textarea 中添属性pattern 和 alt 属性系统将会自动添加验证功能 如:对 email 的验证,在视图文件里编写如下代码: ~~~ {js:validate}
~~~ 运行效果如下: 当你输入不正确的格式时,效果如下图所示: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160808144133.png) 当你输入正确的格式时,如下图所示: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160808165458.png) 对于 pattern 的正则系统对常用的正则都作了一些封装如: required, email, qq , id, ip , zip, phone, mobi ,url ,date,datetime ,int ,float 等等, 如果以上还没能满足你的要求,则用户可以自己写正则,如我想让用户输入一个 3-5 位的数字:则修改代码 ~~~ ~~~ 运行效果: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160808165522.png) 填写正确: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160808165544.png) 另外要注意,要验证时,隐藏输入项目会失效,不进行验证处理! 就是这么简单,那么用户如果想在验证完后再运行自己的 js 函数怎么办? 修改 文件 ~~~ { js:validate}
~~~ 然后点击提交按钮: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160808165614.png) >[info] 这里要解释一下回调函数的 return true 和 false > 如果返回的是 true,表单通过验证后,表单将提交,不通过将不提交。 > 如果返回的是 false,则无论表单是否通过表单都将不会被提交。 下面再说一下 form.js 文件,这个主要是完成表单回写功能的,比方说,你想让表单里的项目初始化一些值 修改文件: ~~~ { js:form}


看书打球
~~~ 运行效果如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/08/20160808165710.png) 同样也可以用 getItems 取得表单里所有数据的对象。也可以用 setValue(name,value) 的方式只给一个设置对应的值,也可以通过 getValue(name)得到对应项的值。 要注意的两点: 1、多选的时候是用 ; 号来分开的。 2、此 form 插件不能对 file 字段进行处理。 >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第十课 模板标签

最后更新于:2022-04-01 20:42:17

>[danger]之前我们讲了不少iWebShop的运行原理,这节课就来讲解一下模板标签的使用,标签的开发是必不可少的一部分,主要负责数据显示,读取数据,显示路径等等。 ## 一、标签格式 iWebShop的标签格式为{标签名:属性},相对于其他的一些模板来说,比较简洁 比如以下代码,set为标签名,$catId =3为属性,表示把3的赋值给$catId ~~~ {set:$catId =3} ~~~ ## 二、输出类标签 在iWebShop标签中,可采用{$name}的方法,直接输出变量$name的值。也可以采用{echo:name}输出变量name的值,注意使用echo标签时,不带变量符号$ 举例说明: ~~~ {$name}//输出变量$name {echo:"IWEB"}//输出字符串 IWEB {echo:name}//输出变量$name ~~~ ## 三、地址路径类标签 ### url标签 {url:path} 通过 path 转换为系统统一的路径,path由控制器(Controller)/动作(action)组成,可以在这后面追加参数,以”/”为分隔符,按照/变量名/变量值的形式加到后面。例如你要访问 site.php 控制器下面的 index.html,就可以在模板里面写 ~~~ 首页 ~~~ 使用该方式定义链接地址,无论以后改成伪静态还是其他方式,链接都能正确显示。 ### webroot标签 {webroot:file}表示iWebShop 根目录下的路径,此标签就是专门引入资源文件时候使用的。比如要引用根目录下的 image 目录下的 logo.png 文件,那么可以使用 ~~~ ~~~ ### theme标签 {theme:file}表示 当前主题目录下的路径 iWebshop是个多主题的商城系统,我们可以在views下面放我们自定义的主题名称的目录,theme则表示当前的主题的根目录,比如你使用的是默认模板,{theme:}则表示iwebshop/views/default/这个路径。 例如: iwebshop/views/default/javascript/sunzoon.js则用标签这么表示: {theme:javascript/sunzoon.js} ### skin标签 {skin:file}表示从当前皮肤目录下的路径 iWebshop是个支持多皮肤的商城系统,{skin:}表示当前主题使用的皮肤根目录。如要引用当前皮肤下的css目录的style.css,则这样表示: ~~~ ~~~ ### js标签 {js:name}表示 iWebShop 系统内置 JS iWebShop 系统默认提供了大量的优秀 JS 工具和插件,比如日历,jquery,artDialog 弹出框 UI,artTemplate模板引擎等等…所有系统内置的 JS 都在\lib\web\js\jspackage_class.php 有兴趣的用户可以自己扩展一些常用工具,在模板里面引用更为简单。 如:引用 jquery 则可写成{js:jquery},编译运行之后,生成的目录文件如下: ~~~ ';

第九课 iWebShop模板开发

最后更新于:2022-04-01 20:42:14

>[info]模板的开发应该说是商城二次开发最多的一部分,很多客户买了一套商城系统,第一件事就是修改界面,这一节课我们就讲一讲在iWebShop中如何进行模板开发,要注意哪些问题 ## 一、模板目录结构 iWebShop的模板文件,都放在根目录的views下,目录的结构如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160729144413.png) views下的每个目录就是一个模板主题 ,也就是平时网上在卖的一个模板,就是这一个目录下的文件。系统前台模板主题为default;默认后台主题sysdefault;商家后台的默认主题为sysseller。要使用哪个模板可以在后台中设置。也可以在根目录config/config.php中的theme中设置。 从上图可以看出,每一个模板主题下由皮肤,js代码,布局模板,控制器模板,config.php,preview.jpg(名称可在config.php中设置)组成。 模板文件分为布局模板和控制器模板这两类,一个页面是由布局模板和控制器模板拼接而成的。 ## 二、主题conifg配置文件说明 以默认的模板为例,配置文件的代码如下: ~~~ return array( 'name' => '锦绣前程',//模板名称 'author' => 'aircheng',//作者 'time' => '2014/12/29 10:03:05',//发布日期时间 'version' => '3.0',//版本 'thumb' => 'preview.jpg',//封面图文件名 'info' => '默认主题方案,此主题适用于3.0.0 系列产品',//模板描述 'type' => '商城前台-PC',//类型 ); ~~~ 以上为模板的配置文件,还能在这个模板中配置布局的信息,具体可以看一下,我们之前有关视图的文章: ## 三、主题布局layouts 布局的作用就是把一些公用的前端代码提取出来,如网站的头部,网站底部,或是侧边栏之类的内容,关于布局的声明可以看回“视图”那篇文章,以下我拿代码最少的一个布局模板,site_mini来说明: ~~~ {set: $siteConfig = new Config("site_config"); } {echo:$siteConfig->name} {js:jquery} {js:validate} {js:form} {js:dialog}

{echo:$siteConfig->name}

{if:$this->user} {$this->user['username']}您好,欢迎您来到{echo:$siteConfig->name}购物![安全退出] {else:} [登录免费注册] {/if}

{viewcontent} {echo:IFilter::stripSlash($siteConfig->site_footer_code)}
~~~ 其中高亮的那一行中的{viewcontent} 将会被普通的模板替换。前面讲过一个页面是由布局模板和普通模板拼接组合而成的,这里的拼接组合就是通过 {viewcontent} 这个标签来实现的,因为系统在运行时会自动把此标签替换为浏览器要访问的普通模板内容,所以你可以把这个标签理解为是一个普通模板,他被嵌入在布局模板之中 如\default\simple\restore_password.html这个页面是重置密码的界面文件,如下: ~~~

密码重置

请填写下面表单来重密码重置

*你想要的新密码:
*请再次输入新密码:
~~~ 可以看出,这只是一个html的片断,不是完整的html结构,但把它嵌入到site_mini中的{viewcontent}去就完美了,最终用户看到的页面是site_mini与restore_password的组合。 >[danger]注意:如果一个主题的控制器没有设置布局模板,那么控制器模板一定要是一个完整html文件。 ## 四、主题皮肤 皮肤的目录下也有一个config.php,这个配置文件的信息和主题是完全一致的。 css目录放模板要用到的样式文件。 images目录放模板要用到的图片文件。 皮肤的切换可以在后台的主题选项中去选择。 >[danger]注意:如主题没有多个皮肤,就放一个default的目录就够了。 ## 五、控制器模板 在之前的课程中讲到控制器在views下,每个控制器就是一个目录,目录的名称与控制器文件的名称一致,以simple控制器为例,他的目录下就有以下模板文件 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160729161446-e1469780288340.png) 打开controllers下的simple.php,能找到如下的代码片断,这些代码就是指向各自的控制器模板文件。 ~~~ $this->redirect('login'); $this->redirect('cart'); $this->redirect('cart2'); ~~~ 有关模板目录结构的内容就到这里,下一课我再讲解模板标签的使用。 >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第八课 自定义类,API类说明

最后更新于:2022-04-01 20:42:12

>[danger]之前我们讲了控制器,数据库操作等程序的基本的语法和规则,在实际开发的过程,我们会把一些常用的操作封装成一个类去做调用,减少代码的冗余,减少后期程序的维护成本,这节课就来讲解一下,iWebShop自定义类,API类的做法。 ## 一、自定义类 在iWebShop中,几乎所有的自定义类都是直接可以使用的,只要在classes目录下直接创建对应类文件,就可以在程序中直接调用,不用做引入之类的。 在classes下创建sunzoontest.php,代码如下: ~~~ ~~~ 在Controller的类中使用该类的代码如下: ~~~ $test=new SunzoonTest(); echo $test->test(); ~~~ 代码输出: 自定义类的输出 ## 二、API类 除了自定义的类以外,classes目录下还有一个api目录,这个目录下放一些常用的数据查询类,可以直接调用。 ~~~ $data = Api::run(接口名字,参数...); ~~~ 接口名字定义于 api_resource.php 文件中,有2种方式实现:query标签式和 class 自定义式,以下代码为query的定义方法: ~~~ 'getAnnouncementList'=>array( 'query'=>array('name'=>'announcement','order'=>'id desc','limit'=>10) ), ~~~ 在代码中直接调用: ~~~ $data = Api::run(‘getAnnouncementList’); ~~~ 以下代码为class 自定义式的的定义方法: ~~~ //用户中心-我的代金券 'getPropList' => array( 'file' => 'ucenter.php','class' => 'APIUcenter' ), ~~~ 在api目录中找到ucenter.php,打开的找到以下代码: ~~~ //用户中心-我的代金券 public function getPropList($ids){ $page = IReq::get('page') ? IFilter::act(IReq::get('page'),'int') : 1; $query = new IQuery('prop'); $query->where = "id in(".$ids.") and is_send = 1"; $query->page = $page; return $query; } ~~~ 这就是接口的定义。 ## 什么时候用query定义,什么时候用class 自定义式? 如数据不需要判断,直接传参数就能取到,就使用query,方便快捷 如在程序中还要加入大量的业务逻辑,那么使用class自定义式,这样比较清晰 由于query越多,api_resource.php这个文件就越长,所以从易于维护的角度考虑,使用class自定义式则是更好的一种方法。 >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第七课 数据库操作(模型)

最后更新于:2022-04-01 20:42:10

>[info]之前的课程讲到,使用MVC架构的程序,在与数据库做交互时,都会把操作封装在模型中,而在iWebShop当中,读取操作用 IQuery 类,写入操作用 IModel 类。除非使用自定义的类,IQuery和IModel的操作没有独立成一个文件,在控制器中就可以找到相应的操作代码,本课程就讲一讲这两个类如何使用。 ## 一、IQuery 类 IQuery类的定义位于lib\core\query_class中,结构如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160722151456.png) 一般使用比较多的就__set中的各个属性和find方法,对实现原理有兴趣的可以看看这个文件,代码不长 IQuery类使用 以下通过官方的例子来说明 比如我们要查询商品表(goods)里面的 id=10 的商品,则 ~~~ $goodsDB = new IQuery('goods'); //goods是表名,这里不需要加前缀 $goodsDB->where = "id = 10"; //where属性相当于sql中的where条件 $goodsData = $goodsDB->find(); //find方法就是执行查询,返回的是一个数组 ~~~ 从上面的例子可以看出来,IQuery的使用分三步 (1)创建IQuery对象,表名作为参数。 (2)设置对象的属性。 (3)执行查询,得到结果。 有关属性的说明,官方给出了以下说明: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160722153508.png) ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160722153535.png) ## 二、IModel 类 IModel类的定义位于lib\core\query_class中,结构如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160722170629.png) 代码量不大,setData,update,add,del,qurey为常用方法。 以下通过官方的例子来说明 比如要更新 goods 表中id=2的 price 字段,那么就是 ~~~ $goodsDB = new IModel(‘goods’);//创建model对象,goods是表名 $goodsDB->setData(array(‘price’ => 1000));//设置表元素,是个二维数组 $goodsDB->update(‘id = 2’); //执行更新动作,此时会把数组的数据更新到数据库中 ~~~ 从上面的例子可以看出,IModel的操作同样是创建对象,设置数据,执行操作这样的步骤。 有关属性的说明,官方给出了以下说明: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160722153614.png) ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160722153652.png) 以上为IQuery类和IModel类的用法,具体的实践我们会在后续的课程中举例说明。 >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第六课 视图

最后更新于:2022-04-01 20:42:07

>[danger]上节课我们了解了控制器的用法,控制器执行到最后,会跳转到一个界面,用于显示数据,这个用于显示数据的html文件,我们就称之为视图。 ## 一、视图目录 iWebShop的视图存放目录位于views下,views下每个目录为一个主题,default为系统前台的默认主题,sysdefault为系统后台默认主题,syssellers为商家后台的主题,mobile为手机端的主题。下面以default为例,说明目录结构: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160721171951.png) * javascript为该主题要使用到的js文件 * layouts存放的为视图布局文件(后面详解) * skin为该主题要使用到的皮肤css文件 * simple,site,ucenter为控制器的名称,每个控制器对应一个目录,目录下的每个文件默认对应控制器中的Action(如在URL解析控制器Action时,如果在控制器程序中找不到Action的定义,就会直接跳转到该视图) * config为该主题的配置文件 * preview.jpg为主题的预览图,只在后台选择主题可以见到. ## 二、conifg.php文件 default主题的config文件如下: ~~~ '锦绣前程', //主题名称 'author' => 'aircheng', //主题作者 'time' => '2014/12/29 10:03:05', //制作时间 'version' => '3.0', //主题版本 'thumb' => 'preview.jpg', //主题预览图 'info' => '默认主题方案,此主题适用于3.0.0 系列产品', //主题描述信息 'type' => '商城前台-PC', //主题类型 ); ?> ~~~ 主要是定义主题的一些基本信息。 ## 三、视图布局 layout 官方解释 >[info] 简单说下 iWebShop 的 layout(布局),对于一般网页视图来说,基本的结构形式都是固定好的,比如网页的头部,页脚底部,公共样式,公共 js 类库等等,所有这些公共的部分我们把它抽象出来,做成一个 layout 模板(html形式的),layout 存在于每个主题模板的 layouts目录中,可以为不同的控制器(controller) ,动作(action)指定不同的布局,比如网站的首页和网站的注册页面头部布局就可以不同: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160721181553.png) ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160721181634.png) 简单来说,layouts的作用就是把公用的代码提取出来,提高代码的使用率。具体的开发方式会在主题开发的过程中说明。 ### layouts设置 官方提供了以下三种方法设置layouts (1)在控制器(controller)中增加 public $layout 公共属性,表示这个控制器下的所有视图都默认用这个布局,如下: ~~~ ~~~ (2)我们也可以在主题目录下的 config.php 文件中配置 layout 布局。 ~~~ '锦绣前程', 'author' => 'aircheng', 'time' => '2014/12/29 10:03:05', 'version' => '3.0', 'thumb' => 'preview.jpg', 'info' => '默认主题方案,此主题适用于3.0.0 系列产品', 'type' => '商城前台-PC', 'layout' => array('simple' => 'site') //增加这一句 ); ?> ~~~ 如果我们希望 simple 下面有个视图reg使用 site_mini 的 layout 布局就应该这么写: `layout => array(‘simple’ => ‘site’,‘simple@reg’ => ‘site_mini’)` 注意:iWebShop 用@符号表示包括子关系,比如 site@index 表示的就是 site 控制器下的 index 方法。 (3) 也可以在每个动作(action)方法里面临时设置 layout 比如: ~~~ layout = 'site'; echo "hello world"; } } ?> ~~~ ## 四、视图开发举例 把上节课的控制器代码改为,高亮的代码表示跳转到”helloworld”这个视图。 ~~~ redirect('helloworld'); } } ?> ~~~ 在views/default建立文件夹test,再建立一个html文件helloworld,输入以下代码: ~~~ hello 三众简悦iWebShop开发教程 ~~~ 显示效果如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160721184601.png) >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第五课 控制器

最后更新于:2022-04-01 20:42:05

>[info]从上节课iWebShop的运行机制知道,初始化之后,第一个运行的部件就是控制器Controller, 这一节课就说明Controller的用法。 ## 一、URL解析 上节讲到,iWebCore 接受用户的请求之后,URLManager会对URL进行分析,找到指定的控制器的一个Action运行程序。以下通过一个请求来说明如何解析的。 >[info]如请求为:http://域名/index.php?controller=site&action=products&id=9 > >>[danger]index.php为统一口文件 >> >>controller=site&action=products 表示请求的是控制器site下的products函数 >> >>id=9为传递参数,由action接收 那么,我们怎么知道这个请求执行了什么?先依次从controllers下找到文件site.php,打开文件找到function products,以上请求解析完成之后执行的就是这个函数,在这个函数中能看到获取了传递参数为id, 之后就是业务逻辑。 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160720181059.png) products执行之后,显示商品页面如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160720182148.png) ## 二、控制器的规则 * 控制器的PHP文件必须放在controllers下,文件名都用小写字母,不要包含其他字符 * 控制器就是一个类,这个类必须要继承IController,类名的第一个字母要大写 * 类名和文件名要保持一致 ~~~ class Site extends IController { function init() { //初始化代码 } function xxxx{ //运行的程序代码 } } ~~~ * 每个类都有一个init方法,如上,在对象初始化时执行。 * 控制器的开发遵循PHP面向对象的原则,一切PHP面向对象的规则都支持。 ## 三、控制器实例 在controllers目录下建一个文件test.php,代码如下: ~~~ ~~~ 运行得到的结果如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160720195541.png) ## 四、如何给模板渲染数据 一共有 2 种方法可以把控制器里面的数据传递给模板,可以通过【类属性】和【$this->setRenderData】 ~~~ function show() { $this->title="123456";//类属性 $this->setRenderData(array('title'=>'123456'));//setRenderData $this->redirect("show");//跳转到控制器模板文件show中 } ~~~ 第一行**【推荐】**:展示了第一种传值方式,通过类属性赋值操作,把字符串“1234567”赋值给了 $this->title 第二行: 展示了第二种传值方式, 通过控制器自身方法 setRenderData 把参数数组里面的键变成模板里面的变量 第三行:把视图引入进来, 引入控制器下的 show.html >[danger]注意:如果要给视图渲染数据那么要引入的视图名字必须和 action 方法名字相同,即function方法名字叫 show,要显示的视图也必须叫 show。 当然如果方法名称和视图名称不一致却仍想渲染数据,需要在最后的 redirect方法中增加第二个参数——false 比如要把$this->title传递给 test1.html 视图,那么第三行就要写成: $this->redirect(‘test1’,false); 此时就可以实现显示 test1.html,并且带着 show方法里面的数据了 >[info]模板文件可以直接通过以下方式来显示数据 ~~~

$this->title

$title

~~~ >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第四课 程序处理流程

最后更新于:2022-04-01 20:42:03

>[danger]iWebshop商城是基于MVC架构进行开发的,使用MVC能够把业务逻辑、数据、界面显示分离出来,并且整个商城系统采用了单一入口,系统控制比较灵活。因此在了解iWebShop运行机制之前,我们先看看,什么是MVC,什么是单一入口。 ## 一、MVC > MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: > > * Model(模型)表示应用程序核心(比如数据库记录列表) > > * View(视图)显示数据(数据库记录) > > * Controller(控制器)处理输入(写入数据库记录) > > MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制 > > Model(模型)是应用程序中用于处理应用程序数据逻辑的部分 > 通常模型对象负责在数据库中存取数据 > > View(视图)是应用程序中处理数据显示的部分 > 通常视图是依据模型数据创建的 > > Controller(控制器)是应用程序中处理用户交互的部分 > 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据 > > MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计,同时也让应用程序的测试更加容易 > > MVC 分层同时也简化了分组开发,不同的开发人员可同时开发视图、控制器逻辑和业务逻辑 以上解释引用自百度知道,简单来说,使用MVC模式, 可以强制输入,处理,输出分开,把应用程序分为视图,控制器,模型三个部件,让它们各自处理自己的任务。这样的做法有利系统开发的分工及系统二次开发维护,提高开发人员的效率。因此,iWebShop系统的优势从架构时就已经建立下来了。 >[info]下面举例说明MVC模式的处理流程,加深对MVC的理解。 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160719161800.png) 1、用户在浏览器点击一个链接,向服务器发出一个请求,请求首先到“控制器”中去处理,“控制器”中的代码就开始进行业务逻辑判断。 2、“控制器”在做业务处理时,要对数据库进行存取,必须要通过“模型”对数据库进行访问。 3、模型数据返回到控制器中后,控制器继续进行逻辑处理,直至完成,控制器就做页面跳转指令,此时就要控制权交给视图,由视图对网页进行渲染,生成页面返回给用户。 ## 二、单一入口 >[info] 单一入口通常是指一个项目或者应用具有一个统一(但并不一定是唯一)的入口文件,也就是说项目的所有功能操作都是通过这个入口文件进行的,并且往往入口文件是第一步被执行的。  这个比较好理解,就是系统所有的处理通过一个入口文件来运行。比如:iWebShop的根目录,index.php就是入口文件,结构如下: ~~~ run(); ?> ~~~ ## 三、iWebShop运行机制 介绍完MVC,单一入口的概念,再来说明iWebShop运行机制,那就很好理解了,iWebShop的作者把MVC和单一入口的设计理念结合在一起,并根据自己多年开发商城系统的经验,加入了一些特性,形成了一个核心:iWebCore,IWebShop就是这个核心的基础上开发而来的。 IWebCore运行流程如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160719171312.png) 1、请求到达统一入口文件,系统先做应用初始化的动作,此时会加载网站配置文件,初始化iWebCore的一些核心类。 2、读取用户的请求,之后URLManager会对URL进行分析,找到指定的控制器的一个Action运行程序。(URL的分析会在控制器的课程中说明) 3、控制器通过调用Model,执行完成之后跳转至视图,由视图完成数据渲染。 4、在视图的渲染过程中会调用Layout,标签等IwebCore的机制。这部分的内容在后续视图的课程中会有详细说明。 >[warning]如有不明白的地方,留言或是加入我们 “三众技术QQ交流群”一起讨论 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第三课 系统配置

最后更新于:2022-04-01 20:42:01

>[info]上节课,讲解目录结构的时候,提到config这个配置目录,这一课就来详细说明一下里面各个项目代表什么意思 ##config文件详解 ~~~ array ( 'path' => 'backup/logs/log', // 存放日志的路径 'type' => 'file', //对应的值为 file(文件存储方式),db(数据库存储方式)存放日志的类型 ), 'DB' => array ( 'type' => 'mysqli', //数据库引擎类型 'tablePre' => 'st_',//数据库前缀 //读写分离设置,读数据库设置 'read' => array ( 0 => array ( 'host' => '127.0.0.1:3306', //数据库地址 'user' => 'xxxx', //用户名 'passwd' => 'xxx', //密码 'name' => 'xxxx', //数据库名称 ), ), //读写分离设置,写数据库设置,如果读写是同一个数据库,write的配置与read一致。 'write' => array ( 'host' => '127.0.0.1:3306', 'user' => 'xxxx', 'passwd' => 'xxxx', 'name' => 'xxxx', ), ), //拦截器设置 'interceptor' => array ( 0 => 'themeroute@onCreateController', 1 => 'layoutroute@onCreateView', 2 => 'plugin', ), 'langPath' => 'language', //语言包目录 'viewPath' => 'views', //视图的目录 'skinPath' => 'skin', //样式的目录 'classes' => 'classes.*', //存放自定义的类的路径 'rewriteRule' => 'url',//伪静态设置,url:非伪静态;pathinfo:伪静态; //主题皮肤配置,此处在后台可以进行设置,不用手工修改。 'theme' => array ( //电脑端 'pc' => array ( 'sysdefault' => 'green',//管理员,sysdefault是主题名称,green是皮肤样式 'sysseller' => 'green',//商家后台 'iwebmall' => 'default',//用户前台 ), //手机端 'mobile' => array ( 'sysdefault' => 'default', 'sysseller' => 'default', 'mobile' => 'default', ), ), 'timezone' => 'Etc/GMT-8', //时区 'upload' => 'upload', //文件上传目录 'dbbackup' => 'backup/database', //后台备份数据库之后,文件存放目录 'safe' => 'cookie', //存储会话变量的方式,session 或者 cookie 'lang' => 'zh_sc', //语言类型,zh_sc表示简体中文 'debug' => '2', //调试模式,在后台中可以设置。 //扩展配置文件,这里引入了站点配置文件。 'configExt' => array ( 'site_config' => 'config/site_config.php', ), 'encryptKey' => 'xxxxxx',//授权加密字符 'authorizeCode' => 'xxxxxx',//授权码 )?> ~~~ >[info]site_config的内容在后台都可以设置,就不在这里一一描述了,如有配制项目要扩展,请加在site_config文件中 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第二课 iWebshop目录结构

最后更新于:2022-04-01 20:41:58

## 本节概要 >[danger]本节课程主要介绍iwebshop程序的目录结构,方便新手学习iwebshop的二次开发。 打开程序的安装包(iwebshop4.4),程序的目录如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160713160117.png) ##目录说明如下: >[warning]* language: 语言包目录,放置各种语言包文件 >* runtime: 程序运行目录,该目录是缓存文件夹,该目录下的文件可以删除,只要程序运行就会自动生成 >* upload: 上传目录, 系统上传的文件都放在该目录下,以年,月,日来存放 >* docs: 软件版本目录,存放一个版本文件 >* config:配置文件目录,包括config , config_default, site_config这三个文件 >>[info]* config:主要是数据库的连接信息,还有系统模板,时区,备份目录,日志目录等等 >>* config_default:为config的默认配置信息,用于恢复config至默认。 >>* site_config:为后台网站设置的信息保存,支持扩展属性。 >* backup:备份目录,通过后台备份数据库的默认目录 >* lib:iwebcore核心文件库,不要修改 >* views:视图文件,模板、皮肤文件都存放在这个目录下 >* classes:扩展的类文件目录,公用类调用存放的目录 >* controllers:控制器目录,所有的链接都要通过控制器来处理 >* install: 安装目录,安装完成之后记得要删除或是改名 以上就是各个目录的作用,详细的用法我们会在接下来的课程说明 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

第一课 iWebShop安装

最后更新于:2022-04-01 20:41:56

要进行iWebShop二次开发或是进行iWebShop测试,要先在本地电脑上安装iWebShop运行环境,之后再安装iWebShop程序,接下来我就一步步讲解,如何安装iWebShop程序。 ##一、运行环境搭建 这里我推荐新手使用PHPStudy,使用简单。 >[info]解压版下载地址:[http://www.phpstudy.net/phpstudy/phpStudy.zip](http://www.phpstudy.net/phpstudy/phpStudy.zip) 打开压缩包,双击phpStudy2016.exe进行安装 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714151053.png) 选择一个目录解压 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714152312.png) 解压完成之后,打开目录,找到phpStudy打开,如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714154329.png) 第一次打开时,会提示初始化,点击确定即可。 启动成功后,如下所示: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714155740.png) >[danger]点击上图"PHP版本",选择5.4(iwebshop要求php版本5.4) 如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714160117.png) ##二、安装iWebShop >[info]先到官网上下载试用版:[ http://www.aircheng.com/down](http://www.aircheng.com/down) 把压缩包解压到phpStudy的WWW目录下 在浏览器中输入:[http://localhost/iwebshop/](http://localhost/iwebshop/)  开始安装程序 同意条款,点击“下一步”: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714155709.png) 显示绿色,则说明环境是OK的,点击下一步。 在此步,环境设置中如出现红色,则表示该项目没有达到安装的标准,需要进一步解决问题之后再刷新页面。 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714160808.png) 填写数据库名称,数据库账户,密码,管理员账户,密码,就可以点击下一步,继续安装。 >[info]注:如果使用PHPStudy,数据库账户是root,默认密码为空。 ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714160949.png) 安装成功后,显示的界面如下: ![](http://it.sunzoon.com/wp-content/uploads/2016/07/20160714161046.png) >[success]前台地址:http://localhost/iwebshop/index.php?controller=site&action=index >后台地址:http://localhost/iwebshop/index.php?controller=systemadmin&action=index 安装成功后记得删除iwebshop程序目录下的install文件夹,确保系统安全。 ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg)
';

序言

最后更新于:2022-04-01 20:41:54

##写在最前面 从2012年开始接触iWebShop这套电商系统,这几年一直关注着他的发展,看着iWebShop的功能一个版本比一个版本强大,代码逐步在优化,而且我们在这套系统的基础上也帮许多客户开发了不少商城系统,积累了不少经验。因此,想整理一些iWebShop的开发教程,和大家交流一下。如有错误的地方,敬请大家指出,谢谢。 ##iWebShop简介 iWebShop 是一款基于【PHP 语言】+【MYSQL 数据库】开发的开源的 WEB 电商 B2B2C(平台自营+商家入驻)建站系统,采用 MVC 架构(Yii 框架思想)设计模式精心设计的一款产品,它功能丰富,使用简单,架构优良,安全性高,具有良好的扩展性,在国内开源市场享有盛誉,iWebShop 这件利器,绝对是您进军电商的首选! ##iWebShop优势 1. 代码 100% 开源,用户可以自由修改,打造成独一无二的完全符合自己意愿的电商平台。 2. 高安全性,独立自主,所有的程序数据,交易记录,商品图片信息等都安全的放到自己的服务器里面,不需要依赖任何第三方,不受任何第三方约束,你的就是你的。 3. 产品品质突出, 无论从代码的架构设计, 还是从编写质量上都是独具匠心, 易扩展 (插件机制) , 高安全性(cookie加密,多种数据过滤机制),功能丰富(参考: http://www.aircheng.com/fun ),高性能(支持 memcache,file 等缓存技术,支持 mysql 多数据库协同工作,读写分离等)。 4. 性价比高,价格最优!毫无疑问 iWebShop 是目前国内同类产品中价格最低的高端电商产品,不同阶梯价格完全可以满足各方需求,仅仅几千元就可以实现您的电商梦想。 5. 一键安装!仅仅 5 分钟就可以拥有一个属于自己的电商平台。 6. 跨平台性,任何操作系统不管是 window,linux,UNIX…都可以安装运行 iWebShop!Apache,IIS,nginx…任何支持 WEB服务的软件都可以安装运行 iWebShop,而且软件环境的费用(LAMP 架构)成本几乎是 0 元。 7. 定期版本更新升级,平均 1.5 个月发布新版本,最新的补丁包每次都是第一时间在官网( http://www.aircheng.com )或论坛( http://bbs.aircheng.com )公布!所有授权用户终身免费升级!不断优化,不断完善,与时俱进!再也没有比 iWebShop 产品更具有生命力的电商产品了! ##iWebShop下载地址 >[info]http://www.aircheng.com/down 关于iwebshop的相关信息请到官网查看: >[warning]http://www.aircheng.com >http://www.aircheng.com/business (合作伙伴) ## 关于我们 >[danger][三众科技](http://www.sunzoon.com)资讯平台——大道至简,悦你所阅!【三众简悦】--是一个技术类资讯的交流平台,不定期推出**原创**的简短的教程,方便大家交流! >本教程由[三众简悦](http://it.sunzoon.com)原创,转载请注明出处,作者:bobball,由bobo整理成看云书籍 三众技术交流群:**543102562** 欢迎大家加入我们,共同讨论IT,互联网技术。同时可以扫描下面的二维码关注我们,谢谢! ![三众科技服务号](http://it.sunzoon.com/wp-content/uploads/2016/06/qrcode_for_gh_401d25b05314_344.jpg) >[success]有电商二开需求的可以联系我们,请提供完善的需求文档,谢谢! >联系人:bobo >Q Q     : 37098907 (加好友请注明原因) >E-mail:zhubh78@139.com
';