【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.没办法只能自己想办法造轮子了. 查了许多资 ...
随机推荐
- ui-router带参数的路由配置
ui-router带参数的路由配置 使用ng-route的时候带参数的连接这样配置: $routeProvider.when('item/itemid/:itemid', { templateUrl: ...
- java三大循环:for、while、do...while
1.while和do...while的区别: while 与 do...while之间的区别:如果布尔表达式第一次执行的结果就为false,那么while循环一次也不执行:do...while循环会执 ...
- POJ1014 解题报告(DFS)
题目在此:http://poj.org/problem?id=1014 要看清题意呢,题中要求输入的是价值分别为1,2,3,4,5,6的大理石的个数,而不是6块价值为输入数字的大理石!选这个题主要想练 ...
- Form的enctype="multipart/form-data"作用
<form class="form-horizontal" role="form" method="post" action=&quo ...
- JSON学习之一
1.JSON:JavaScript Object Notation(javaScript对象表示法),JSON是存储和交换文本信息的语法,类似XML:JSON比XML更小,更快,更易解析: { &qu ...
- js中关于value的一个小知识点(value既是属性也是变量)
今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" v ...
- 自己的JS框架--Amy框架。
这是我根据司徒正美<JavaScript框架设计>一书然后百度了很多东西之后自己写的一个JS框架,满足了司徒正美文中的种子模块部分,包含了命名空间.对象扩展.数组化.类型判断.选择器.多库 ...
- 各种排序算法的分析及java实现
排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间 ...
- Windows Azure Virtual Machine (29) 修改Azure VM 数据磁盘容量
<Windows Azure Platform 系列文章目录> 当我们使用Windows Azure管理界面,创建Azure虚拟机的时候,默认挂载的磁盘是固定大小的 1.比如我创建1个Wi ...
- SQL Server 存储(4/8):理解Page Free Space (PFS) 页
我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free Space (PFS) ). PFS在数据文件里是第2页(页号1,页号从0开始),接 ...