博客的每篇文章都是需要有标签的,它与文章也是多对多的关系 这篇笔记也是记录了实现标签的步骤逻辑。

在我们之前的笔记中创建了Tag的控制器和路由了 所以这篇笔记不在重复


1 创建模型与迁移文件

迁移文件如下:

  1. public function up()
  2. {
  3. Schema::create('tags', function (Blueprint $table) {
  4. $table->increments('id');
  5. // tag的名字 唯一
  6. $table->string('tag')->unique();
  7. // tag的标题
  8. $table->string('title');
  9. // tag副标题
  10. $table->string('subtitle');
  11. // tag的图片
  12. $table->string('page_image');
  13. // tag的描述
  14. $table->string('meta_description');
  15. // 要使用的布局
  16. $table->string('layout')->default('blog.layouts.index');
  17. // 排序
  18. $table->boolean('reverse_direction');
  19. $table->timestamps();
  20. });
  21. }

2 展示Tag

在TagController的index方法添加如下代码:

  1. public function index()
  2. {
  3. $tags = Tag::all();
  4. return view('admin.tag.index')->withTags($tags);
  5. }

创建 index.blade.php 路径是:views/admin/tag

  1. @extends('admin.layout')
  2.  
  3. @section('content')
  4. <div class="container-fluid">
  5. <div class="row page-title-row">
  6. <div class="col-md-6">
  7. <h3>Tags <small>» Listing</small></h3>
  8. </div>
  9. <div class="col-md-6 text-right">
  10. <a href="/admin/tag/create" class="btn btn-success btn-md">
  11. <i class="fa fa-plus-circle"></i> New Tag
  12. </a>
  13. </div>
  14. </div>
  15.  
  16. <div class="row">
  17. <div class="col-sm-12">
  18.  
  19. @include('admin.partials.error')
  20. @include('admin.partials.success')
  21.  
  22. <table id="tags-table" class="table table-striped table-bordered">
  23. <thead>
  24. <tr>
  25. <th>Tag</th>
  26. <th>Title</th>
  27. <th class="hidden-sm">Subtitle</th>
  28. <th class="hidden-md">Page Image</th>
  29. <th class="hidden-md">Meta Description</th>
  30. <th class="hidden-md">Layout</th>
  31. <th class="hidden-sm">Direction</th>
  32. <th data-sortable="false">Actions</th>
  33. </tr>
  34. </thead>
  35. <tbody>
  36. @foreach ($tags as $tag)
  37. <tr>
  38. <td>{{ $tag->tag }}</td>
  39. <td>{{ $tag->title }}</td>
  40. <td class="hidden-sm">{{ $tag->subtitle }}</td>
  41. <td class="hidden-md">{{ $tag->page_image }}</td>
  42. <td class="hidden-md">{{ $tag->meta_description }}</td>
  43. <td class="hidden-md">{{ $tag->layout }}</td>
  44. <td class="hidden-sm">
  45. @if ($tag->reverse_direction)
  46. Reverse
  47. @else
  48. Normal
  49. @endif
  50. </td>
  51. <td>
  52. <a href="/admin/tag/{{ $tag->id }}/edit" class="btn btn-xs btn-info">
  53. <i class="fa fa-edit"></i> Edit
  54. </a>
  55. </td>
  56. </tr>
  57. @endforeach
  58. </tbody>
  59. </table>
  60. </div>
  61. </div>
  62. </div>
  63. @stop
  64.  
  65. @section('scripts')
  66. <script>
  67. $(function() {
  68. $("#tags-table").DataTable({
  69. });
  70. });
  71. </script>
  72. @stop

注意:在上面的代码片段中我们运用了fontawesome和DataTable 可以自行用Bower和Gulp集成一下


3 创建Tag

在我们进入到创建视图是需要自动填入一些默认值,可以这么做:在TagController里添加一个属性fields数组:

  1. protected $fields = [
  2. 'tag' => '',
  3. 'title' => '',
  4. 'subtitle' => '',
  5. 'meta_description' => '',
  6. 'page_image' => '',
  7. 'layout' => 'blog.layouts.index',
  8. 'reverse_direction' => 0,
  9. ];

然后在create方法中运用:

  1. public function create()
  2. {
  3. $data = [];
  4. foreach ($this->fields as $field => $default) {
  5. // 这里使用old方法是因为如果验证规则没有通过的话 将之前填入的值返回给页面
  6. // 这样就避免了一个问题:某个字段没有通过规则要求 重定向回创建页面时之前填入的数据不会消失。
  7. $data[$field] = old($field, $default);
  8. }
  9. return view('admin.tag.create', $data);
  10. }

创建 create.blade.php 路径是:views/admin/tag

  1. @extends('admin.layout')
  2. @section('content')
  3. <div class="container-fluid">
  4. <div class="row page-title-row">
  5. <div class="col-md-12">
  6. <h3>Tags <small>Create New Tag</small></h3>
  7. </div>
  8. </div>
  9. <div class="row">
  10. <div class="col-md-8 col-md-offset-2">
  11. <div class="panel panel-default">
  12. <div class="panel-heading">
  13. <h3 class="panel-title">New Tag From</h3>
  14. </div>
  15. <div class="panel-body">
  16. @include('admin.partials.error')
  17. <form action="/admin/tag" method="post" role="form" class="form-horizontal">
  18. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  19. <div class="form-group">
  20. <label for="tag" class="col-md-3 control-label">Tag</label>
  21. <div class="col-md-3">
  22. <input type="text" class="form-control" name="tag" id="tag" value="{{ $tag }}" autofocus>
  23. </div>
  24. </div>
  25. @include('admin.tag._form')
  26. <div class="form-group">
  27. <div class="col-md-7 col-md-offset-3">
  28. <button class="btn btn-primary btn-md" type="submit">
  29. <i class="fa fa-plus-circle"></i>
  30. Add New Tag
  31. </button>
  32. </div>
  33. </div>
  34. </form>
  35. </div>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. @endsection

上面的代码片段中include一个_form.blade.php 是因为有一段HTML是可以重复利用的

接下来就创建_form.blade.php:

  1. <div class="form-group">
  2. <label for="title" class="col-md-3 control-label">
  3. Title
  4. </label>
  5. <div class="col-md-8">
  6. <input type="text" class="form-control" name="title" id="title" value="{{ $title }}">
  7. </div>
  8. </div>
  9.  
  10. <div class="form-group">
  11. <label for="subtitle" class="col-md-3 control-label">
  12. Subtitle
  13. </label>
  14. <div class="col-md-8">
  15. <input type="text" class="form-control" name="subtitle" id="subtitle" value="{{ $subtitle }}">
  16. </div>
  17. </div>
  18.  
  19. <div class="form-group">
  20. <label for="meta_description" class="col-md-3 control-label">
  21. Meta Description
  22. </label>
  23. <div class="col-md-8">
  24. <textarea class="form-control" id="meta_description" name="meta_description" rows="3">{{ $meta_description }}</textarea>
  25. </div>
  26. </div>
  27.  
  28. <div class="form-group">
  29. <label for="page_image" class="col-md-3 control-label">
  30. Page Image
  31. </label>
  32. <div class="col-md-8">
  33. <input type="text" class="form-control" name="page_image" id="page_image" value="{{ $page_image }}">
  34. </div>
  35. </div>
  36.  
  37. <div class="form-group">
  38. <label for="layout" class="col-md-3 control-label">
  39. Layout
  40. </label>
  41. <div class="col-md-4">
  42. <input type="text" class="form-control" name="layout" id="layout" value="{{ $layout }}">
  43. </div>
  44. </div>
  45.  
  46. <div class="form-group">
  47. <label for="reverse_direction" class="col-md-3 control-label">
  48. Direction
  49. </label>
  50. <div class="col-md-7">
  51. <label class="radio-inline">
  52. <input type="radio" name="reverse_direction" id="reverse_direction"
  53. @if (! $reverse_direction)
  54. checked="checked"
  55. @endif
  56. value="0">
  57. Normal
  58. </label>
  59. <label class="radio-inline">
  60. <input type="radio" name="reverse_direction"
  61. @if ($reverse_direction)
  62. checked="checked"
  63. @endif
  64. value="1">
  65. Reversed
  66. </label>
  67. </div>
  68. </div>

创建一个Request:

  1. class TagCreateRequest extends Request
  2. {
  3. /**
  4. * Determine if the user is authorized to make this request.
  5. *
  6. * @return bool
  7. */
  8. public function authorize()
  9. {
  10. return true;
  11. }
  12.  
  13. /**
  14. * Get the validation rules that apply to the request.
  15. *
  16. * @return array
  17. */
  18. public function rules()
  19. {
  20. // 我们可以直接在rules中做一些验证处理 这根Validate效果是一样的
  21. return [
  22. 'tag' => 'required|unique:tags,tag',
  23. 'title' => 'required',
  24. 'subtitle' => 'required',
  25. 'layout' => 'required',
  26. ];
  27. }
  28. }

实现store方法:

  1. public function store(Requests\TagCreateRequest $request)
  2. {
  3. $tag = new Tag();
  4. foreach (array_keys($this->fields) as $field) {
  5. $tag->$field = $request->get($field);
  6. }
  7. $tag->save();
  8.  
  9. return redirect('/admin/tag')->withSuccess('The tag "$tag->tag" was created');
  10. }

4 修改Tag

在TagController中添加如下代码:

  1. public function edit($id)
  2. {
  3. $tag = Tag::findOrFail($id);
  4. $data = ['id' => $id];
  5. foreach (array_keys($this->fields) as $key) {
  6. $data[$key] = old($key, $tag->$key);
  7. }
  8. return view('admin.tag.edit', $data);
  9. }

创建edit视图:

  1. @extends('admin.layout')
  2. @section('content')
  3. <div class="container-fluid">
  4. <div class="row page-title-row">
  5. <div class="col-md-12">
  6. <h3>Tags <small>Edit Tag</small></h3>
  7. </div>
  8. </div>
  9. <div class="row">
  10. <div class="col-md-8 col-md-offset-2">
  11. <div class="panel panel-default">
  12. <div class="panel-heading">
  13. <h3 class="panel-title">Tag Edit Form</h3>
  14. </div>
  15. <div class="panel-body">
  16. @include('admin.partials.error')
  17. @include('admin.partials.success')
  18. <form action="/admin/tag/{{ $id }}" class="form-horizontal" role="form" method="post">
  19. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  20. <input type="hidden" name="id" value="{{ $id }}">
  21. <input type="hidden" name="_method" value="put">
  22. <div class="form-group">
  23. <label for="tag" class="col-md-3 control-label">Tag</label>
  24. <div class="col-md-3">
  25. <p class="form-control-static">{{ $tag }}</p>
  26. </div>
  27. </div>
  28. @include('admin.tag._form')
  29. <div class="form-group">
  30. <div class="col-md-7 col-md-offset-3">
  31. <button class="btn btn-primary btn-md" type="submit">
  32. <i class="fa fa-save"></i>
  33. Save Changes
  34. </button>
  35. <button class="btn btn-danger btn-md" type="button" data-toggle="modal" data-target="#modal-delete">
  36. <i class="fa fa-times-circle"></i>
  37. Delete
  38. </button>
  39. </div>
  40. </div>
  41. </form>
  42. </div>
  43. </div>
  44. </div>
  45. </div>
  46. </div>
  47.  
  48. <div class="modal fade" id="modal-delete" tabindex="-1">
  49. <div class="modal-dialog">
  50. <div class="modal-content">
  51. <div class="modal-header">
  52. <button class="close" type="button" data-dismiss="modal">x</button>
  53. <h4 class="modal-title">Please Confirm</h4>
  54. </div>
  55. <div class="modal-body">
  56. <p class="lead">
  57. <i class="fa fa-question-circle"></i>
  58. Are you sure you want to delete this tag?
  59. </p>
  60. </div>
  61. <div class="modal-footer">
  62. <form action="/admin/tag/{{ $id }}" method="post">
  63. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  64. <input type="hidden" name="_method" value="delete">
  65. <button class="btn btn-default" data-dismiss="modal" type="button">Cancl</button>
  66. <button class="btn btn-danger" type="submit">
  67. <i class="fa fa-times-circle"></i>
  68. Yes
  69. </button>
  70. </form>
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. @endsection

同样的 我们需要创建一个TagUpdateRequest:

  1. class TagUpdateRequest extends Request
  2. {
  3. /**
  4. * Determine if the user is authorized to make this request.
  5. *
  6. * @return bool
  7. */
  8. public function authorize()
  9. {
  10. return true;
  11. }
  12.  
  13. /**
  14. * Get the validation rules that apply to the request.
  15. *
  16. * @return array
  17. */
  18. public function rules()
  19. {
  20. return [
  21. 'title' => 'required',
  22. 'subtitle' => 'required',
  23. 'layout' => 'required',
  24. ];
  25. }
  26. }

然后在update方法中添加如下代码:

  1. public function update(Request $request, $id)
  2. {
  3. $tag = Tag::findOrFail($id);
  4. foreach (array_keys(array_except($this->fields, ['tag'])) as $field) {
  5. $tag->$field = $request->get($field);
  6. }
  7. $tag->save();
  8. return redirect("/admin/tag/$id/edit")->withSuccess('Changes saved.');
  9. }

5 删除Tag

我们在edit视图中添加了删除的表单 现在只需要实现以下TagController中的destroy方法就可以了:

  1. public function destroy($id)
  2. {
  3. $tag = Tag::findOrFail($id);
  4. $tag->delete();
  5.  
  6. return redirect('/admin/tag')->withSuccess("The '$tag->tag' tag has been deleted.");
  7. }

6 其他

我们不需要实现show方法,因此我们需要把路由改成这样:

  1. Route::resource('tag', 'TagController', ['except' => 'show']);

然后删除TagController中的show方法就行了。

Laravel5.1 搭建博客 --构建标签的更多相关文章

  1. Laravel5.1 搭建博客 --编译前端文件

    上篇文章写了Gulp编译前端文件,这篇记录下在搭建博客中使用Gulp 1 引入bootstrap和js 1.1 首先先在项目本地安装Bower sudo npm install bower 1.2 创 ...

  2. Laravel5.1 搭建博客 --展示简单的首页

    今天起开始搭建博客,把之前学的东西运用下. 1 创建 配置项目 1.1 创建项目 composer create-project laravel/laravel blog 5.1.1 1.2 配置数据 ...

  3. Laravel5.1 搭建博客 --文章的增删改查

    教程源于:Laravel学院 继文件上传后呢,咱来搞一搞文章的事情. 1 更改数据表 我们需要改改数据表的结构 因为涉及到重命名列名 所以咱需要引入一个包:Doctrine: composer req ...

  4. Laravel5.1 搭建博客 --后台登录

    今天咱来实现后台的登录. 首先我们的后台需要三个控制器: PostController:管理文章. TagController:管理文章标签. UploadController:上传文件. 当我们访问 ...

  5. Laravel5.1 搭建博客 --上传文件及文件管理

    教程源自:Laravel学院 这一节 咱来说说上传文件的功能实现,我们会把上传的文件保存到项目本地,不仅上传 还有删除和预览功能. 1 配置 我们先从配置开始做起,先修改我们自己创建的 blog.ph ...

  6. flask tutorial => make a blog :) flask 搭建博客系统从零开始!

    please follow the tutorial from the official site :) http://flask.pocoo.org/docs/ You could download ...

  7. Django搭建博客网站(二)

    Django搭建自己的博客网站(二) 这里主要讲构建系统数据库Model. Django搭建博客网站(一) model 目前就只提供一个文章model和一个文章分类标签model,在post/mode ...

  8. django学习笔记——搭建博客网站

    1. 配置环境,创建django工程 虚拟环境下建立Django工程,即创建一个包含python脚本文件和django配置文件的目录或者文件夹,其中manage.py是django的工程管理助手.(可 ...

  9. 基于Hexo和Github搭建博客

    搭建自己的个人博客. 准备工作 确保电脑需要已下载安装node和npm.查看安装是否成功,windows只需在命令行输入以下两条命令即可. 1 2 $ node -v $ npm -v 安装hexo ...

随机推荐

  1. 【微信开发】JS和PHP分别判断当前浏览器是否微信浏览器

    1.PHP端 //判断是否微信浏览器 -xzz1125 function is_weixin() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMes ...

  2. iOS官方文档阅读 基本格式指北

    一些关键词作用 NS_AVAILABLE 表示可用 如 NS_AVAILABLE(NA, 6_0);例如上面这句就是表示 该方法在6.0系统后可用 如果在6.0以下的系统用不了的 或者直接崩溃. NS ...

  3. 建立对ActiveX控件的了解

    本文来自百度百科:ActiveX控件   ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM).在有目录和其它支持的网络中,COM变成 ...

  4. 如何用原生js或jquery设置select的值

    1.原生js设置select值的方法 (1)有时可能需要隐藏select,但是还得需要更改select所传递的值.(select的默认选中之为第一个,即下标为0的选项值) var gd2=docume ...

  5. springboot web 服务器选择

    Spring Boot 揭秘与实战(五) 服务器篇 - 其他内嵌服务器 拓展链接 http://www.jianshu.com/p/9710585258fb 发表于 2017-01-03 | Spri ...

  6. Flume 中文入门手冊

    原文:https://cwiki.apache.org/confluence/display/FLUME/Getting+Started 什么是 Flume NG? Flume NG 旨在比起 Flu ...

  7. C strlen vs sizeof

    strlen是函数. sizeof是操作符..以下一个简单的程序说明这件事: #include <iostream> #include <string.h> using nam ...

  8. 李洪强iOS开发之苹果企业开发者账号申请流程

    李洪强iOS开发之苹果企业开发者账号申请流程 一. 开发者账号类型选择 邓白氏码 DUNS number,是Data Universal Numbering System的缩写,是一个独一无二的9位数 ...

  9. 从零开始,跟我一起做jblog项目(二)Maven

    从零开始,跟我一起做jblog项目(一)引言 从零开始,跟我一起做jblog项目(二)Maven maven是一个项目管理工具,尤其适用于JAVA世界 在jblog的开发前期,还没有系统使用过mave ...

  10. 16位结构的CPU,8086给出物理地址的方法

    .16位结构的CPU 概括地讲,16位结构(16位机,字长为16位等常见说法,与16位结构的含义相同)描述了一个CPU具有下面几方面结构特性: 1.运算器一次最多可以处理16位的数据结构 2.寄存器的 ...