https://teratail.com/questions/235419?campaignid=11c8856bd6
勉強の為にシェアしました。
htmlでimportみたいなことってできるの?
そういうときってどのような解決方法がありますか?
phpを使ってechoする方法も考えましたが、なんともスマートでない気がする…
html単体でも他の言語のように簡単にimportできるものかと思っていましたが、どうやら難しそうなので、phpのincludeで利用するのが一番自分の想定していた使い方に近かったのでベストアンサーとさせていただきます。
もう使えない技術を半端に古い情報に騙されて使い出すのは初心者がやりがちな間違い。
https://developer.mozilla.org/ja/docs/Web/Web_Components/HTML_Imports
https://qiita.com/ka-miyata/items/63e41e4105d7aeb44d6c
2013の情報見ても全く役に立たない。
https://www.html5rocks.com/ja/tutorials/webcomponents/imports/
PHPでも単純なincludeからWordPressのテーマ、フレームワークと徐々に洗練されていくので自分のレベルに合わせて選ぶ。
→なら可変部分だけechoすればviewは1ファイルで済むじゃない
が私の回答です。
スマートだと思ったんだけどなあ(コード量も)
管理したいパーツは静的なものです。ツールのようなものに頼らずhtmlのみで実現できないのでしょうか?
今はphpで長い文字列としてheader部分をまとめて変数に入れておいて、それを各ファイルでechoする、という形で管理していますが…
SSI
https://ja.wikipedia.org/wiki/Server_Side_Includes
Web Components の最近の仕様と開発手法
https://qiita.com/ka-miyata/items/63e41e4105d7aeb44d6c
ただし、薦めないです。
全コントローラーから最後に読み込ませて可変部分だけ渡してそこだけechoすると良いです。
tmp.php<html>
<title>hoge[ページ<?=$title?>]</title>
<body>
<p><?=$hello?></p>
</body>
</html>
a.php$title='a';
$hello='こんにちは';
require_once 'tmp.php';
b .php$title='b';
$hello='ニーハオ';
require_once 'tmp.php';
テンプレートエンジン(Smarty,Twigなど)使えばもっとそれっぽく簡潔な記述でできます。
<!-- /parts/header.html -->
<p>ここは、共通ヘッダーです。<a href="/parts/header.html">このhtmlファイル</a>を読み込んで表示しています</p>
<!-- /parts/footer.html -->
<p>ここは、共通フッターです。<a href="/parts/footer.html">このhtmlファイル</a>を読み込んで表示しています</p>
各ページにFilament GroupのScott JehlさんのHTMLインクルード手法を使って、以下のように取り込みます。<!-- /index.html -->
<!DOCTYPE html>
<html lang="ja">
<head><title>テスト</title></head>
<body>
<iframe src="/parts/header.html" onload="this.before((this.contentDocument.body||this.contentDocument).children[0]);this.remove()"></iframe>
<p>ここは、ページ固有のコンテンツです。</p>
<iframe src="/parts/footer.html" onload="this.before((this.contentDocument.body||this.contentDocument).children[0]);this.remove()"></iframe>
</body>
</html>
<!-- /index.html -->
<!DOCTYPE html>
<html lang="ja">
<head><title>テスト</title></head>
<body>
<p>ここは、共通ヘッダーです。<a href="/parts/header.html">このhtmlファイル</a>を読み込んで表示しています</p>
<p>ここは、ページ固有のコンテンツです。</p>
<p>ここは、共通フッターです。<a href="/parts/footer.html">このhtmlファイル</a>を読み込んで表示しています</p>
</body>
</html>
この手法だとJSがOFFになっていても通常のiframeにフォールバックします。
また共通部分の内容を変えただけで変更がないメインコンテンツ部分のブラウザ側キャッシュが無駄になることもありません。
その他メリット・デメリットについては上で挙げたリンク先の記事をご覧ください。
要件に合うようでしたらご検討ください。
HTMLだけで完結したいのであれば、
<iframe>タグで似たようなことは可能かと思います。
(正しい使い方かどうかはわかりませんが)
各フレームワークやツールのドキュメントを読むと、大体そういう機能は載ってると思います。
「テンプレート」だけだと色んな意味や機能がヒットしてしまうので、このワードが最適解かどうかはわからないです。
もっと適切な探し方を思いつく方がいたら、コメントいただければ幸いです。
0 コメント:
コメントを投稿