質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

293閲覧

Laravel 5 の blade において、Modelによって各行の振る舞いが異なるリスト画面を作成したい

newmog2004

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/07/15 19:30

前提・実現したいこと

Laravelにてリスト画面を構築しています。
ModelとしてContent(コンテンツとして共通情報を持つ)とそれにmorphToを設定した、
VideoContent(動画コンテンツ)、PhotoContent(写真コンテンツ)を作成しました。

リスト画面において、動画と写真コンテンツが混在していながらも、
各行は動画と写真で異なる表示がしたいと考えております。

そこで、bladeを下記のように組んで、実現できないかと考えました。
簡単に書くと、

row-base.blade.php ・・・ コンテンツ各行の基本VIEW(各種別のコンテンツが定義されていない場合はこちらが読み込まれる)
row-video.blade.php ・・・ row-baseを継承し、動画コンテンツの行のデザイン(statusセクションだけ上書き)
list.blade.php ・・・ @includeFirstを使用して、row-****を読み込む。

ソースコード

list.blade.php

PHP

1@foreach($contents as $content) 2 // $content->typeにはvideo/photoが入ります。 3 // content-list-row-[type]が存在すればそのviewファイルを読む 4 @includeFirst(["parts.content-list-row-{$content->type}", 'parts.content-list-row-base']) 5@endforeach

parts/content-list-row-base.blade.php

PHP

1<tr> 2 <td> 3 @section('title') 4 {{ $content->title }} 5 @show 6 </td> 7 <td> 8 @section('status') 9 @switch($content->status) 10 @case(\App\Model\Content::STATUS_OK) 11 正常 12 @break 13 14 @case(\App\Model\Content::STATUS_NG) 15 異常 16 @break 17 @endswitch 18 @show 19 </td> 20</tr>

parts/content-list-row-video.blade.php

PHP

1@extends('parts.content-list-row-base') 2@section('status') 3 @switch($content->status) 4 @case(\App\Model\Content::STATUS_OK) 5 // $content->concreteでVideoContentを取得 6 // VideoContentのdetail_statusで詳細表示 7 @switch($content->concrete->detail_status) 8 @case(\App\Model\VideoContent::STATUS_UPLOADING) 9 正常(アップロード中) 10 @break 11 12 @case(\App\Model\VideoContent::STATUS_COMPLETED) 13 正常(アップロード完了) 14 @break 15 @endswitch 16 @break 17 18 @case(\App\Model\Content::STATUS_NG) 19 異常 20 @break 21 @endswitch 22@endsection

発生している問題・エラーメッセージ

上記のように実装したのですが、全ての行が同じコンテンツの$contentを処理してしまいます。
(各行が全く同じ表示になってしまう)

各行のコンテンツを個別に別々に表示したいのですが、上記のように各行の振る舞いを変えたい場合は、
どのようにbladeを書いたらベストプラクティスになるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/07/16 00:04

$contentsをdd()した結果をご提示ください。
m.ts10806

2019/07/16 00:04

あとできれば\App\Model\Contentのコードも
guest

回答2

0

ベストアンサー

各行が全く同じ表示になってしまう

ループしている間に使っているsectionの名前が、全て同じだからですね。

sectionは、

php

1@section('xxx')

と、一度定義した名前の内容を、後から上書きすることはできないんです。
(イメージ言うなら、「変数」ではなく「定数」という感じ)

なので、今は$contents[0]の内容が、count($contents)行分表示される・・という不可思議な一覧になっていると思われます。


私ならばこうするかなぁ。。というbladeの内容です。

と言っても、仕様によっては、これではダメな部分もあると思いますので、あくまでご参考までに。。。

■ 変更点
一覧では@sectionは使いません。
また、$content->statusの判断が、$content->typeに依存しないのであれば、そこもまとめてしまいたいかなぁと思いましたので、下記のような感じに。

list.blade.php

php

1@foreach($contents as $content) 2<tr> 3 <td>{{ $content->title }}</td> 4 <td> 5 @switch($content->status) 6 @case(\App\Model\Content::STATUS_OK) 7 @includeFirst(["parts.content-list-row-{$content->type}", 'parts.content-list-row-base']) 8 @break 9 10 @case(\App\Model\Content::STATUS_NG) 11 異常 12 @break 13 @endswitch 14 </td> 15</tr> 16@endforeach 17

parts/content-list-row-base.blade.php

php

1正常

parts/content-list-row-video.blade.php

php

1 @switch($content->concrete->detail_status) 2 @case(\App\Model\VideoContent::STATUS_UPLOADING) 3 正常(アップロード中) 4 @break 5 6 @case(\App\Model\VideoContent::STATUS_COMPLETED) 7 正常(アップロード完了) 8 @break 9 @endswitch

投稿2019/07/16 02:53

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newmog2004

2019/07/16 05:37

mix-peach様、ありがとうございます!! > なので、今は$contents[0]の内容が、count($contents)行分表示される・・という不可思議な一覧になっていると思われます。 まさに仰る通りになっています。 なるほど、@sectionの内容を上書きすることはできないのですね。 継承などを使って上手くContentの種別によった振る舞いを1つのbladeで定義できるかと思ったのですが、そういう用途では厳しそうですね・・・。 実際には各列<td>ごとにContentの種別による内容が変わってくる可能性があるので、 @includeするbladeが増えてしまいそうです・・・。 とりあえず、制限について理解しました! 親切なご説明、ありがとうございます!
guest

0

Laravel Bladeはコンパイルされると、素のPHPに変換され、
プロジェクトディレクトリの、storage/framework/views以下に出力ファイルが格納されるので、
挙動を確認したいときはみてみてください。

投稿2019/07/17 06:59

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問