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
分享到:
相关推荐
javaeye被黑 大家看看
JavaEye热点阅读是JavaEye论坛推出的2009年2月特辑,旨在为Java学习者和开发者提供最新的知识及行业动态。这份资料包含了多个Java相关的主题,包括但不限于并发编程、开源项目、设计模式、框架应用以及软件开发实践...
JavaScript代码通常会遍历网页中的代码块,根据预定义的规则(如类名或属性)对代码进行分析和格式化,然后应用CSS样式实现高亮。 4. **shCoreCommon.js**:这个名字暗示它可能是SyntaxHighlighter库的一部分,提供...
- **用途**:实现全文检索功能。 - **特点**:可根据具体需求调整和优化。 **3. Attachment_fu** - **用途**:处理附件存储,利用 ActiveRecord 的多态关联特性。 **4. Cache_fu** - **功能**:对象缓存和查询...
3. **API理解和使用**:学习JavaEye库提供的类和方法,如创建PDF文档对象,添加页面,插入文本和图片,设置样式等。 4. **数据格式化**:根据PDF的需求,可能需要对数据进行格式化,例如将数据库查询结果转化为适合...
JavaEye Client SourceCode是一个开源项目,专为Android平台设计,提供了JavaEYE的客户端实现。这个项目的源代码为我们提供了一个深入了解Android应用开发以及Java编程在移动设备上的实践的宝贵资源。接下来,我们将...
开发者可以通过反编译工具查看这些类,了解JavaEye的具体实现逻辑。 `resources.arsc`文件存储了应用的所有资源的引用表,包括字符串、颜色、图像、布局等。在JavaEye中,这个文件可能包含了用户界面的各种元素,...
JavaEye是一个知名的中国IT社区,其代码高亮功能在编程交流中非常有用,能够使得代码更加清晰易读。麦库则是一款在线笔记应用,可能包括代码存储和分享的功能。此插件的目的是改善麦库客户端对于代码片段的展示效果...
javaeye的信息提示框代码之css,application.js
JavaEye+技术架构,讲述java框架的应用
JavaEye客户端是一款基于Java开发的开源软件,专为学习和理解客户端编程技术而设计,尤其适合初学者。这个客户端代码库包含了许多与网络通信相关的功能,主要集中在HTTP协议的使用和数据解析上。通过深入研究JavaEye...
在这个场景中,我们使用HttpClient来调用JavaEye API来验证用户。JavaEye可能是一个提供用户认证服务的平台,而API则提供了验证用户身份的功能。 以下是一个关于如何使用HttpClient调用JavaEye API的基本步骤: 1....
Validator可能是指数据验证工具,例如在Web开发中用于校验用户输入,或者在软件工程中用于确保代码质量的静态代码分析工具。这类工具通常会提供详细的使用指南和API参考,帮助开发者理解和使用验证功能。 结合以上...
【3】电子书chm格式(含图片,按文章类别分组)【强烈推荐】(chm):文件中含图片,无需连网,保持博客样式,按照文章类别进行分类,更加清晰,方便浏览。 【4】分页电子书(chm):可以设置分页,更适合微博电子书,...
总结,Android JavaEye客户端的开发涉及了Android平台的基础知识,包括UI设计、网络通信、数据解析、缓存策略以及社交功能的实现。对于开发者而言,理解这些技术要点有助于构建自己的Android应用,同时也能更好地...