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‘);
-
}
-
-
-
-
-
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‘,
-
array(
-
‘items‘ => $items,
-
-
),
-
true
-
);
-
}
-
}
-
?>
2、编写文章模型对象代码。如下所示:
-
<?php
-
-
-
-
-
class Model_Articles
-
{
-
var $_tblArt;
-
-
-
-
-
-
function Model_Articles()
-
{
-
$this->_tblArt = & FLEA::getSingleton(‘Table_Articles‘);
-
}
-
-
-
-
-
-
-
function _processTags(& $row) {
-
-
$tblTags = & FLEA::getSingleton(‘Table_Tags‘);
-
-
$rows = $tblTags->findAll(null);
-
-
FLEA::loadFile(‘FLEA_Helper_Array.php‘);
-
$existsTags = array_to_hashmap($rows, ‘label‘, ‘tag_id‘);
-
-
-
$labels = explode(‘,‘, $row[‘tags‘]);
-
-
$tagsIdList = array();
-
foreach ($labels as $label) {
-
$label = strtolower(trim($label));
-
if ($label == ‘‘) {
-
continue;
-
}
-
if (isset($existsTags[$label])) {
-
-
$tagsIdList[] = $existsTags[$label];
-
} else {
-
-
$tag = array(‘label‘ => $label);
-
$tagsIdList[] = $tblTags->create($tag);
-
}
-
}
-
-
$row[‘tags‘] = $tagsIdList;
-
-
}
-
-
-
-
-
-
-
-
function create(& $row) {
-
$this->_processTags($row);
-
$this->_tblArt->enableLink(‘tags‘);
-
return $this->_tblArt->create($row);
-
}
-
-
-
-
-
-
-
-
function update(& $row) {
-
$this->_processTags($row);
-
$this->_tblArt->enableLink(‘tags‘);
-
return $this->_tblArt->update($row);
-
}
-
}
-
?>
第四步、编写HTML模板代码
因为要利用到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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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()
-
);
-
-
......
-
-
$this->tpl->assign(‘art‘, $data);
-
-
......
-
}
-
-
-
-
-
-
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>
最后,实现的效果如下图所示:
javaeye博客的收藏管理页面,布布扣,bubuko.com
javaeye博客的收藏管理页面
原文:http://blog.csdn.net/tfy1332/article/details/22808627