#1、文章管理
#創建視圖
php artisan generate:view admin.articles.list
#修改views/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
#nav.blade.php 添加文章Users下面 鏈接 Article
<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>
#2、顯示標籤列表
#創建標籤視圖
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
#在 nav.blade.php 的Users下面增加Tags選項
<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
#修改標籤控制器TagController.php
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);
}
}
#routes.php 添加tags資源路由
Route::resource('tag', 'TagController');
#4、刪除標籤
修改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
#修改視圖views/articles/specificTag.blade.php
@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);
}
#routes.php 在資源路由
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
#在index.blade.php 右側邊藍 Tags 改爲路由鏈接
<a href="{{ URL::route('tag.index') }}">Tags</a>
#TagController.php 修改
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