新規ページの作成ができたのでメモです。

管理画面のデザイン管理->ページ詳細編集で新規ページを作成できます。

ここでxxxという新規ページを作成すると以下の2箇所にファイルが生成されます。

user_data/xxx.php
user_data/packages/テンプレート名/xxx.tpl

xxx.phpにはLC_Pageクラスを継承したLC_Page_Userというクラスが自動生成されています。
クラス名は変えた方がいいと思います。

新規ページ用のクラスは0から作るより、これを改良した方が断然早いです。


今回はプライバシーポリシー用の新規ページを作ったのですが、以下のようにinitメソッドを少し改造しただけです。

function init() {
parent::init();
$this->tpl_mainpage = 'privacypolicy/index.tpl';
$this->tpl_title = 'プライバシーポリシー' ;
}

このtpl_mainpageという変数にセットしたtplファイルが、
site_main.tplファイルから呼ばれて実際に表示されることになります。


ちなみにprivacypolicy/index.tpというのはdata/Smarty/templates/テンプレート名/の下に自分で作成したものです。index.tplはuser_data/packages/テンプレート名/xxx.tplをファイル名を変えて移動させたものです。

※ 行の最後にセミコロンを入れ忘れると何も表示されませんのでご注意を。


後はこのuser_data/privacy_policy.phpにリンクを張ってやれば、新規ページが表示されます。


新規ページを作成した際の文字化け

これは個人的なことなので、スルーでいいかと思います。

EC-CUBEでは文字コードをUTF-8と想定しています。なのでテキストエディタ等でShift-Jisで書いたものをアップロードしたら文字化けしました。当然ですね。

メモ帳以外のテキストエディタなら大体ファイルを保存する際に文字コードを選択できるようになっているので、UTF-8を選んで保存したら直りました。

気づくのに約10分ほど・・・(;・∀・)

ではでは、今回はこの辺りで~(/・ω・)/

ブログトップへ
前回?だったかな、描画の流れはsite_main.tplを追っていくことになると
書いてたと思います。

まずこのsite_main.tplなんですが、ほぼ全てのページにアクセスした際、
ここが最初に呼び出されるようになってます。


//$objpage内の全てのテンプレート変数をsmartyに格納
$objView->assignobj($this);
//パスとテンプレート変数の呼び出し、実行
$objView->display(SITE_FRAME);

※ SITE_FRAMEはデフォルトでsite_frame.tplです。
  site_frame.tplは様々な宣言をした後、site_main.tplを読み込むだけです。

どこのページのphpファイルからアクセスしても、processメソッド内の最後に
↑の内容が実行されるので、まずはsite_main.tplファイルを読み込んでから、
個別ページのtplファイルが実行されて描画されるイメージですね。


site_main.tplの中身について

まずarrPageLayoutという連想配列がどこで宣言されてるのかですが、
これはSC_Helper_PageLayout.phpのprocessメソッド内で宣言されて
セットされています。

※ arrPageLayout.LeftNaviというSmartyの記述は
   phpファイル内で宣言されたarrPageLayoutという連想配列に
   arrPageLayout['LeftNavi']の要素にアクセスすることを
   意味します。

ここに何が入ってるのか??ということですが、現在のページを
構成するブロック情報が入ってます。

細かいこと書くと長くなるので今回は割愛しますが、このarrPageLayout
という連想配列、現在のページがブロックで構成されているなら、
事前にHelper_PageLayoutクラス内で情報がセットされるのですが、
ブロックを使わない単純なページの場合は情報がありません。

なので

if{ $arrPageLayout.LeftNavi | @count >0 }

というコードの部分ですが、ブロックで構成されるページはif文が
実行されますが、ブロックがないページ,つまり事前にHelper_PageLayoutが
呼び出されないページは実行されません。

※ @countは配列の大きさを返します。
  つまり @count > 0 は配列がなければ
  実行されないことを意味します。


もっと言えば、ブロックで構成されないページは

include file=$header_tpl

include file=$tpl_mainpage

include file=$footer_tpl

このコードだけが実行されることになります。

ちなみにこの$tpl_mainpageというのはアクセスしたphpファイル内で
initメソッドを実行した際にセットされるのが普通です。

残りのsite_main.tplの他の説明はまたいつか~

新年最初の記事は以上です(/・ω・)/

ブログトップへ

EC-CUBEのデフォルトショップがどのようなサイト構成に
なっており、トップページにアクセスされた際、どのような
処理フローが内部で行われているのか。

これをメモしておこうと思います。
これは書くとキリがないので、途中まで。


まずトップページがhtmlフォルダ内のindex.phpが実行されるのは、
誰でも分かるかと思います。

そのファイルを見るとLC_Page_Index_EXというクラスのインスタンスが
生成されて、初期化(init)と実行(process)が行われているだけです。

ちなみにLC_Page_Index_Exの実態はLC_Page_Indexを継承して
同じ動作を行ってるだけです。なので、内部での動きは
LC_Page_Indexクラスを解読することになります。

※ LC_Page_Index_EXはLC_Page_Indexクラスをカスタマイズしたい
   ときに使う改造用のクラスですね。直接LC_Page_Indexクラスを
   編集するのは安全性やバージョンアップした際のマージ作業の
   観点から厳禁です。オブジェクト指向を学んでないと何を言ってる
   のか分からないかも・・・(-ω-;)

で、LC_Page_Indexクラスのprocessメソッドを見てみると非常に
短いことにびっくりw

function process() {

$objView = new SC_SiteView();

// レイアウトデザインを取得
$layout = new SC_Helper_PageLayout_Ex();
$layout->sfGetPageLayout($this, false, "index.php");

$objView->assignobj($this);
$objView->display(SITE_FRAME);
}

次にでてくるのは、SC_SiteViewクラスとSC_Helper_PageLaoutクラスですね。

SiteViewクラスはLC_Pageクラスを継承するクラスのインスタンス
(ここならLC_Page_Indexクラスですね)を表示する目的のクラスと
思えば問題ないかもしれません。

つまりSiteViewクラスは表示が仕事なので、サイト構成は
Helper_PageLayoutクラスの方で行われていることになります。


ざっくり言えば、サイトを表示するために必要な情報を

$layout->sfGetPageLayout($this, false, "index.php");

を実行することで、LC_Page_Indexクラスに全部格納したり宣言しておきます。

で、必要な情報が揃ったらSiteViewクラスに、「後は表示をよろしく~」と
ポイっと以下の2文で任せます。

$objView->assignobj($this);
$objView->display(SITE_FRAME);

※SC_Helper_PageLayoutクラスはサイトの表示に必要なデータを揃える
 作業だけしてるので、表示は行ってません。

※ SITE_FRAMEは管理画面ー>システム設計ー>パラメータ設定で定義
  されている、

data/Smarty/templates/default/site_frame.tplファイルのことです。

$objView->display(xxxx.tpl);という書き方をすることで、xxxx.tplファイル内の
HTMLが描写されるようです。


余談

最終的にサイトを表示するのは.tplファイルに記述されているHTMLですね。
php,css,smarty等はあくまでデザインを統一したり、動的なデータを扱うために
使用してるだけにすぎません。

HTMLだけだと、動的データが扱えない。だからこれらを使って、ごちゃごちゃ
したプログラムを作ってるだけです。


話を戻して、つまり最初に実行されるHTMLが記述されているファイルは
site_frame.tplファイルになりますね。


中身はこんな感じ。


<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<!--{$smarty.const.CHAR_CODE}-->" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="stylesheet" href="<!--{$smarty.const.URL_DIR}--><!--{$smarty.const.USER_DIR}-->css/common.css" type="text/css" media="all" />
<link rel="alternate" type="application/rss+xml" title="RSS" href="<!--{$smarty.const.SITE_URL}-->rss/index.php" />
<script type="text/javascript" src="<!--{$TPL_DIR}-->js/css.js"></script>
<script type="text/javascript" src="<!--{$TPL_DIR}-->js/navi.js"></script>
<script type="text/javascript" src="<!--{$TPL_DIR}-->js/win_op.js"></script>
<script type="text/javascript" src="<!--{$TPL_DIR}-->js/site.js"></script>
<title><!--{$arrSiteInfo.shop_name|escape}-->/<!--{$tpl_title|escape}--></title>
<meta name="author" content="<!--{$arrPageLayout.author|escape}-->" />
<meta name="description" content="<!--{$arrPageLayout.description|escape}-->" />
<meta name="keywords" content="<!--{$arrPageLayout.keyword|escape}-->" />

<script type="text/javascript">//<![CDATA[
<!--{$tpl_javascript}-->
//]]>
</script>
</head>

<!-- ▼BODY部 スタート -->
<!--{include file='./site_main.tpl'}-->
<!-- ▲BODY部 エンド -->

</html>


body部でやってるのはsite_main.tplファイルの読み込みだけです。
ちなみに.tplファイル内で

<!--{include file='yyyyyy.tpl'}-->

という記述をすると、yyyyy.tplというファイルが実行されるようです。


今後の解読の流れとしては、サイト表示に必要なデータは
SC_Helper_PageLayoutクラスを解読する必要があります。
何が宣言されてどんなデータがSC_Helper_PageLayoutを用いて
LC_Page_Indexクラスに格納されているのか調べる必要があります。


サイト表示の処理の流れはsite_main.tplファイルを追って
いくことになります。そこではSC_Helper_PageLayoutを用いて、
LC_Page_Indexクラスに格納されたり宣言されたデータを
使いながらHTMLを完成させて表示していくことになります。


ちょとキリがないので、今回はここまでにしますね~(/・ω・)/

ブログトップへ