[Laravel 5 Fundamentals] 22 – Selecting Tags From the UI
标签选择
前言
上一节,我们对 article 和 tag 的多对多关系进行了代码上的实现。本节,继续上节,让我们如何在 UI 上实现对 tag 的选择。
说明
开发环境:Windows 7
Laravel 版本: 5+
IDE: Phpstorm
上节课,我们以文章的 tag 为例子,将 article 和 tag 作为多对多的事例进行讲解,并且实现了文章和标签的绑定。这节课,我们看看在页面上,也就是 UI 上怎么实现对 tag 的选取。
select 控件
什么是 select 控件?不知道啊?不知道的话看一下下面的效果就知道了。
打开 form.blade.php ,在 published_at 下面添加一个 form 标签:
{!! Form::label('tags','Tags:') !!}{!! Form::select('tags',['default'],null,['class'=>'form-control']) !!}
其实这些东西,以前都多少有些子集,具体不需要怎么多讲,你可以看看效果就明白每个参数的意义。这个 class 是 bootstrap 定义的类型。然后打开服务器,访问一下 localhost:8888/articles/create ,看到了嘛,在 publish on 下面多了一个 tags 和一个可以选择的控件。
既然是选择,那就需要多个选项。对于我们来说,就是多个 tag 。改一下代码,添加一个关键字:
{!! Form::label('tags','Tags:') !!}{!! Form::select('tags',['default'],null,['class'=>'form-control','multiple']) !!}
现在虽然有了变化,但是我们的 tag 是静态的,写死的。要是能穿第一个 $tagList 或者 $tags(下面统称为 $tags) 就好了。
那既然想获取这个 $tags ,想象这个逻辑,这个 $tags 是什么时候被传递到这个创建的页面的?那也就是当我们访问 localhost:8888/articles/create 的时候,会把 $tags 一同携带过来,如此,我们才能把 $tags 传递到这个 Form 中,对吧?
下面看怎么搞。
打开 ArticlesController.php ,找到 create() 方法,这里就是我们如何访问 localhost:8888/articles/create 的。
在 create() 方法里加入如下代码:
public function create(){ $tags=\App\Tag::lists('name'); return view('articles.create',compact('tags'));}
是的,我们就是通过那一句来获取 tag 的 name (名称)的。不过现在,我们的 tag 列表里只有一个 tag ,就是上节创建的,我们需要再创建几个 tag 才能看出效果。
打开 Tag.php,在 Tag 类中添加如下数组:
protected $fillable = [ 'name'];
把 name 添加到 $fillable 数组中,防止 MassAssignmentException 。 接下来切换到 tinker 模式: php artisan tinker :
>>> \App\Tag::create(['name'=>'work']);=> App\Tag {#656 name: "work", updated_at: "2016-05-01 14:02:13", created_at: "2016-05-01 14:02:13", id: 2,}>>> \App\Tag::create(['name'=>'coding']);=> App\Tag {#655 name: "coding", updated_at: "2016-05-01 14:03:50", created_at: "2016-05-01 14:03:50", id: 3,}>>> \App\Tag::create(['name'=>'life']); => App\Tag {#645 name: "life", updated_at: "2016-05-01 14:04:29", created_at: "2016-05-01 14:04:29", id: 4,}>>> \App\Tag::lists('name');=> Illuminate\Support\Collection {#653 all: [ "personal", "work", "coding", "life", ],}
哈,通过 \App\Tag::lists(‘name’); 可以看到我们的 tag name list 。目前 list 是通过下标的方式来获取值的,比如: $tags[2] 取到的值就是 ‘coding’;如果我想通过 tag 名称来获取 tag 呢?比如: $tags[‘coding’] 取到的值就是 ‘coding’。接着看:
>>> \App\Tag::lists('name','name');=> Illuminate\Support\Collection {#664 all: [ "personal" => "personal", "work" => "work", "coding" => "coding", "life" => "life", ],}
不错,改一下吧。打开 ArticlesController.php 把 create() 方法改成如下:
public function create(){ $tags=\App\Tag::lists('name','name'); return view('articles.create',compact('tags'));}
完工。看下效果吧。访问 localhost:8888/articles/create 。不错~有效果,可以选择了,可以通过 shift 键进行多选哦。
选择之后,我们要创建文章的时候,我们所提交的 tag 到底有多少,怎么查看一下?
打开 ArticlesController.php ,找到 store() 方法,因为这个方法是用来存储文章的。找到之后,我们在该方法中加入一句:
public function store(ArticleRequest $request){ dd($request->input('tags')); $article = new Article($request->all()); Auth::user()->articles()->create($article); return redirect('articles')->with([ 'flash_message'=>'Your article has been created!', 'flash_message_important'=>true]);}
加一句 dd(),当你通过 shift 把标签全都选中的时候,提交创建文章后,会发现只有一个 tag 值。呃?不是选了四个么。回到 form.blade.php ,修改一下这里就可以解决:
{!! Form::select('tags[]',$tags,null,['class'=>'form-control','multiple']) !!}
把 tags 改成 tags[] 后,我们传递的便是数组,而不是首位值。
好了,回到 ArticlesControllerphp 的 store() 方法中,把 dd 注释掉。目前的情况是,我们获取到了所有选中的 tags ,下一步,就该将这些 tags 与 文章进行绑定了。这一动作和上一节的绑定动作类似。
但是上一节我们将 article 与 tag 进行绑定的时候,用到的是 tag 的 id ,而不是 tag 的 name。那当初我们为什么要获取 name (为了效果。。。),直接获取 id 不就完了?是的。
在 ArticlesController.php 中找到 create() 方法,修改如下:
public function create(){ $tags=\App\Tag::lists('name','id'); return view('articles.create',compact('tags'));}
这样就可以了,不用试了,真的可以了。
回到 store() 方法中,写下如下代码进行 article 与 tag id们进行绑定:
public function store(ArticleRequest $request){ $article = Auth::user()->articles()->create($request->all()); $article->tags()->attach($request->input('tags')); return redirect('articles')->with([ 'flash_message'=>'Your article has been created!', 'flash_message_important'=>true]);}
第一句,获取到 article 表单中的值,第二句,获取到表单中 tags 的 id 们,重要的就是第三句,将 文章与其标签进行绑定,通过标签的 id 。
我们去试一试。文章是发表成功了,看看数据库里吧,切换到 tinker 模式:
>>> $article = App\Article::find(10);=> App\Article {#659 id: "10", user_id: "1", created_at: "2016-05-01 15:26:08", updated_at: "2016-05-01 15:26:08", title: "asd", body: "asdasdasdasd", published_at: "2016-05-09 00:00:00", }>>> $article->tags->toArray();=> [ [ "id" => 2, "name" => "work", "created_at" => "2016-05-01 14:02:13", "updated_at" => "2016-05-01 14:02:13", "pivot" => [ "article_id" => "10", "tag_id" => "2", "created_at" => "2016-05-01 15:26:08", "updated_at" => "2016-05-01 15:26:08", ], ], [ "id" => 3, "name" => "coding", "created_at" => "2016-05-01 14:03:50", "updated_at" => "2016-05-01 14:03:50", "pivot" => [ "article_id" => "10", "tag_id" => "3", "created_at" => "2016-05-01 15:26:08", "updated_at" => "2016-05-01 15:26:08", ], ], ]
嗯,还是没问题的。两个标签。
展示文章标签
文章展示的时候,一般在其下方会有文章的标签,下面我们就实现这个。打开 show.blade.php ,在 body div 下面再创建一个标签:
<h5 id="Tags">Tags:</h5><ul> @foreach ($article->tagsas $tag) <li> {{ $tag->name }} </li> @endforeach</ul>
刷新页面看一下效果吧,有点丑,别嫌丑啊,献丑下节不教你怎么点击了。
继续,有的文章有标签,有的文章无标签,那就做一个逻辑判断吧:
@unless ($article->tags->isEmpty()) <h5 id="Tags">Tags:</h5> <ul> @foreach ($article->tagsas $tag) <li> {{ $tag->name }} </li> @endforeach </ul>@endunless
给编辑页面也提供 tag
打开 ArticlesController.php ,找到 edit() 方法,其实和 create() 的做法一样:
public function edit($id){ $tags=\App\Tag::lists('name','id'); $article = Article::findOrFail($id); return view('articles.edit',compact('article','tags'));}
访问一下 localhost:8888/articles/10/edit ,可以看到标签,但是不知道哪些已经是选过的,如何能标记一下呢?
打开 Article.php,我们新建一个方法:
public function getTagListAttribute(){ return $this->tags->lists('id')->all();}
相应的 form.blade.php 也得修改一下:
{!! Form::label('tag_list','Tags:') !!}{!! Form::select('tag_list[]',$tags,null,['class'=>'form-control','multiple']) !!}
细心的同学应该已经发现,为什么在 Article.php 中有一个 getTagListAttribute() 的方法,而且在 form.blade.php 中直接调用 tag_list 就能获取到被选中的 tag 的值。这是 laravel 功能,它能够通过命名方式来自动关联方法与对象。
现在访问 localhost:8888/articles/edit 你会发现可以显示之前选中的 tag 了。
最后修改 store() 方法中获取 tag 的方法:
public function store(ArticleRequest $request){ $article = Auth::user()->articles()->create($request->all()); $article->tags()->attach($request->input('tag_list')); return redirect('articles')->with([ 'flash_message'=>'Your article has been created!', 'flash_message_important'=>true]);}
总结
好了,试着整个流程跑一遍,其实看似顺利,还是有瑕疵的。这个瑕疵留给你,或者下节课解决。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

세션 납치는 다음 단계를 통해 달성 할 수 있습니다. 1. 세션 ID를 얻으십시오. 2. 세션 ID 사용, 3. 세션을 활성 상태로 유지하십시오. PHP에서 세션 납치를 방지하는 방법에는 다음이 포함됩니다. 1. 세션 _regenerate_id () 함수를 사용하여 세션 ID를 재생산합니다. 2. 데이터베이스를 통해 세션 데이터를 저장하십시오.

PHP에는 4 가지 주요 오류 유형이 있습니다. 1. NOTICE : 가장 작은 것은 정의되지 않은 변수에 액세스하는 것과 같이 프로그램을 방해하지 않습니다. 2. 경고 : 심각한 통지는 파일을 포함하지 않는 것과 같은 프로그램을 종료하지 않습니다. 3. FatalError : 가장 심각한 것은 기능을 부르는 것과 같은 프로그램을 종료합니다. 4. parseerror : 구문 오류는 엔드 태그를 추가하는 것을 잊어 버리는 것과 같이 프로그램이 실행되는 것을 방지합니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP에서 Password_hash 및 Password_Verify 기능을 사용하여 보안 비밀번호 해싱을 구현해야하며 MD5 또는 SHA1을 사용해서는 안됩니다. 1) Password_hash는 보안을 향상시키기 위해 소금 값이 포함 된 해시를 생성합니다. 2) Password_verify 암호를 확인하고 해시 값을 비교하여 보안을 보장합니다. 3) MD5 및 SHA1은 취약하고 소금 값이 부족하며 현대 암호 보안에는 적합하지 않습니다.

HTTP 요청 방법에는 각각 리소스를 확보, 제출, 업데이트 및 삭제하는 데 사용되는 Get, Post, Put and Delete가 포함됩니다. 1. GET 방법은 리소스를 얻는 데 사용되며 읽기 작업에 적합합니다. 2. 게시물은 데이터를 제출하는 데 사용되며 종종 새로운 리소스를 만드는 데 사용됩니다. 3. PUT 방법은 리소스를 업데이트하는 데 사용되며 완전한 업데이트에 적합합니다. 4. 삭제 방법은 자원을 삭제하는 데 사용되며 삭제 작업에 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

화살표 기능은 PHP7.4에 도입되었으며 단순화 된 형태의 짧은 폐쇄입니다. 1) => 연산자를 사용하여 정의되어 기능을 생략하고 키워드를 사용합니다. 2) 화살표 기능은 사용 키워드없이 현재 스코프 변수를 자동으로 캡처합니다. 3) 종종 코드 단순성과 가독성을 향상시키기 위해 콜백 기능 및 짧은 계산에 사용됩니다.
