Desktop - 添加后台管理功能

  • app目录下引入dbeavdesktop软件包
dbeav http://svn.app.shopex.cn/dbeav
desktop http://svn.app.shopex.cn/desktop
  • 修改: app/notebook/app.xml,使notebook依附于desktop
        <depends>
            <app>base</app>
            <app>desktop</app>
        </depends>
    
  • 重新安装notebook
e:\webpub\ecos>core\cmd install -r notebook
Installing... dbeav
Creating table sdb_dbeav_meta_value_denum
Creating table sdb_dbeav_meta_value_int
Creating table sdb_dbeav_meta_value_datetime
Creating table sdb_dbeav_meta_value_decimal
Creating table sdb_dbeav_meta_refs
Creating table sdb_dbeav_meta_value_text
Creating table sdb_dbeav_recycle
Creating table sdb_dbeav_meta_value_varchar
Application dbeav installed... ok.
Installing... desktop
Creating table sdb_desktop_tag
Creating table sdb_desktop_hasrole
Creating table sdb_desktop_tag_rel
Creating table sdb_desktop_users
Creating table sdb_desktop_roles
Creating table sdb_desktop_user_flow
Creating table sdb_desktop_flow
Creating table sdb_desktop_role_flow
Installing service desktop_sidepanel_desktop_dashboard
Installing service desktop_finder_base_mdl_apps
Installing service app_content_detector
Installing panelgroup performance
Installing panelgroup setting
Installing panelgroup user
Installing panelgroup network
Installing panelgroup other
Installing adminpanel queue:index
Installing adminpanel system:basic
Installing adminpanel adminpanel:licence
Installing adminpanel region:index
Installing adminpanel users:index
Installing adminpanel roles:index
Installing adminpanel network:index
Application desktop installed... ok.
Creating table sdb_notebook_item
Installing service notebook_addon
Installing service desktop_finder.notebook_mdl_item
Installing Cache_Expires DB:NOTEBOOK_ITEM
UPDATE CACHE EXPIRES KV DATA
Installing menu notebook_ctl_admin_notebook
Installing workground notebook_admin_notebook
Installing permission notebook_manage
Application notebook installed... ok.
  • 修改映射文件config/mapper.php,让desktop接管/admin路径。
<?php
return array(
    ...
    
'/admin'=> array('app'=>'desktop'),
    ...
);


  • 添加后台菜单描述文件: app/notebook/desktop.xml
<desktop>
  <workground name="留言板管理" id="notebook_admin_notebook" controller="admin_notebook" action="index"  order="10">
    <menugroup name="留言板">
      <menu controller="admin_notebook" action="index" permission="notebook_manage" display="true" order="1010">留言编辑列表</menu>
    </menugroup>
  </workground>
  <permissions>
    <permission id="notebook_manage" display='true'>notebook操作</permission>
  </permissions>
</desktop>
  • 创建admin控制器文件夹:app/notebook/controller/admin
  • 创建留言列表管理控制器文件:app/notebook/controller/admin/notebook.php
    <?php
    class notebook_ctl_admin_notebook extends desktop_controller{
        function 
    index(){
            
    $this->finder('notebook_mdl_item',array('title'=>'留言列表','use_buildin_set_tag'=>true,'use_buildin_filter'=>true,'use_buildin_tagedit'=>true));

        }
    }
  • 重新修改数据库描述文件: app/dbschema/item.php 使之能支持desktop app
    <?php
    $db
    ['item']=
        array (
           
    'columns' =>
           array (
              
    'item_id' =>
              array (
                 
    'type' => 'number',
                 
    'required' => true,
                 
    'extra' => 'auto_increment',
                 
    'pkey' => true,
                 ),
              
    'item_subject' =>
              array (
                 
    'type' => 'varchar(100)',
                 
    'in_list'=>true,
                 
    'is_title'=>true,
                 
    'default_in_list'=>true,
                 
    'label'=>'书名',
                 
    'filtertype'=>true,
                 
    'searchtype'=>true,
                 
    'searchtype' => 'has',
                 ),
              
    'item_content' =>
              array (
                 
    'lable' => '内容',
                 
    'type' => 'text',
                 ),
              
    'item_posttime' =>
              array (
                 
    'in_list'=>true,
                 
    'default_in_list' => true,
                 
    'label' => '提交时间',
                 
    'type' => 'time',
                 ),
              
    'item_email' =>
              array (
                 
    'in_list'=>true,
                 
    'default_in_list' => true,
                 
    'label' => 'email',
                 
    'type' => 'email',
                 ),
              ),
           );
  • 重新安装一下 notebook

    我们对dbschmea 进行了重新定义, 而系统会通过dbschema的定义文件对系统进行一列的处理, 包括对数据库表的重新生成, 因此需要重新装一下, 当然也很简单

bryant@forsky /Users/bryant/codes/notebook/app/notebook %> sudo ~/codes/notebook/app/base/cmd install  -r notebook
Creating table sdb_notebook_item
Installing service notebook_addon
Installing service desktop_finder.notebook_mdl_item
Installing Cache_Expires DB:NOTEBOOK_ITEM
UPDATE CACHE EXPIRES KV DATA
Installing menu notebook_ctl_admin_notebook
Installing workground notebook_admin_notebook
Installing permission notebook_manage
Application notebook installed... ok.
  • 登陆到后台看一下成果


为finder添加查看编辑

desktop 提供了一个后端的管理体系, 其中最为强大的是他所带的finder它通过扩展dbschmema所定义的数据库描述文件, 基于数据库表, 提供包含数据展示 删除 过滤 搜索 tag 回收站等管理机制,它的扩展主要依赖于service的注册。我们下边会进一步进行扩展。

  • 现在为finder增加, 查看和编辑
  • 首先修改services.xml,添加一个新的service实例: app/notebook/services.xml
    <services>
      ...
      <service id="desktop_finder.notebook_mdl_item">
        <class>notebook_finder_item</class>
      </service>
      ...
    </services>
    
  • 建立service文件:
    1. app/notebook/lib/目录下新建文件夹finder
    2. app/notebook/lib/finder目录下新建文件item.php
    3. item.php内容如下:
<?php
class notebook_finder_item{
    var 
$column_edit '编辑';
    function 
column_edit($row){
        return 
'<a href="index.php?app=notebook&ctl=admin_notebook&act=edit&id='.$row['item_id'].'">编辑</a>';
    }

    var 
$detail_edit '详细列表';
    function 
detail_edit($id){
        
$render app::get('notebook')->render();
        
$oItem kernel::single("notebook_mdl_item");
        
$items $oItem->getList('item_subject, item_posttime, item_email',
                     array(
'item_id' => $id), 01);
        
$render->pagedata['item'] = $items[0];
        
$render->display('admin/itemdetail.html');
        
//return 'detail';
    
}

}
  • 修改留言列表管理控制器文件:app/notebook/controller/admin/notebook.php
  • 增加留言修改功能,新增代码如下:
        function edit(){
            header("cache-control:no-store,no-cache,must-revalidate");
            $id = $_GET["id"];
            $oItem = kernel::single('notebook_mdl_item');
            $row = $oItem->getList('*',array('item_id'=>$id),0,1);
            $this->pagedata['item'] = $row[0];
            $this->page('admin/edit.html');
        }
    
        function toEdit(){
        $oItem = kernel::single("notebook_mdl_item");
        $arr = $_POST['item'];
            $this->begin('index.php?app=notebook&ctl=admin_notebook&act=index');
        $oItem->save($arr);
            $this->end(true, "留言添加成功!");
    
        }
    
  • 新建留言详细视图文件:
    1. app/notebook/view/目录下新建文件夹admin
    2. app/notebook/view/admin目录下新建文件edit.html
    3. edit.html内容如下:
<form action="index.php?app=notebook&ctl=admin_notebook&act=toEdit" method="post">
  <input type="hidden" name="item[item_id]" value="<{$item.item_id}>" id="gEditor-GId-input"/>

  <table width="100%" border="0" cellpadding="0" cellspacing="0" class="gridlist">
    <tbody>
      <tr>
    <td>主题</td>
    <td><{input type="text" name="item[item_subject]" value=$item.item_subject}></td>
      </tr>
      <tr>
    <td>时间</td>
    <td><{input type="time" name="item[item_posttime]" value=$item.item_posttime}></td>
      </tr>
      <tr>
    <td>email</td>
    <td><{input type="text" name="item[item_email]" value=$item.item_email}></td>
      </tr>
      <tr>
    <td>内容</td>
    <td><{input type="textarea" name="item[item_content]" value=$item.item_content}></td>
      </tr>
      <tr>
        <td align="center" colspan="2"><{button class="btn-primary" type="submit" label="编辑"}></td>
      </tr>

    </tbody>
  <table>
</form>
  • 新建留言详细视图文件:app/notebook/view/admin/itemdetail.html
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <div class="tableform">
    <table width="100%" border="0" cellpadding="0" cellspacing="0" class="gridlist">
    <thead>
    <tr>
      <th>留言标题</th>
      <th>提交时间</th>
      <th>email</th>
    </tr></thead><tbody>
    
    
    <tr>
      <td><{$item.item_subject}></td>
      <td><{$item.item_posttime|cdate}></td>
      <td><{$item.item_email}></td>
    </tr>
    
    </tbody>
    </table>
    </div>
    </div>
    
  • 我们更新一下:


  • 效果如下:

finder动作栏添加增加新留言动作

  • 修改文件:app/notebook/controller/admin/notebook.php

    替换

    function index(){
       ...
    }
    
        function index(){
            $this->finder('notebook_mdl_item',
                  array('title'=>'留言列表',
                    'actions' =>
                    array(
                      array(
                        'label' => app::get('notebook')->_('添加留言'),
                        'icon' => 'add.gif',
                        'href' => 'index.php?app=notebook&ctl=admin_notebook&act=add',
                        //        'target' => '_blank'
                        ),
                      ),
                    'use_buildin_set_tag'=>true,
                    'use_buildin_filter'=>true,
                    'use_buildin_tagedit'=>true,
                            'use_buildin_set_tag'=>true,
                                'use_buildin_export'=>true,
                        'use_buildin_import'=>true,
                                'allow_detail_popup'=>true,
                                //'use_view_tab'=>true,
                    ));
    
    
        }
    

  • 在留言列表管理控制器文件增加"添加留言"的处理函数:app/notebook/controller/admin/notebook.php
       function add(){
            $this->page('admin/edit.html');
        }
    
    
  • 现在到后台去看一下成果:


desktop_controller的详细用法

desktop_controller:finder($model_object_name, $params) -> void
    类型:
    $model_object_name = string()
    $params =  array(
        'title' => string(),
        'actions' =>  $actions,
        'use_buidinin_set_tag' => bool(), //default: false
        'use_buildin_filter' => bool(), //default: false
        'use_buildin_tagedit' =>  bool(), //default: true
        'use_buildin_set_tag' => bool(), //default: false
        'use_buildin_export' => bool(), //default: false
        'use_buildin_import' => bool(), //default: false
        'allow_detail_popup'=> bool(), //default: false
        'use_view_tab' => bool(), //default: false
        'max_actions' => int(), //defaut: 7
        'delete_confirm_tip' => string(), //default: ''
        'filter' => array())
    $actions = array(
        array(
               'label' => string(),
            'icon' => string(),
            'href' => string))

    参数描述:
        $params: 参数
            * title, finder列表名称
        * actions, 操作面板上的动作
            * use_buildin_set_tag, 是否可以设置tag
            * use_buildin_tagedit, 是否可以tag编辑
            * use_buildin_export, 是否支持导出.
            * use_buildin_import, 是否支持导入
            * use_buildin_filter, 是否支持过滤器
            * allow_detail_popup, 是否支持行数据详细页面弹出
        * use_view_tab, 是否使用finder显示标签
            如果选择开启finder显示标签, 继承desktop_controller的类需要重载 _views 函数
        * max_actions, finder面板支持最大的action数量

    $actions: 操作面板上的动作
        * label 列名称
        * icon 图标
        * href 链接地址

    函数描述:
        输出finder列表

desktop_controller:_views() -> $show_menus
    类型:
        $show_menus = array(
        array(
            'filter' => string(),
        'addon' => int(),
        'href' => string())

    参数描述:
    $show_menus
        * filter 标签过滤器
        * addon 过滤出的数量
        * href 连接地址, 链接地址需要加入 view参数, view参数为, 本标签在
          $show_menus数组里的 key 值,例如:
          index.php?app=notebook&ctl=admin_notebook&act=index&view=1

    函数描述:
        如果在用户控制里调用 finder 函数,use_view_tab设置为true时, finder输出时会
        调用_views()以显示 finder的标签.

內容目录

上一个主题

Service - app间的扩展机制

下一个主题

Site - 让前端更优雅

快速搜索

输入相关的模块,术语,类或者函数名称进行搜索