【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.没办法只能自己想办法造轮子了. 查了许多资 ...
随机推荐
- Atitit 信用卡与会员卡(包括银行卡)的发展之路
Atitit 信用卡与会员卡(包括银行卡)的发展之路 实现跨机构卡片内金额的流动解决方案 1.1. 财务卡片本质上都是会员卡1 1.2. 卡片的发展阶段1 2. 实现跨机构卡片内金额的流动解决方案(加 ...
- Atitit qzone qq空间博客自动点赞与评论工具的设计与实现
Atitit qzone qq空间博客自动点赞与评论工具的设计与实现 Qzone发送评论的原理 首先,有个a标签, <a class="c_tx3" href="j ...
- Ecshop :后台添加新功能 菜单及 管理权限 配置
需求:在<商品管理>下增加一项[商品推广管理]功能 一. 添加菜单项 打开 /admin/includes/inc_menu.php 文件(后台框架左边菜单),在最后添加一行如下: $mo ...
- java之设计模式
一.代理模式 a.抽象角色(接口):声明真实对象和代理对象的共同接口 b.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能替 ...
- 为什么获取的System.Web.HttpContext.Current值为null,HttpContext对象为null时如何获取程序(站点)的根目录
ASP.NET提供了静态属性System.Web.HttpContext.Current,因此获取HttpContext对象就非常方便了.也正是因为这个原因,所以我们经常能见到直接访问System.W ...
- 使用__slots__限定实例的成员列表
使用__slots__限定实例的成员列表 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应 ...
- Mybatis中SqlMapper配置的扩展与应用(1)
奋斗了好几个晚上调试程序,写了好几篇博客,终于建立起了Mybatis配置的扩展机制.虽然扩展机制是重要的,然而如果没有真正实用的扩展功能,那也至少是不那么鼓舞人心的,这篇博客就来举几个扩展的例子. 这 ...
- hibernate(四) 双向多对多映射关系
序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...
- ASP.NET MVC 4使用PagedList.Mvc分页
ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用Paged ...
- android rectF
new Rect(left , top, right , bottom) 这个构造方法需要四个参数这四个参数 指明了什么位置 ?我们就来解释怎么画 这个 矩形 这四个 参数 分别代表的意思是:left ...