TOP

還暦過ぎのITはつらいよ!

プログラミング

phpフレームワーク自作7

画面表示処理

すすき妙高山山ろく

フレームワークを使って処理したものを、画面表示する機能を実装していきます。
ここでは、既存のテンプレートエンジンのような、有用な機能を詰め込んだものではなく、
シンプルで、ロジックがわかりやすいものを目指して、作成していくことを念頭においております。
加えて、馴染みのあるテンプレートエンジンである、「Smarty」も組み込み、どちらかを選択できるようなものにしております。

目次

  1. ディレクトリ構成
  2. 表示処理の大まかな仕組み
  3. 差込データのデータ構造
  4. 表示処理の流れ
  5. フレームワークを使っての画面表示作成手順と留意点
  6. テンプレートライブラリーsmartyの導入
  7. 実装コード
  8. 表示処理呼び出しサンプルコード

ディレクトリ構成

画面表示に係わるフォルダーファイル構成は以下のようになります。


framwork2/              # フレームワークコア
  lib/
    html_view/          # rendering処理コアクラス
      CreateHtml.php    # html文生成処理
      CreateTagStr.php  # html タグ生成
      HtmlDts.php      # 挿入差し替えデータを操作する
  bootstrap.php         # ライブラリ読み込み、オートロード

APPNAME/                # アプリケーションフォルダー
  views/                # mvcのviewに係わるフォルダー
    Create2sec1.php     # ↓↓ テンプレートファイルに対応したhtml文生成処理
    CreateCode2.php
    CreateException.php
    CreateTablesec1.php
    CreateTemplate_1.php
    mytemplate/         # テンプレートファイルに係わるクラス
      cache/            # キャッシュファイル格納
        fdd5439aa87946bc14d80d742b95e39ec8b1f86.php
      temp_exception.php # ↓↓ テンプレート
      template_1.php
      template_2.php
      template_code2.php
      template_table.php
      template_table2.php	
    util/                     # 表示処理を簡略化する
      CreateTablesec1Temp.php
      CreateTablesec1Temp2.php
    MySmarty.php              # smarty設定拡張ファイル
    templates/                # smartyテンプレート格納           
    templates_c/              # smarty キャッシュ格納
vendor/                       # 外部ライブラリー格納
  smarty/                     # smarty本体
  autoload.php                # 外部ライブラリーオートロード
htdocs/
  APPNAME/                    # アプリケーション公開領域
    test-index2.php
    test-index3.php
    test-table.php
    test-ul.php 
    test-util-table2.php

表示処理の大まかな仕組み

表示処理の仕組み
実装しようとする表示処理の仕組み

①表示しようとする、変動データを変数に格納する。

②-1 データに対応する、テンプレートファイルの差し替えようマークをテンプレートファイルに記入し、差し替え処理をする。

②-2 データ(単一データに限らず)それぞれ任意のhtmlタグを付加する処理をし、テンプレートファイルの差し替え用テンプレートファイルにデータブロック単位に対応したマークを記入し、差し替え処理をする。

③差し替え後のファイルを任意のファイル名(phpファイル)で保存し、それを取り込み処理requireし、ブラウザに送り出す。

差込データのデータ構造

テンプレートファイルの差込マークに直接差し替えする場合

テンプレートファイルに一次元配列データを差し込む場合
テンプレートファイルに一次元配列データを差し込む場合

単純に、差込マークに対応したデータを配列として渡します。その際、そのデータをマークアップするhtmlタグや、php関数、制御文は直接テンプレートファイルに記載しておくことになります。

差込マークに対して、任意の差し替えデータ配列にそれぞれhtmlタグとして生成したものを差し替えする場合

htmlタグとして生成したものを差し替えする場合
htmlタグとして生成したものを差し替えする場合

<使用可能タグと配列データ構造>

使用可能タグと配列表現
使用可能タグと配列表現

array[mark block][tag block][tag]

mark blockは差し込みマークの順番に対応しています。tag blockはたとえばulタグの場合はliタグが任意の個数連なることになりますが、そのul開始タグと終了タグのなかにあるliタグで囲まれたデータすべてをひとつのブロックとして捕らえ、その中にあるli要素の順番を示しています。tagはそのブロック内の子要素の順番をあらわしています。但し、array[mark block][tag block][0]はどういうタグに変換するかを識別する為の文字列が格納されます。また、4次元目は子要素の子要素名または属性などを連想配列として表現しています。
識別文字列と可能htmlタグ、属性は以下のようになっております。

plain<---識別文字列
link, str<---連想配列のキーとなる。
ul
link, str
ol
link, str
img
link, name, alt
dl
link, dt, dd
tag
link,”p”,”h1″,”h2″,”h3″,”h4″,”h5″,”h6″,”li”,”span”,”mark”,”strong”,”small”
table
caption, th[], td[[]]
* th[列名,列名,列名,・・・]
* td[[link,data,data,data,・・・]]

表示処理の流れ

処理の流れ
処理の流れ
  1. データ構造に従って構築された差し替えに必要なデータを引数にしたHtmlDtsオブジェクトを生成する。
  2. 生成されたオブジェクトとテンプレートファイル名、レンダリング処理ファイル名を引数にした、displayメソッドを実行する。
  3. displayメソッドではレンダリング処理オブジェクトを生成し、表示処理に必要なデータがプロパティとしてセットされる。
  4. レンダリング処理オブジェクトのviewメソッドを呼び出す。
  5. viewメソッドでは、タグを生成しない場合はそのデータがそのままテンプレートファイル内のマーク置き換え処理に使われますが、タグを生成する場合は、そのメソッド内でgetCreatehtmlsメソッドが呼び出される。
  6. getCreatehtmlsメソッドではセットされたプロパティの3次元データを使ってCreateTagStrオブジェクトを生成し、タグ付加処理をしたものをコンテンツブロック単位の配列にまとめてviewメソッド内のデータとしてつかわれる。
  7. テンプレートファイル内のマーク文字列を生成されたコンテンツブロックに置き換えられ画面表示される。

フレームワークを使っての画面表示作成手順と留意点

  1. APPNAMEディレクトリ/views/任意のでレクトリ。ここではmytemplateに表示するwebページのベースとなるファイル(テンプレートファイル)を作成する。さしかえられるのは#英数文字列#であり、#title#、#id_name#、は必須です。#英数文字列#は任意個設定可能ですが、差し込み処理をする、phpファイルと対応していなければならない。また、phpファイルとして読み込まれなければならないので、差し替え文字列にはエスケープ処理コードをあらかじめ定義しなければならない
  2. APPNAMEディレクトリ/views/に上記のテンプレートファイルの#文字列#記号の部分をhtmlタグ文字列に整形されたデータで差し替える処理をするファイルを作成する。createHtmlクラスを継承する。
  3. 表示するデータを渡し、実行させるファイルを作成する。また、表示するデータのデータ構造に沿って、予め決められたフォーマットをつくり、データを構築しやすくしたもの、たとえばtableデータなど、を製作アプリケーション独自に定義するフォルダーとして、utilフォルダー内に必要であれば作るのが望ましい。

テンプレートライブラリーsmartyの導入

自作のレンダリング処理で機能を追加することは可能ですが、実績のある、テンプレートライブラリーにある、有用な機能を利用したほうが得策であると考えた場合には、システムに組み込んでおいたほうが懸命だと思います。
smartyに限らず、外部ライブラリーを利用するには、composerというツールを使って取り込むのが一般的になっております。導入方法についての詳細はここでは割愛いたしますが、ここではAPPNAMEフォルダーと同じディレクトリーにcomposer.jsonファイルを作成したものとして話を進めていくことにいたします。

  1. composer.jsonファイルを作成します。
    {
    "require": {
      "smarty/smarty": "~3.1",
    }
    
  2. ターミナルウィインドを開き、プロジェクトのルートディレクトリ、ここではAPPNAMEフォルダーと同じディレクトリーに移動しcomposer installを実行します。
  3. 同じディレクトリ内にvendorフォルダーが作られ、その中にパッケージが配置されます。
  4. そのフォルダーにある、autoload.phpをフレームワークシステムに取り込めば、smarty本体をうごかせるようになります。ここではフレームワークコアフォルダー内のbootstrap.phpの中に取り込まれることになっております。
  5. アプリケーションにおいては、APPNAMEフォルダー配下viewsディレクトリ内にSmartyクラスを継承したMySamrtyクラスをつくり、このクラスのインスタンスを利用することになります。

実装コード

html_view rendering[処理コアクラス]

~html文生成処理

CreateTagStr.php~htmlタグ生成

CreateTagStr.php~htmlタグ生成 HtmlDts.php~挿入差し替えデータを操作する

CreateTagStr.php~htmlタグ生成 HtmlDts.php~挿入差し替えデータを操作するAPPNAME views processing[データ差し替え表示処理実行クラス]

Create2sec1.php~差し替えマークが#c1# #c2#タイプの処理

Create2sec1.php~差し替えマークが#c1# #c2#タイプの処理CreateCode2.php~差し替えマークが#p1# #p2#タイプの処理

CreateException.php~差し替えマークが#contents# #url#タイプの処理

CreateException.php~差し替えマークが#contents# #url#タイプの処理CreateTablesec1.php~差し替えマークが#h2-1# #table1#タイプの処理

CreateTemplate_1.php~差し替えマークが#c1#タイプの処理

CreateTemplate_1.php~差し替えマークが#c1#タイプの処理required template file[テンプレートファイル]

temp_exception.php~例外表示用#contents# #url#タグを生成しないタイプのファイル

template_1.php~#c1#タグを生成するタイプのファイル

template_2.php~#c1# #c2#タグを生成しないタイプのファイル

template_2notag.php~#c1# #c2#タグを生成するタイプのファイル

template_code2.php~ソースコード用#p1#タグを生成しないタイプのファイル

template_table2.php~テーブル表示用#h2-1# #table#タグを生成するタイプのファイル

utility〔予め決まったフォーマットでデータを容易に入力し表示する〕

CreateTablesec1Temp2~template_table2を使ったテーブル表示処理

表示処理呼び出しサンプルコード

test-index2.php~タグを生成しないケース

タグを生成しないケース
タグを生成しないケース

test-index3.php~タグを生成するケース

タグを生成するケース
タグを生成するケース

test-util-table2.php~テーブルタグを生成するケースCreateTablesec1Temp2.php利用

ableタグを生成するケース
tableタグを生成するケース

☆ 関連ページは以下に記載されております。↓↓

phpフレームワーク自作連載目次

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください