`
hegz
  • 浏览: 444853 次
  • 性别: Icon_minigender_1
  • 来自: 茂名
社区版块
存档分类
最新评论

类javaeye博客我的收藏页面中分类标签输入功能的实现

阅读更多

javaeye博客的收藏管理页面,收藏分类是通过下拉列表选择来录入已有分类标签的,这个功能非常方便实用,因为不用死记旧标签,还提高了标签的录入效率,于是决定自己模仿也搞一个。



 

在开始之前,先说明一下,以下的模仿过程全部处于FleaPHP框架之下,数据库为MySQL。

以下为功能实现的整个过程。

第一步:相关数据表准备

先创建一个文章管理数据表articles,该表含有一个自增量字段art_id。
接着创建一个分类标签数据表tags,其表结构如下图所示:


 
再创建一个中间表articles_tags,其表结构如下图所示:


 
第二步:编写数据表对象代码

1、编写文章数据表对象代码。如下所示:

<?php

FLEA::loadClass('FLEA_Db_TableDataGateway');

/**
 * 文章数据表对象
 */
class Table_Articles extends FLEA_Db_TableDataGateway
{
    var $tableName = 'articles';
    var $primaryKey = 'art_id';

    /**
     * 定义多对多关系
     *
     */
    var $manyToMany = array(
        array(
            'tableClass'      => 'Table_Tags',
            'joinTable'       => 'articles_tags',
            'foreignKey'      => 'art_id',
            'assocforeignKey' => 'tag_id',
            'mappingName'     => 'tags',
            'enabled'          => false
        )
    );
}
?>
 

2、编写分类标签数据表对象代码。如下所示:

<?php

FLEA::loadClass('FLEA_Db_TableDataGateway');

/**
 * 分类标签数据表对象
 */
class Table_Tags extends FLEA_Db_TableDataGateway
{
    var $tableName = 'tags';
    var $primaryKey = 'tag_id';
}
?>
 

第三步:编写模型对象类代码

1、编写分类标签模型对象类代码。如下所示:

<?php

/**
 * 分类标签模型对象类
 */
class Model_Tags
{
    var $_tblTags;

    /**
     * 构造函数
     *
     */
    function Model_Tags()
    {
        $this->_tblTags = & FLEA::getSingleton('Table_Tags');
    }

    /**
     * 生成标签下拉列表HTML代码
     */
    function makeTagsDropdownlist()
    {
        $ui = & FLEA::initWebControls();
        FLEA::loadFile('FLEA_Helper_Array.php');

        $rows = $this->_tblTags->findAll();

        // 增加一个下拉选择项在最前面
        array_unshift($rows, array('tag_id' => 0, 'label' => '选择已有分类'));

        $items = array_to_hashmap($rows, 'label', 'tag_id');

        return $ui->control(
            'dropdownlist',
            'tagsel',  // 下拉列表ID
            array(
                'items' => $items,
                //'selected' => null,
            ),
            true // 指示返回html代码,如果为false,则不返回
        );
    }
}
?>
 

2、编写文章模型对象代码。如下所示:

<?php

/**
 * 文章模型对象
 */
class Model_Articles
{
    var $_tblArt;
   
    /**
     * 构造函数
     *
     */
    function Model_Articles()
    {
        $this->_tblArt = & FLEA::getSingleton('Table_Articles');
    }
   
    /**
     * 完成对文章条目所关联的 tags 的处理
     *
     * @param array $row
     */
    function _processTags(& $row) {
        // 读出数据库现有的所有 tags
        $tblTags = & FLEA::getSingleton('Table_Tags');

        $rows = $tblTags->findAll(null);
       
        FLEA::loadFile('FLEA_Helper_Array.php');
        $existsTags = array_to_hashmap($rows, 'label', 'tag_id');

        // 处理用户输入的 tags
        $labels = explode(',', $row['tags']);
        //$labels = explode(',', $tags);
        $tagsIdList = array();
        foreach ($labels as $label) {
            $label = strtolower(trim($label));
            if ($label == '') {
                continue;
            }
            if (isset($existsTags[$label])) {
                // 将文档登记到现有 tag
                $tagsIdList[] = $existsTags[$label];
            } else {
                // 创建新 tag,并登记文档
                $tag = array('label' => $label);
                $tagsIdList[] = $tblTags->create($tag);
            }
        }

        $row['tags'] = $tagsIdList;
        //return $tagsIdList;
    }
   
    /**
     * 新增文章
     *
     * @param array $row
     * @return int
     */
    function create(& $row) {
        $this->_processTags($row);
        $this->_tblArt->enableLink('tags');
        return $this->_tblArt->create($row);
    }
   
    /**
     * 更新文章
     *
     * @param array $row
     * @return int
     */
    function update(& $row) {
        $this->_processTags($row);
        $this->_tblArt->enableLink('tags');
        return $this->_tblArt->update($row);
    }
}
?>
 

第四步、编写HTML模板代码

因为要利用到jQuery,所以模板文件要引入jQuery库文件。如下所示:

<!-- // 引入 jQuery 库文件 -->
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>

 

模板文件中与标签相关的HTML代码:

<tr>
   <td>分类标签:</td>
   <td><input name="tags" type="text" id="tags" size="30" />
{{ $art.taglist }}*多个标签之间用半角逗号分隔</td>
</tr>
 

编写选择录入已有标签的JavaScript代码:

<script type="text/javascript">
    $(function() {
        $("#tagsel").change(function(){
            var txt = $("option:selected", this).text();
            if (txt == '选择已有分类') {
                txt = '';
            } else {
                var label = $("#tags").val();
                if (label) {
                    txt = label +  ', ' + txt;
                }
            }
            $("#tags").val(txt);
        });
    });
</script>
 

第五步:编写后台文章控制器类代码

<?php
/**
 * 办公网站后台管理——文章管理控制器类
 *
 * 文 件 名:Admin/Controller/Article.php
 * 作    者:hegz
 * 更新时间:2010/05/07
 *
 */

/**
 * 装入后台管理控制器基类
 */

//{{
FLEA::loadClass('Controller_AdminBase');
//}}

class Controller_Article extends Controller_AdminBase
{
    var $_modelArt;

    /**
     * 构造函数
     *
     */
    function Controller_Article()
    {
        parent::Controller_AdminBase();
        $this->_modelArt = & FLEA::getSingleton('Model_Articles');
    }

   /**
    * 显示新增文档界面操作
    *
    */
    function actionAdd()
    {
        ......
       
        $tags = & FLEA::getSingleton('Model_Tags');
        $data = array(
            'header' => '攒写文档',
            'action' => $this->_url('Save'),
            'taglist' => $tags->makeTagsDropdownlist()  // 注意此句代码,生成下拉列表HTML代码
        );

        ......

        $this->tpl->assign('art', $data);   // Smarty模板引擎变量替换

        ......
    }

    /**
     * 保存文档操作
     *
     */
    function actionSave()
    {
        $data = $_POST;

        ......
       
        if ($data['art_id']) {
            $this->_modelArt->update($data);
            $art_id = $data['art_id'];
        } else {
            $art_id = $this->_modelArt->create($data);
        }
       
        ......
    }
}

 

 

结束语

 

上面的实现过程由于要考虑新标签的保存及旧标签的处理,以及文章表与标签表的多对多关联,所以看上去有些复杂。如果不考虑这些实现,就只是下面几行处理标签录入的JavaScript代码的事。

<script type="text/javascript">
	$(function() {
        $("#tagsel").change(function(){
            var txt = $("option:selected", this).text();
            if (txt == '选择已有分类') {
                txt = '';
            } else {
				var label = $("#tags").val();
				if (label) {
					txt = label +  ', ' + txt;
				}
			}
			$("#tags").val(txt);
        });
	});
</script>

 

最后,实现的效果如下图所示:

 

论坛贴:http://qeephp.com/bbs/viewthread.php?tid=10969&page=1&extra=#pid56693

 

 

 

  • 大小: 6 KB
  • 大小: 3.1 KB
  • 大小: 19.2 KB
  • 大小: 16.6 KB
  • 大小: 3 KB
1
3
分享到:
评论

相关推荐

    给家爱BBS的快速回复加入留言簿里的表情

    3. **DOM操作**:如何使用JavaScript操作DOM(Document Object Model)来动态更新页面,确保表情可以在用户的输入中正确显示。 4. **用户体验优化**:如何设计表情选择界面,使其易于使用且不影响整体布局。可能...

    远程键盘映射工具Java

    1. "Java语言的Hook实现 - 当程序爱上游戏 - JavaEye技术网站.mht" 这个文件可能是一个网页存档,包含了关于Java Hook技术的详细讲解,可能涉及到具体的实现细节,如如何使用JNI进行hook,以及在游戏场景下的应用。...

    Struts2动态树的一些文章和案例

    在JAVAeye等社区中,可能包含的文章和案例展示了如何在实际项目中运用Struts2构建动态树。这些案例可能涵盖了从简单的静态树到复杂的动态加载树,以及如何处理异步请求和错误处理等各种情况。 7. **最佳实践** - ...

    Python DjangoBook中文版

    这本书由hideto翻译并发布在JavaEye社区,为中文阅读者提供了方便的学习资源。 Django是一个用Python编写的开源Web应用框架,它遵循“DRY(Don't Repeat Yourself)”原则,致力于简化网页开发过程,提供高效、可...

    pimpinella_3cd_01_0716.pdf

    pimpinella_3cd_01_0716

    FIB English learning

    FIB English learning

    linux下 jq 截取json文件信息

    X86-jq安装包

    [AB PLC例程源码][MMS_046356]SELX.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    大圣挪车小程序1.3.5+前端.zip

    大圣挪车小程序1.3.5 前端

    Manus.im 产品及开发团队研究报告.pdf

    Manus.im 产品及开发团队研究报告.pdf

    [AB PLC例程源码][MMS_044663]Control daisy chain wiring in Fieldbus Foundation.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    sun_3ck_01a_0918.pdf

    sun_3ck_01a_0918

    支持适用于PERC H330/H730/H730P/H830/H730P系列RAID卡MX/FD33xD/FD33xS控制器的驱动安装指南

    下载 1. 单击“立即下载”,以下载该文件。 2. 出现“文件下载”窗口后,单击“保存”,以将文件保存到硬盘。 安装 1. 浏览至文件下载目标位置并双击新下载的文件。 2. 仔细阅读对话窗口中显示的发布信息。 3. 下载并安装对话窗口中标识的任何必备项,然后再继续。 4. 单击“Install”(安装)按钮。 5. 按照其余提示执行更新。 安装 1. 将解压的文件复制到可访问Windows的介质。 2. 将系统重新引导至Windows操作系统。 3. 打开“服务器管理器”->“设备管理器”->“存储控制器”,然后单击“PERC控制器”。 5. 单击“更新驱动程序软件”,并按照提示更新驱动程序。 4. 重新引导系统以使更改生效。

    硬盘安装器,支持硬盘安装,无需制作U盘PE!

    支持所有操作系统一键安装。

    matlab程序代码项目案例:使用 Simulink 进行自适应 MPC 设计

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_044098]1769-ASCII Simultaneous Mode.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    swanson_01_1106.pdf

    swanson_01_1106

    [AB PLC例程源码][MMS_047811]SAF1 - Store.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_043879]Programming in SFC and ST Language.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    sun_3ck_01_0919.pdf

    sun_3ck_01_0919

Global site tag (gtag.js) - Google Analytics