실험 동의 laravel 4.2 blog 튜 토리 얼 (4)
\ # view / index. blade. php 수정
@extends('_layouts.default')
@section('main')
<div class="am-g am-g-fixed">
<div class="am-u-md-8">
@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="#">{{{ $article->user->nickname }}}</a> posted on {{ $article->created_at->format('Y/m/d H:i') }} under
@foreach ($article->tags as $tag)
<a href="#" 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
</div>
<div class="am-u-md-4 blog-sidebar">
<br/>
<div class="am-panel-group">
<section class="am-panel am-panel-default">
<div class="am-panel-hd"><span class="am-icon-tags"></span> Tags</div>
<ul class="am-list">
@for ($i = 0, $len = count($tags); $i < $len; $i++)
<li>
<a href="#">{{ $tags[$i]->name }}
@if ($i == 0)
<span class="am-fr am-badge am-badge-danger am-round">{{ $tags[$i]->count }}</span>
@elseif ($i == 1)
<span class="am-fr am-badge am-badge-warning am-round">{{ $tags[$i]->count }}</span>
@elseif ($i == 2)
<span class="am-fr am-badge am-badge-success am-round">{{ $tags[$i]->count }}</span>
@else
<span class="am-fr am-badge am-round">{{ $tags[$i]->count }}</span>
@endif
</a>
</li>
@endfor
</ul>
</section>
</div>
</div>
</div>
@stop
\ # public / custom. css 증가
@media only screen and (min-width: 641px) {
.blog-sidebar {
font-size: 1.4rem;
}
}
.blog-main {
padding: 20px 0;
}
.blog-title {
margin: 10px 0 20px 0;
}
.blog-meta {
font-size: 14px;
margin: 10px 0 20px 0;
color: #222;
}
.blog-meta a {
color: #27ae60;
}
\ # routes. php 홈 페이지 접근 경로 수정
Route::get('/', function()
{
$articles = Article::with('user', 'tags')->orderBy('created_at', 'desc')->paginate(10);
$tags = Tag::where('count', '>', '0')->orderBy('count', 'desc')->orderBy('updated_at', 'desc')->take(10)->get();
return View::make('index')->with('articles', $articles)->with('tags', $tags);
});
위 Article:: with () 는 사전 로드 를 사용 하여 조회 횟수 를 줄 일 수 있 습 니 다.
\ # 2, 사용자 홈 페이지 수정
\ # 탐색 표시 줄 nav. blade. php 에 My Articles 버튼 추가
<div class="am-topbar-right">
<a href="{{ URL::to('user/'. Auth::id() . '/articles') }}" class="am-btn am-btn-primary am-topbar-btn am-btn-sm topbar-link-btn"><span class="am-icon-list"></span> My Articles</a>
</div>
\ # home. 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>Title</th>
<th>Tags</th>
@if ($user->id == Auth::id())
<th>Managment</th>
@endif
</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>
@if ($user->id == Auth::id())
<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>
@endif
</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
\ # 사용자 컨트롤 러 추가 UserController
php artisan generate:controller UserController
\ # UserController. php 에 추가
public function articles(User $user)
{
return View::make('home')->with('user', $user)->with('articles', Article::with('tags')->where('user_id', '=', $user->id)->orderBy('created_at', 'desc')->get());
}
\ # routes. php 사용자 글 경로 추가
Route::get('user/{user}/articles', 'UserController@articles');
\ # 경로 수정
Route::get('home', array('before' => 'auth', function()
{
return View::make('home')->with('user', Auth::user())->with('articles', Article::with('tags')->where('user_id', '=', Auth::id())->orderBy('created_at', 'desc')->get());
}));
\ # views / index. blade. php 작성 자 링크 추가
<a href="{{ URL::to('user/' . $article->user->id . '/articles') }}">{{{ $article->user->nickname }}}</a>
\ # articles / show. blade. php 작성 자 링크 추가
<a href="{{ URL::to('user/' . $article->user->id . '/articles') }}" style="cursor: pointer;">{{{ $article->user->nickname }}}</a>
\ # 첫 페이지 에 글 표시
\ # app 에서 블 로 그 를 만 듭 니 다 (확장 클래스 설치). 새 페이지 파일
PaginationPresenter.php,
class PaginationPresenter extends Illuminate\Pagination\Presenter {
public function getActivePageWrapper($text)
{
return '<li class="am-active"><a href="">'.$text.'</a></li>';
}
public function getDisabledTextWrapper($text)
{
return '<li class="am-disabled"><a href="">'.$text.'</a></li>';
}
public function getPageLinkWrapper($url, $page, $rel = null)
{
return '<li><a href="'.$url.'">'.$page.'</a></li>';
}
}
#
composer.josn autoload classmap
추가 "app/Blog"
\ # 실행composer dump-autoload
\ # 분류 보기 만 들 기
php artisan generate:view pagination
# pagination.blade.php
<ul class="am-pagination am-pagination-centered">
{{ with(new PaginationPresenter($paginator))->render() }}
</ul>
# app/config/view.php pagination pagination routes.php Route::get('/') paginate() , , 2, views/index.blade.php {{ $articles->links() }}
#4、
# ArticleController.php
public function canOperation($route, $request)
{
if (!(Auth::user()->is_admin or Auth::id() == Article::find(Route::input('article'))->user_id))
{
return Redirect::to('/');
}
}
csrf
$this->beforeFilter('csrf', array('only' => array('store', 'update', 'destroy')));
$this->beforeFilter('@canOperation', array('only' => array('edit', 'update', 'destroy')));
#
php artisan generate:view articles.edit
# articles/edit.blade.php
@extends('_layouts.default')
@section('main')
<div class="am-g am-g-fixed">
<div class="am-u-sm-12">
<h1>Edit Article</h1>
<hr/>
@if ($errors->has())
<div class="am-alert am-alert-danger" data-am-alert>
<p>{{ $errors->first() }}</p>
</div>
@endif
{{ Form::model($article, array('url' => URL::route('article.update', $article->id), 'method' => 'PUT', 'class' => "am-form")) }}
<div class="am-form-group">
{{ Form::label('title', 'Title') }}
{{ Form::text('title', Input::old('title')) }}
</div>
<div class="am-form-group">
{{ Form::label('content', 'Content') }}
{{ Form::textarea('content', Input::old('content'), array('rows' => '20')) }}
<p class="am-form-help">
<button id="preview" type="button" class="am-btn am-btn-xs am-btn-primary"><span class="am-icon-eye"></span> Preview</button>
</p>
</div>
<div class="am-form-group">
{{ Form::label('tags', 'Tags') }}
{{ Form::text('tags', Input::old('tags')) }}
<p class="am-form-help">Separate multiple tags with a comma ","</p>
</div>
<p><button type="submit" class="am-btn am-btn-success">
<span class="am-icon-pencil"></span> Modify</button>
</p>
{{ Form::close() }}
</div>
</div>
<div class="am-popup" id="preview-popup">
<div class="am-popup-inner">
<div class="am-popup-hd">
<h4 class="am-popup-title"></h4>
<span data-am-modal-close
class="am-close">×</span>
</div>
<div class="am-popup-bd">
</div>
</div>
</div>
<script>
$(function() {
$('#preview').on('click', function() {
$('.am-popup-title').text($('#title').val());
$.post('preview', {'content': $('#content').val()}, function(data, status) {
$('.am-popup-bd').html(data);
});
$('#preview-popup').modal();
});
});
</script>
@stop
#
Route::post('article/{id}/preview', array('before' => 'auth', 'uses' => 'ArticleController@preview'));
# ArticleController.php
public function edit($id)
{
$article = Article::with('tags')->find($id);
$tags = '';
for ($i = 0, $len = count($article->tags); $i < $len; $i++) {
$tags .= $article->tags[$i]->name . ($i == $len - 1 ? '' : ',');
}
$article->tags = $tags;
return View::make('articles.edit')->with('article', $article);
}
#5、
# ArticleController.php
public function update($id)
{
$rules = [
'title' => 'required|max:100',
'content' => 'required',
'tags' => array('required', 'regex:/^\w+$|^(\w+,)+\w+$/'),
];
$validator = Validator::make(Input::all(), $rules);
if ($validator->passes()) {
$article = Article::with('tags')->find($id);
$article->update(Input::only('title', 'content'));
$resolved_content = Markdown::parse(Input::get('content'));
$article->resolved_content = $resolved_content;
$tags = array_unique(explode(',', Input::get('tags')));
if (str_contains($resolved_content, '<p>')) {
$start = strpos($resolved_content, '<p>');
$length = strpos($resolved_content, '</p>') - $start - 3;
$article->summary = substr($resolved_content, $start + 3, $length);
} elseif (str_contains($resolved_content, '</h')) {
$start = strpos($resolved_content, '<h');
$length = strpos($resolved_content, '</h') - $start - 4;
$article->summary = substr($resolved_content, $start + 4, $length);
}
$article->save();
foreach ($article->tags as $tag) {
if (($index = array_search($tag->name, $tags)) !== false) {
unset($tags[$index]);
} else {
$tag->count--;
$tag->save();
$article->tags()->detach($tag->id);
}
}
foreach ($tags as $tagName) {
$tag = Tag::whereName($tagName)->first();
if (!$tag) {
$tag = Tag::create(array('name' => $tagName));
}
$tag->count++;
$article->tags()->save($tag);
}
return Redirect::route('article.show', $article->id);
} else {
return Redirect::route('article.edit', $id)->withInput()->withErrors($validator);
}
}
#6、
# ArticleController.php
public function destroy($id)
{
$article = Article::find($id);
foreach ($article->tags as $tag) {
$tag->count--;
$tag->save();
$article->tags()->detach($tag->id);
}
$article->delete();
return Redirect::to('home');
}
、
:$ git clone https://github.com/shiyanlou/laravel-blog-4.git
:https://www.shiyanlou.com/courses/document/414
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.