業務アプリ開発講座

TempMasterHtml.phpを使用する

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>";
NAV_HEAD_BLOCK

画面上部の黒背景部分全体のタグです。左端にアプリのタイトルが、右端にログアウトがあるところです。

NAV_HEAD_SUB_BLOCK

画面上部の黒背景部分のうち、右側に配置されるメニュー部分全体のタグです。「売上管理」や「マスタ管理」が表示されているところです。

NAV_HEAD_ITEM

メニュー一つ一つのタグです。

これらを用いて、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されるようにしておきます。