HTMLのTemplate(雛形)をまとめて管理するTempMasterHtml.php
を作成し、classAppMasterHtml
に当てはめていきます。
まず、HTMLのheadタグ部分とその周りの、DOCTYPE
から<body>
までをひとまとめにしたものをclass内の定数として定義します。もう少し細分化して、DOCTYPE部分とheadブロックを分けても定義する方法もあります。その方が融通が効く場合もあります。例えば、ページによって読み込むスタイルシートファイルを個別に定義したい場合などはhead部分を独立して定義した方が良いかもしれません。ここではWordPressの方法に習ってまとめて定義します。
class TempMasterHtml.php{ const HTML_HEAD= <<<DOC <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8"> <title>%s</title> <base href="http://%s/"> <link rel="stylesheet" href="./assets/style.css" type="text/css" charset="utf-8"> </head> <body> DOC; }
定数HTML_HEAD
の内には指示子%s
が二箇所でてきます。1番目にはアプリのタイトル、すなわち、Init.php
で設定した$GLOBALS['name']['app']
が代入され、2番目にはサーバー名が、同じく$GLOBALS['name']['server']
が代入されます。
さてこの定数を使うようにclassAppMasterHtml
の関数htmlHeader()
を変更します。
class AppMasterHtml{ public function htmlHeader(){ return sprintf(TempMasterHtml::HTML_HEAD, $GLOBALS['name']["app"], $GLOBALS['name']["server"]); } }
続いて、以下をTempMasterHtml.php
に追記します。
const NAV_HEAD_BLOCK = <<<DOC <nav class="navbar navbar-inverse navbar-static-top"> <div class="container-fluid"> <div class="navbar-brand">%s</div> <div> <ul class="nav navbar-nav navbar-right"> %s </ul> </div> </div> </nav> DOC; const NAV_HEAD_SUB_BLOCK = <<<DOC <li class="dropdown"> <a href="#" onclick='return false'>%s <i class="caret"></i></a> <ul class="dropdown-menu"> %s </ul> </li> DOC; const NAV_HEAD_ITEM = "<li><a href='%s'>%s</a></li>";
画面上部の黒背景部分全体のタグです。左端にアプリのタイトルが、右端にログアウトがあるところです。
画面上部の黒背景部分のうち、右側に配置されるメニュー部分全体のタグです。「売上管理」や「マスタ管理」が表示されているところです。
メニュー一つ一つのタグです。
これらを用いて、classAppMasterHtml
の関数navHeader()
を変更します。
public function navHeader(){ $navData = AppData::sitemap(JsonDecodeType::TYPE_OBJECT); $tempNavBarBlock = TempMasterHtml::NAV_HEAD_BLOCK; $tmpChildBlock = TempMasterHtml::NAV_HEAD_SUB_BLOCK; $tempLink = TempMasterHtml::NAV_HEAD_ITEM; $navItems = []; //第1階層メニュー(ナビゲーションバーのメニュー) foreach($navData as $obj){ if(isset($obj->child)){ //第2階層メニュー(マウスオーバーで表示されるサブメニュー) $navChildItems = []; foreach($obj->child as $childObj){ $navChildItems[] = sprintf($tempLink, $childObj->url, $childObj->name); } $navItems[] = sprintf($tmpChildBlock, $obj->name, implode("\n", $navChildItems)); } else{ $navItems[] = sprintf($tempLink, $obj->url, $obj->name); } } return sprintf($tempNavBarBlock, $GLOBALS['name']['app'], implode("\n", $navItems)); }
sitemap
情報を前回作成したclassAppData
から取得しています。続いて、先ほと作成たclassTempMasterHtml
のタグ3つを変数に代入しています。このようにテンプレートタグを変数に代入せずに直接、関数sprintf
の引数に指定しても構いません。
sprintf(TempMasterHtml::NAV_HEAD_ITEM, …);
ただ、繰り返し処理中で何度も参照するわけですから、今回のメニュー程度であれば、さしてパフォーマンス等に影響することもないでしょう。もし、何かしらの処理を含んでいるような関数をテンプレートとして指定する場合は、直接sprintf
に指定する方法には注意が必要です。
次回はInit.php
に戻って、動的にincludes
内のクラスファイルをrequire_once
する方法を示します。開発を進めていくとクラスファイルをどんどん追加していきます。その度にrequire_once
を追記していくのも面倒ですので、クラスファイルを追加したら自動でrequire_once
されるようにしておきます。