dbeav https://svn.app.shopex.cn/dbeav desktop https://svn.app.shopex.cn/desktop
    <depends>
        <app>base</app>
        <app>desktop</app>
    </depends>
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.
<?php
return array(
    ...
    '/admin'=> array('app'=>'desktop'),
    ...
);

<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>
<?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));
    }
}
<?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',
             ),
          ),
       );
我们对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.

desktop 提供了一个后端的管理体系, 其中最为强大的是他所带的finder。它通过扩展dbschmema所定义的数据库描述文件, 基于数据库表, 提供包含数据展示 删除 过滤 搜索 tag 回收站等管理机制,它的扩展主要依赖于service的注册。我们下边会进一步进行扩展。
<services>
  ...
  <service id="desktop_finder.notebook_mdl_item">
    <class>notebook_finder_item</class>
  </service>
  ...
</services>
<?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), 0, 1);
        $render->pagedata['item'] = $items[0];
        $render->display('admin/itemdetail.html');
        //return 'detail';
    }
}
    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, "留言添加成功!");
    }
<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>
<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>
 

替换
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,
                ));
    }
   function add(){
        $this->page('admin/edit.html');
    }

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的标签.