最近打算开一个自己的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】标签部分开发(一)的更多相关文章

  1. javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  2. Struts1基础、使用Struts实现登录、使用Struts HTML标签简化开发

    Struts 1基础 为什么重拾Struts 1 曾经是最主流的MVC框架 市场份额依然很大 很多遗留系统中依旧使用 维护和升级都需要熟悉Struts 1 与Struts 2相比 编码.配置繁琐 侵入 ...

  3. javaweb(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  4. javaweb基础(26)_jsp标签库开发二

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  5. Jsp标签字典开发_基于Spring+Hibernate

    目录 1. Jsp标签字典开发_基于Spring+Hibernate 1.1. 简述 1.2. 定义DictItem实体 1.3. 定义字典的@interface 1.4. 定义字典缓存类 1.5. ...

  6. JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门

    2 JSP内置标签(美化+业务逻辑)   1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容   2)JSP内 ...

  7. JSP简单标签标签库开发

    1.定制标签的实现类称为标签处理器,简单标签处理器指实现SimpleTag接口的类,如下图的SimpleTagSupport类,该类为SimpleTag接口的默认实现类. 注:不要直接实现Simple ...

  8. THINKPHP5 volist标签循环不能设置循环变量为$i

    在thinkphp5的volist标签中不要用$i作为id,举个简单例子 控制器这样写 模板这样写 结果是 这很令人费解啊.然后换一个循环变量看看 循环正常了,看来这个id这里设置循环变量的时候 不能 ...

  9. Blazor Webassembly多标签页开发

    最近准备用Blazor Webassembly做后台开发要用到多标签页,找了半天发现绝大多数都是Blazor Server的多标签没有Webassembly.没办法只能自己想办法造轮子了. 查了许多资 ...

随机推荐

  1. Atitit 信用卡与会员卡(包括银行卡)的发展之路

    Atitit 信用卡与会员卡(包括银行卡)的发展之路 实现跨机构卡片内金额的流动解决方案 1.1. 财务卡片本质上都是会员卡1 1.2. 卡片的发展阶段1 2. 实现跨机构卡片内金额的流动解决方案(加 ...

  2. Atitit qzone qq空间博客自动点赞与评论工具的设计与实现

    Atitit qzone qq空间博客自动点赞与评论工具的设计与实现 Qzone发送评论的原理 首先,有个a标签, <a class="c_tx3" href="j ...

  3. Ecshop :后台添加新功能 菜单及 管理权限 配置

    需求:在<商品管理>下增加一项[商品推广管理]功能 一. 添加菜单项 打开 /admin/includes/inc_menu.php 文件(后台框架左边菜单),在最后添加一行如下: $mo ...

  4. java之设计模式

    一.代理模式 a.抽象角色(接口):声明真实对象和代理对象的共同接口 b.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能替 ...

  5. 为什么获取的System.Web.HttpContext.Current值为null,HttpContext对象为null时如何获取程序(站点)的根目录

    ASP.NET提供了静态属性System.Web.HttpContext.Current,因此获取HttpContext对象就非常方便了.也正是因为这个原因,所以我们经常能见到直接访问System.W ...

  6. 使用__slots__限定实例的成员列表

    使用__slots__限定实例的成员列表 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应 ...

  7. Mybatis中SqlMapper配置的扩展与应用(1)

    奋斗了好几个晚上调试程序,写了好几篇博客,终于建立起了Mybatis配置的扩展机制.虽然扩展机制是重要的,然而如果没有真正实用的扩展功能,那也至少是不那么鼓舞人心的,这篇博客就来举几个扩展的例子. 这 ...

  8. hibernate(四) 双向多对多映射关系

    序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...

  9. ASP.NET MVC 4使用PagedList.Mvc分页

    ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用Paged ...

  10. android rectF

    new Rect(left , top, right , bottom) 这个构造方法需要四个参数这四个参数 指明了什么位置 ?我们就来解释怎么画 这个 矩形 这四个 参数 分别代表的意思是:left ...