BFWSOA由于是面向服务治理的框架,所有控制器不能直接访问数据库,必须通过调用client内的方法对服务层进行调用,服务层再通过model对数据进行grud操作,首先我们在App\Cms\Model\目录下新建一个Model_Article.php,内容如下:
namespace App\Cms\Model; use Lib\Bfw; use Lib\BoModel; /** * @author Herry * 文章数据模型 */ class Model_Article extends BoModel { protected $_prikey = "id"; protected $_isview = false; private static $_instance; function __construct() { $this->_connarray = Bfw::Config("Db", "adminconfig"); parent::__construct(); } /** * 获取单例 * * @return Model_Article */ public static function getInstance() { if (! (self::$_instance instanceof self)) { self::$_instance = new self(); } return self::$_instance; } }
这里面在构造函数中载入数据库的配置文件,并且指定了prikey,Bfw::Config("Db", "adminconfig")是调用App\Cms\Config\目录下的Db.php里面的数组adminconfig,这里面指定了数据库连接方式与账号密码,所有的model里面如果没有指定table,那么他的tablename就是这个表前缀+modelname,TB_PRE在config文件中的定义,如果要另外定义tablename,那么就要在Db.php中增加map数组,如下:
$_config_arr['Db']['map'] = [ "Article" => "pre_article", ];这样就把tablename映射为pre_article表了,创建完Model后,我们还要创建Service,在App\Service\Cms\文件夹下新建一文件Service_Article.php
namespace App\Cms\Service; use Lib\Bfw; use Lib\BoService; use App\Cms\Model\Model_Article; /** * * @author Herry * 文章服务 */ class Service_Article extends BoService { protected $_model = "Article"; private static $_instance; /** * 获取单例 * * @return Service_Article */ public static function getInstance() { if (! (self::$_instance instanceof self)) { self::$_instance = new self(); } return self::$_instance; } function getkey() { return "123"; } }这里面的$_model指定了绑定的model,getkey指定了在分布式服务下的验证秘钥,服务写好后,我们要客户调用类,在App\Cms\Client\文件夹下新建一文件Client_Article.php
namespace App\Cms\Client; use Lib\BoClient; /** * @author Herry * 文章调用类 */ class Client_Article extends BoClient { protected $_service_remote = false; private static $_instance; /** * 获取单例 * * @return Client_Aricle */ public static function getInstance() { if (! (self::$_instance instanceof self)) { self::$_instance = new self(); } return self::$_instance; } }这里面有一个变量叫$_service_remote,这个将在分布式服务中用到,现在相关的类建好后,我们要创建数据库了
DROP TABLE IF EXISTS `cms_Article`; CREATE TABLE `cms_Article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` char(50) DEFAULT NULL, `content` text, `classname` char(50) DEFAULT NULL, `atime` int(11) DEFAULT NULL, `sortid` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;创建完数据库后,我们再修改一下我们的控制器
namespace App\Cms\Controler; use Lib\Bfw; use Lib\BoControler; use App\Cms\Client\Client_Article; class Controler_Article extends BoControler { /** * 文章添加 */ function AddData() { $this->OutCharset("utf-8"); if ($this->IsPost()) { $_formdata = $this->FormArray(array( "title", "classname", "content" ), false, "Article"); if ($_formdata['err']) { return $this->Error($_formdata['data']); } $_formdata['data']['atime'] = UNIX_TIME; $_insertdata = Client_Article::getInstance()->Insert($_formdata['data']); if ($_insertdata['err']) { return $this->Error($_insertdata['data']); } return $this->Alert("添加成功", array( array( "返回", Bfw::ACLINK("Article", "ListData"), "" ) )); } $this->Display(); } /** * 文章删除 */ function DelData($id) { $_deldata = Client_Article::getInstance()->Delete($id); if ($_deldata['err']) { return $this->Error($_deldata['data']); } $this->Alert("删除成功", array( array( "返回", Bfw::ACLINK("Article", "ListData"), "" ) )); } /** * 文章编辑 */ function EditData($id) { $this->OutCharset("utf-8"); if ($this->IsPost()) { $_formdata = $this->FormArray(array( "title", "classname", "content", "id" ), false, "Article"); if ($_formdata['err']) { return $this->Error($_formdata['data']); } $_insertdata = Client_Article::getInstance()->Update($_formdata['data']); if ($_insertdata['err']) { return $this->Error($_insertdata['data']); } return $this->Alert("更新成功", array( array( "返回", Bfw::ACLINK("Article", "ListData"), "" ) )); } $_data = Client_Article::getInstance()->Single($id); if ($_data['err']) { return $this->Error($_data['data']); } $this->Assign("itemdata", $_data['data']); $this->Display(); } /** * 文章列表 */ function ListData($page = 0, $title = "", $classname = "") { $pagesize = 10; $this->OutCharset("utf-8"); $_wherestr = ""; $_wherearr = array(); if ($title != "") { $_wherestr .= " title=? "; $_wherearr[] = $title; } if ($classname != "") { $_wherestr .= " classname=? "; $_wherearr[] = $classname; } $_orderdata = Client_Article::getInstance()->Where($_wherestr, $_wherearr) ->PageNum($page) ->PageSize($pagesize) ->DescBy("id") ->Select(); if ($_orderdata['err']) { return $this->Error($_orderdata['data']); } $this->Assign("pagerdata", \Lib\Util\PagerUtil::_GenPageData($_orderdata['data']['count'], $page, $pagesize, 2)); $this->Assign("itemdata", $_orderdata['data']['data']); $this->Display(); } }view文件
AddData.php
<?php use Lib\Util\HtmlUtil; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>add article</title> </head> <body> <?=HtmlUtil::BeginForm()?> <label>标题</label><?=HtmlUtil::Input('title','',['type'=>'text'])?> <label>类别</label><?=HtmlUtil::Input('classname','',['type'=>'text'])?> <label>内容</label><?=HtmlUtil::Textarea('content','')?> <?=HtmlUtil::Input('submit','提交',['type'=>'submit'])?> <?=HtmlUtil::EndForm()?> </body> </html>EditData.php
<?php use Lib\Util\HtmlUtil; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>edit article</title> </head> <body> <?=HtmlUtil::BeginForm()?> <label>标题</label><?=HtmlUtil::Input('title',$itemdata['title'],['type'=>'text'])?> <label>类别</label><?=HtmlUtil::Input('classname',$itemdata['classname'],['type'=>'text'])?> <label>内容</label><?=HtmlUtil::Textarea('content',$itemdata['content'])?> <?=HtmlUtil::Input('submit','提交',['type'=>'submit'])?> <?=HtmlUtil::EndForm()?> </body> </html>ListData.php
<?php use ALib\Bfw; use Lib\Util\HtmlUtil; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>list article</title> </head> <body> <?php foreach($itemdata as $item){?> <?=$item['title']?> <?=HtmlUtil::Tag('a','编辑',['href'=>Bfw::ACLINK("Article","EditData","id=".$item['id'])])?> <?=HtmlUtil::Tag('a','编辑',['href'=>Bfw::ACLINK("Article","DelData","id=".$item['id'])])?> <?php } ?> <?=Bfw::Widget("Pager", $pagerdata)?> </body> </html>
在App/Cms/Widget/下建立分页Widget_Pager.php
<?php namespace App\Cms\Widget; use Lib\BoWidget; class Widget_Pager extends BoWidget { public function __construct(&$_data = null) { parent::__construct($_data); } public function Render() { $this->RenderIt("pager"); } } ?>
在App/Cms/View/Widget/目录下建立Pager.php
<div class="pagin"> <div class="message"> 共<i class="blue"><?=$widgetdata['totalsum']?></i>条记录,当前显示第<i class="blue"> <?=$widgetdata['currentpage']?> </i>页 </div> <ul class="paginList"> <?php foreach ($widgetdata['pagedata'] as $_item){?> <?php if($_item['urltype']=="prev"){?> <li class="paginItem"><a href="<?=$_item['url']?>" ><span class="pagepre"></span></a></li> <?php }elseif ($_item['urltype']=="page"){?> <li class="paginItem <?=$_item['current']?"current":""?>"><a href="<?=$_item['url']?>"><?=$_item['pagenum']?></a></li> <?php }elseif ($_item['urltype']=="next"){?> <li class="paginItem"><a href="<?=$_item['url']?>"><span class="pagenxt"></span></a></li> <?php }?> <?php }?> </ul> </div>
每一个控制器在外界被访问之前都要通过points进行处理,所以在App/Cms/Points/目录下建立Points_Article.php,暂时不做任何切点处理,所以代码为空
<?php namespace App\Cms\Points; class Points_Article { } ?>
在控制器AddData与EditData中都有一个验证器负责对form数据进行验证,我们在App/Cms/Validate/目录下新建Validate_Article.php
<?php namespace App\Cms\Validate; use Lib\Bfw; use Lib\BoValidate; /** * * @author Herry * 文章验证 */ class Validate_Article extends BoValidate { public $_validate_array = array( array( "classname", "require", "类别必填" ), array( "title", "require", "标题必填" ), array( "content", "require", "内容必填" ) ); } ?>本节就讲到这,看到这里是不是觉得很繁琐,其实这些都可以进行代码自动生成,在下一节中讲讲解怎么使用框架自带的代码生成器进行各层代码的自动生成
网友评论0