#1、文章管理
#创建视图
php artisan generate:view admin.articles.list
@extends('_layouts.default') @section('main') <div class="am-g am-g-fixed blog-g-fixed"> <div class="am-u-sm-12"> <table class="am-table am-table-hover am-table-striped "> <thead> <tr> <th>Title</th> <th>Tags</th> <th>Author</th> <th>Managment</th> </tr> </thead> <tbody> @foreach ($articles as $article) <tr> <td><a href="{{ URL::route('article.show', $article->id) }}">{{{ $article->title }}}</a></td> <td> @foreach ($article->tags as $tag) <span class="am-badge am-badge-success am-radius">{{ $tag->name }}</span> @endforeach </td> <td><a href="{{ URL::to('user/' . $article->user->id . '/articles') }}">{{{ $article->user->nickname }}}</a></td> <td> <a href="{{ URL::to('article/'. $article->id . '/edit') }}" class="am-btn am-btn-xs am-btn-primary"><span class="am-icon-pencil"></span> Edit</a> {{ Form::open(array('url' => 'article/' . $article->id, 'method' => 'DELETE', 'style' => 'display: inline;')) }} <button type="button" class="am-btn am-btn-xs am-btn-danger" id="delete{{ $article->id }}"><span class="am-icon-remove"></span> Delete</button> {{ Form::close() }} </td> </tr> @endforeach </tbody> </table> </div> </div> <div class="am-modal am-modal-confirm" tabindex="-1" id="my-confirm"> <div class="am-modal-dialog"> <div class="am-modal-bd"> </div> <div class="am-modal-footer"> <span class="am-modal-btn" data-am-modal-cancel>No</span> <span class="am-modal-btn" data-am-modal-confirm>Yes</span> </div> </div> </div> <script> $(function() { $('[id^=delete]').on('click', function() { $('.am-modal-bd').text('Sure you want to delete it?'); $('#my-confirm').modal({ relatedTarget: this, onConfirm: function(options) { $(this.relatedTarget).parent().submit(); }, onCancel: function() { } }); }); }); </script> @stop
<li class="{{ (isset($page) and ($page == 'articles')) ? 'am-active' : '' }}"><a href="{{ URL::to('admin/articles') }}">Articles</a></li>
php artisan generate:controller AdminController
#在管理员控制器里面文章列表方法
class AdminController extends \BaseController { public function articles() { return View::make('admin.articles.list')->with('articles', Article::with('user', 'tags')->orderBy('created_at', 'desc')->get())->with('page', 'articles'); } }#routes.php 在
Route::group(array('prefix' => 'admin')
中增加 显示文章列表路由
Route::get('articles', 'AdminController@articles');管理文章可以重用上节教程写的业务逻辑,修改下ArticleController.php,把destroy()中最后的
Redirect::to('home')改成
Redirect::back()
#再修改一下home.blade.php,加一个是否是管理员的判断,这样当点击作者跳转到用户主页时,除了作者自己管理员也能操作文章
@if ($user->id == Auth::id() or (Auth::check() and Auth::user()->is_admin))
#修改用户主页链接 admin/uses/list.blade.php、点击昵称时候跳到用户主页
<a href="{{ URL::to('user/' . $user->id . '/articles') }}">{{{ $user->nickname }}}</a>
#创建标签视图
php artisan generate:view admin.tags.list
#修改admin/tags/list.blade.php
@extends('_layouts.default') @section('main') <div class="am-g am-g-fixed blog-g-fixed"> <div class="am-u-sm-12"> <table class="am-table am-table-hover am-table-striped "> <thead> <tr> <th>TagName</th> <th>ArticleCount</th> <th>CreateDateTime</th> <th>Managment</th> </tr> </thead> <tbody> @foreach ($tags as $tag) <tr> <td>{{{ $tag->name }}}</td> <td>{{ $tag->count }}</td> <td>{{ $tag->created_at->format('Y-m-d H:i') }}</td> <td> <a href="{{ URL::to('tag/'. $tag->id . '/edit') }}" class="am-btn am-btn-xs am-btn-primary"><span class="am-icon-pencil"></span> Edit</a> {{ Form::open(array('url' => 'tag/' . $tag->id, 'method' => 'DELETE', 'style' => 'display: inline;')) }} <button type="button" class="am-btn am-btn-xs am-btn-danger" id="delete{{ $tag->id }}"><span class="am-icon-remove"></span> Delete</button> {{ Form::close() }} </td> </tr> @endforeach </tbody> </table> </div> </div> <div class="am-modal am-modal-confirm" tabindex="-1" id="my-confirm"> <div class="am-modal-dialog"> <div class="am-modal-bd"> </div> <div class="am-modal-footer"> <span class="am-modal-btn" data-am-modal-cancel>No</span> <span class="am-modal-btn" data-am-modal-confirm>Yes</span> </div> </div> </div> <script> $(function() { $('[id^=delete]').on('click', function() { $('.am-modal-bd').text('Sure you want to delete it?'); $('#my-confirm').modal({ relatedTarget: this, onConfirm: function(options) { $(this.relatedTarget).parent().submit(); }, onCancel: function() { } }); }); }); </script> @stop
<li class="{{ (isset($page) and ($page == 'tags')) ? 'am-active' : '' }}"><a href="{{ URL::to('admin/tags') }}">Tags</a></li>
Route::group(array('prefix' => 'admin')
中增加Tags 列表路由
Route::get('tags', 'AdminController@tags');
#在AdminController.php添加显示tags 方法
public function tags() { return View::make('admin.tags.list')->with('tags', Tag::where('count', '>', '0')->orderBy('count', 'desc')->orderBy('updated_at', 'desc')->get())->with('page', 'tags'); }点击导航栏Tags 即显示Tags 列表
#3、修改标签
#创建标签视图
php artisan generate:view tags.edit#修改标签编辑视图 views/tags/edit.blade.php
@extends('_layouts.default') @section('main') <div class="am-g am-g-fixed"> <div class="am-u-sm-12"> <h1>Edit Tag</h1> <hr/> @if (Session::has('message')) <div class="am-alert am-alert-{{ Session::get('message')['type'] }}" data-am-alert> <p>{{ Session::get('message')['content'] }}</p> </div> @endif @if ($errors->has()) <div class="am-alert am-alert-danger" data-am-alert> <p>{{ $errors->first() }}</p> </div> @endif {{ Form::model($tag, array('url' => URL::route('tag.update', $tag->id), 'method' => 'PUT', 'class' => "am-form")) }} <div class="am-form-group"> {{ Form::label('name', 'TagName') }} {{ Form::text('name', Input::old('name')) }} </div> <p><button type="submit" class="am-btn am-btn-success"> <span class="am-icon-pencil"></span> Modify</button> </p> {{ Form::close() }} </div> </div> @stop
php artisan generate:controller TagController
public function __construct() { $this->beforeFilter('auth', array('only' => array('create', 'store', 'edit', 'update', 'destroy'))); $this->beforeFilter('csrf', array('only' => array('store', 'update', 'destroy'))); } public function edit($id) { return View::make('tags.edit')->with('tag', Tag::find($id)); } public function update($id) { $rules = array( 'name' => array('required', 'regex:/^\w+$/'), ); $validator = Validator::make(Input::only('name'), $rules); if ($validator->passes()) { Tag::find($id)->update(Input::only('name')); return Redirect::back()->with('message', array('type' => 'success', 'content' => 'Modify tag successfully')); } else { return Redirect::back()->withInput()->withErrors($validator); } }
Route::resource('tag', 'TagController');
修改TagController.php
public function destroy($id) { $tag = Tag::find($id); $tag->count = 0; $tag->save(); foreach ($tag->articles as $article) { $tag->articles()->detach($article->id); } return Redirect::back(); }我这里删除标签只是把它的文章数置为0,然后清除与相关文章的关联,你可以自己试下删除一个标签,再看看文章的标签是否去除了
#5、关联标签
在index.blade.php 的{{$tag->name}}、下面的{{$tag[$i]->name}}、articles/show.blade.php 的{{$tag->name}} 的a 标签添加链接
<a href="{{ URL::to('tag/' . $tag->id . '/articles') }}">{{ $tag->name }}</a>
#创建标签文章列表视图
php artisan generate:view articles.specificTag
@extends('_layouts.default') @section('main') <div class="am-g am-g-fixed"> <div class="am-u-sm-12"> <br/> <blockquote>Tag: <span class="am-badge am-badge-success am-radius">{{{ $tag->name }}}</span></blockquote> @foreach ($articles as $article) <article class="blog-main"> <h3 class="am-article-title blog-title"> <a href="{{ URL::route('article.show', $article->id) }}">{{{ $article->title }}}</a> </h3> <h4 class="am-article-meta blog-meta"> by <a href="{{ URL::to('user/' . $article->user->id . '/articles') }}">{{{ $article->user->nickname }}}</a> posted on {{ $article->created_at->format('Y/m/d H:i') }} under @foreach ($article->tags as $tag) <a href="{{ URL::to('tag/' . $tag->id . '/articles') }}" style="color: #fff;" class="am-badge am-badge-success am-radius">{{ $tag->name }}</a> @endforeach </h4> <div class="am-g"> <div class="am-u-sm-12"> @if ($article->summary) <p>{{ $article->summary }}</p> @endif <hr class="am-article-divider"/> </div> </div> </article> @endforeach {{ $articles->links() }} </div> </div> @stop
#在TagController.php添加显示文章列表方法
public function articles($id) { $tag = Tag::find($id); $articles = $tag->articles()->orderBy('created_at', 'desc')->paginate(10); return View::make('articles.specificTag')->with('tag', $tag)->with('articles', $articles); }
Route::resource('tag', 'TagController');
之上添加
Route::get('tag/{id}/articles', 'TagController@articles');现在点击标签即跳转到该标签下的所有文章
#6、显示所有文章
创建显示所有标签视图
php artisan generate:view tags.list
#修改视图views/tags/list.blade.php
@extends('_layouts.default') @section('main') <div class="am-g am-g-fixed"> <div class="am-u-sm-12"> <h1>All Tags</h1> <hr/> @foreach ($tags as $tag) <a href="{{ URL::to('tag/' . $tag->id . '/articles') }}" class="am-badge am-radius {{ array('', 'am-badge-primary', 'am-badge-secondary', 'am-badge-success', 'am-badge-warning', 'am-badge-danger')[rand(0, 5)] }}">{{{ $tag->name }}} {{ $tag->count }}</a> @endforeach <br/> <br/> </div> </div> @stop
<a href="{{ URL::route('tag.index') }}">Tags</a>
public function index() { return View::make('tags.list')->with('tags', Tag::where('count', '>', '0')->orderBy('count', 'desc')->orderBy('updated_at', 'desc')->get()); }
下载:git clone https://github.com/shiyanlou/laravel-blog-5.git
参照:https://www.shiyanlou.com/courses/document/418