【thinkphp5】【THINKCMG】标签部分开发(一)
最近打算开一个自己的CMS后台轮子,框架选择了thinkphp 5 (别问我为什么选择这个框架)然后想边开发边记录一下,方便自己方便他人
进入正题
1.数据库设计
一共三张表
post文章表这个就不贴了(在这里没有使用到)
主要是以下两张
一张是存储标签的tag表,
另一张是关系表用于关联标签与文章
2.代码部分
主要我们使用到了thinkphp5的多对多关联(想详细了解的可以看这里 多对多关联)
文章表对应的模型
model/Posts.php
<?php namespace app\admin\model; use think\Model; class Posts extends Model
{
protected function initialize()
{
parent::initialize();
}
public function tag()
{
return $this->belongsToMany('Tags', 'tag_relationships');
}
}
主要是tag这个函数通过belangsTomany把文章表与标签和关系表做个关联
因为我们还要做到标签找到相关文章我们还得给标签模型加个关联
标签表对应模型
model/Tags.php
<?php namespace app\admin\model; use think\Model; class Tags extends Model
{
protected function initialize()
{
parent::initialize();
}
public function post()
{
return $this->belongsToMany('Posts', 'tag_relationships');
} }
一样的道理不在叙述
下面开始控制器部分
先写新发表文章的标签部分
controller/Post.php
public function doadd(Request $request)
{
<span style="white-space:pre"> </span>//文章部分不再贴出,但需要先进行写入然后返回文章uid
$result = $request->param();
$re_tags = explode(',', $result['tags']);
// 标签写入
for ($i=0; $i <count($re_tags); $i++) {
$data[]=['name'=>$re_tags[$i]];
}
$post = PostAdminModel::get($uid);
$post->tag()->saveAll($data);
}
说明
$result //post数组
$uid //文章储存完后返回来的主键uid
因为前端标签插件发送的数据格式是通过逗号分隔,所以我们接收到数据后转换为['key'=>'value'](在代码中name是我标签表中标签名字对应的键值名)方便接下来的操作
接下来就是通过Post模型静态调用get方法(默认输入为主键)
然后通过批量增加关联数据操作把刚才我们组合的标签数组传进来
这样新增就完成了
接下来我们开始写编辑页的标签操作
在这里我们先分析一下我们的标签可能的操作
1.删除标签但不删除标签库中的
2.新增标签但是不存在于标签表中
3.新增标签但是存在于标签表中
4.取出全部标签
public function edit($uid)
{
if (Request::instance()->isPost()) {
$request = Request::instance();
$result = $request->param();
//标签 Start
$re_tags = $result['tags'];
$taglist = explode(',',$re_tags);
$post = PostAdminModel::get($uid);
foreach($post->tag as $value)
{
$orglist[] = $value['name'];
}
//删除标签 <pre name="code" class="php"> //文章的关联标签与前端传递过来的标签进行对比(顺序不能错了)如果存在值则进行删除操作
$dellist=array_diff($orglist,$taglist);
if($dellist)
{
foreach($dellist as $value)
//删除关联操作
$tag = TagsAdminModel::getByName($value);
$post->tag()->detach($tag);
}
//增加标签
//与之前的比较相反即增加操作
$addlist=array_diff($taglist,$orglist);
if($addlist)
{
foreach($addlist as $value)
{
<span style="white-space:pre"> </span> //标签存在于标签库中则只增加关联,不存在则新增
$tagresult= TagsAdminModel::getByName($value);
if($tagresult)
{
$tagid = $tagresult->value('id');
$post->tag()->attach($tagid); }else{
$post->tag()->save(['name'=>$value]);
}
}
}
//标签 End
}
}
//渲染获取文章数据
//因为我们进行了关联所以可以直接通过查询文章表并获取到标签集
$request=PostAdminModel::get($uid);
$tags="";
for ($i=0; $i <count($request->tag); $i++) {
$tags .= $request->tag[$i]['name'].',';
}
$this->assign('tags', $tags);
return $this->fetch();
}
改说的都写在注释里了
其实关于后台的标签操作还有就是单独对于标签的操作
这个就相对简单了直接操作标签的增加删除修改即可
但是在删除的时候一定要注意先进行关联删除再进行标签的删除
前端显示就是文章本身的标签显示这个也简单
还有就是标签反查文章基本方法我在上面都写了
可以按照需求进行修改即可
不出意外我后续还会续上
写的可能很啰嗦很乱 大家凑活看吧~
有问题可以留言问
【thinkphp5】【THINKCMG】标签部分开发(一)的更多相关文章
- javaweb学习总结(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- Struts1基础、使用Struts实现登录、使用Struts HTML标签简化开发
Struts 1基础 为什么重拾Struts 1 曾经是最主流的MVC框架 市场份额依然很大 很多遗留系统中依旧使用 维护和升级都需要熟悉Struts 1 与Struts 2相比 编码.配置繁琐 侵入 ...
- javaweb(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- javaweb基础(26)_jsp标签库开发二
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- Jsp标签字典开发_基于Spring+Hibernate
目录 1. Jsp标签字典开发_基于Spring+Hibernate 1.1. 简述 1.2. 定义DictItem实体 1.3. 定义字典的@interface 1.4. 定义字典缓存类 1.5. ...
- JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门
2 JSP内置标签(美化+业务逻辑) 1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容 2)JSP内 ...
- JSP简单标签标签库开发
1.定制标签的实现类称为标签处理器,简单标签处理器指实现SimpleTag接口的类,如下图的SimpleTagSupport类,该类为SimpleTag接口的默认实现类. 注:不要直接实现Simple ...
- THINKPHP5 volist标签循环不能设置循环变量为$i
在thinkphp5的volist标签中不要用$i作为id,举个简单例子 控制器这样写 模板这样写 结果是 这很令人费解啊.然后换一个循环变量看看 循环正常了,看来这个id这里设置循环变量的时候 不能 ...
- Blazor Webassembly多标签页开发
最近准备用Blazor Webassembly做后台开发要用到多标签页,找了半天发现绝大多数都是Blazor Server的多标签没有Webassembly.没办法只能自己想办法造轮子了. 查了许多资 ...
随机推荐
- 大数据时代的IT架构设计
大数据时代的IT架构设计(来自互联网.银行等领域的一线架构师先进经验分享) IT架构设计研究组 编著 ISBN 978-7-121-22605-2 2014年4月出版 定价:49.00元 208页 ...
- 安卓学习进程(2)Android开发环境的搭建
本节将分为五个步骤来完成Android开发环境的部署. 第一步:安装JDK. 第二步:配置Windows上JDK的变量环境 . 第三步:下载安装Eclipse . 第四步:下载安装Androi ...
- 快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...
- 关于IIS部署时出现“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”的问题解决摘要
系统环境:windows2008 X64 IIS版本:iis7 oracle客户端版本:11g,另外装了32位的客户端. 网站.net framework版本: 4.0 目前状况,IIS可以正常运行, ...
- 面试准备 - HashTable 的C#实现 开放地址法
Hashtable是很经常在面试中遇到的数据结构,因为他的O(1)操作时间和O(n)空间 之所以自己写一份是因为: 加深对于hashtable的理解 某些公司面试的时候需要coding....... ...
- 理解ip和端口
理解IP和端口 IP地址是一个规定,现在使用的是IPv4,既由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可.在计算机中,IP地址是分配给网卡的,每个网卡有一个唯一的IP地址,如果 ...
- tomcat 容器生命周期lifecycle
1.复习java的事件机制 java事件机制包括三个部分:事件.事件监听器.事件源. 事件:一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息. 事件监听器:实 ...
- 机器学习&数据挖掘笔记_19(PGM练习三:马尔科夫网络在OCR上的简单应用)
前言: 接着coursera课程:Probabilistic Graphical Models上的实验3,本次实验是利用马尔科夫网络(CRF模型)来完成单词的OCR识别,每个单词由多个字母组合,每个字 ...
- 索引深入浅出(3/10):聚集索引的B树结构
在SQL Server里,有2种表是以存储为基础的.有聚集索引的表叫聚集表,没有聚集索引的表叫堆表.在上一篇文章,我们讨论了堆表的特性和存储结构.在这篇文章里,我们来看下聚集表. 有聚集索引的表叫聚集 ...
- Java魔法堂:内部类详解
一.前言 对于内部类平时编码时使用的场景不多,比较常用的地方应该就是绑定事件处理程序的时候了(从C#.JS转向Java阵营的孩子总不不习惯用匿名内部类来做事件订阅:().本文将结合Bytecode对四 ...