パターン

現在、サイトの99.9%がPHPテンプレートを使用しています。 多くのエンジンでは、これは不可欠な部分です。 まったく異なるアプローチを紹介したいと思います。

最近、私はテストタスクを開発していたので、JSテンプレートを使用してみることにしました。



結果は次のとおりです。







1).htaccessを使用してURLを解析し、必要なHTMLページを返すことにより、ダウンロードが開始されます。

2)ブラウザはJavaScriptサーバーからロードします。

3)最初の初期化を開始します:テンプレートファイル(.skin)と必要な言語のファイル(.lang-たとえば、XML形式)の読み込み。

4)データをロードし、ロードされたテンプレートを使用してブラウザにレンダリングします。

5)キーストローク、リンクなどを処理します。 (おそらく、別のトピックで前後の処理について説明します:))

6)必要に応じて、サーバーにリクエストを送信して新しいデータを受信します。



1. AJAXモジュール

XML / JSONを受信し、指定されたJS関数にさらに引き裂くために送信するためのモジュール。 必要に応じて、複数の連続したリクエストを実行できます。
関数 ajax_load(url、パーサー、パー、次){

var req、ab、done = 0;

this .request = function (){

if (window.XMLHttpRequest)

ajaxRequest = new XMLHttpRequest();

else if (window.ActiveXObject){

ajaxRequest = new ActiveXObject( "Msxml2.XMLHTTP" );

if (!ajaxRequest)

ajaxRequest = new ActiveXObject( "Microsoft.XMLHTTP" );

}

return ajaxRequest;

}



this .ReqStatus = function (){

if (req.readyState == 4){

clearTimeout(ab);

if (req.status == 200){

パーサー(req、par);

if (次)

ajax_load(次[0]、次[1]、次[2]、次[3]);

} その他

alert( "AJAXエラー:\ n" + req.statusText + "\ n" + url);

}

}



if (!url)

return parcer(par);



req = this .request();

req.onreadystatechange = this .ReqStatus;

req.open( "GET" 、url、 true );

req.send( null );

ab = window.setTimeout( function (){req.abort();}、10000);

return req;

} *このソースコードは、 ソースコードハイライターで強調表示されています。
この機能を使用して、メインページをリロードせずにサーバーからデータをロードします。

入力-URLリクエスト処理用のJS関数、関数用の 追加パラメーター 、[ 次の順次リクエスト用のURLJS関数追加パラメーター 、[ URL ... ]]



2.スキンモジュール

パラメータ付きテンプレートをHTMLに変換するためのモジュール。
関数 Skin(){

var that = this ;

this .skin = new Array();



this .trace = function (file){

var f、x;

var rx = / <!SKIN '([\ w \ d] +)' >([\ s \ S] *)<!END '\ 1' > / gim

f = that.skin [ファイル] .match(rx);

forvar i in f){

x = rx.exec(f [i]);

that.skin [ファイル+ "。" + x [1]] = x [2];

that.trace(ファイル+ "。" + x [1]);

that.skin [ファイル] = that.skin [ファイル] .replace(f [i]、 '' );

}

}



this .use = function (html){

var str;

{

if (!(str = html.match(/%([\ w \ d。] +)%/ gim)))

休憩 ;

forvar i in str){

var tp = str [i] .replace(/%/ gi、 '' );

if (that.skin [tp])

html = html.replace(str [i]、that.skin [tp]);

他に

html = html.replace(str [i]、 '' );

}

} while (1);

return html;

}



this .redraw = function (window、html){

if (! document .getElementById(window))

アラート( 「ID付きのERR +ウィンドウ );

document .getElementById(ウィンドウ).innerHTML = that.use(html);

}

} *このソースコードは、 ソースコードハイライターで強調表示されています。


モジュールには次の機能があります。

trace-次の形式の文字列から追加のパターンを生成します。

<! SKIN ' pattern_name_1 ' > ... ... <! END 'pattern_name_1' >

それらを%template_name_1%、%template_name_1.name_of_pattern_name%、%template_name_2%に変換しています。

use-テンプレート内のパラメーターの置換。 テンプレートのパラメーターは%parameter_name%に保存されます。

redraw-変換されたテンプレートを要素に書き込みます。HTMLidを使用して目的の要素を識別します。



3.パターンの使用

オンラインストアの一部を取得します。 ユーザーがいたかどうかだけを表示して、表形式で情報を出力します。

たとえば、テンプレート( main.skin )を次のようにします。
<! スキン 「ボディ」 >

< div id =“メニュー” >

< span class = "goods_name" onclick = "ShowInfo();" > %LANG.INFO% </ span >

< span class = "goods_name" onclick = "ChangeLang( 'rus')" > %LANG.RUSSIAN% </ span >

< span class = "goods_name" onclick = "ChangeLang( 'eng')" > %LANG.ENGLISH% </ span >

</ div >

< div id = "main" >

<! スキン 「ウェルカム」 >

<! SKIN 'FIRST' > %LANG.WELCOME_NEW% <! 「最初」で終了 >

<! SKIN 'DATE' > %DAY%。%MONTH%。%YEAR% <! 終了 「日付」 >

<! SKIN 'LAST' > %LANG.WELCOME_OLD %% SKIN.WELCOME.DATE% <! END 'LAST' >

<! 「ウェルカム」の終了 >

</ div >



...



<! スキン 「オーダー」 >

< テーブル クラス = "価格" = "500ピクセル" >

%PRICES%

<! SKIN 'PIECE' > < tr id = "%GOODS_ID%" > < td class = "order_name" > %GOODS.NUM%。 %GOODS.NAME% </ td > < td > %GOODS.PRICE% </ td > </ tr > <! 「ピース」の 終わり >

</ >

<! 「注文」の終了 >

<! スキン 「ローディング」 >

%LANG.LOADING%

<! 「ロード」の終了 >



...

<! END 'BODY' > *このソースコードはSource Code Highlighterで強調表示されました。
言語インターフェースを備えたXMLファイル( rus.xml ):
<? xml バージョン = "1.0" encoding = "windows-1251" > < オブジェクト >

< 言語 > rus </ 言語 >

< word name = "ENCODING" > windows-1251 </ word >

< word name = "INFO" >情報</ word >

< word name = "SUPPORT" >お問い合わせ</ / word >

< word name = "ENGLISH" >英語</ word >

< word name = "RUSSIAN" >ロシア語</ word >

< word name = "WELCOME_NEW" >ようこそ、新しいユーザー。 </ word >

< word name = "WELCOME_OLD" >あなたの最後の訪問は</ word >

< word name = "LOADING" >サイトベースへの接続が進行中です</ word >

</ オブジェクト > *このソースコードは、 ソースコードハイライターで強調表示されました。
次に、テンプレートをブートストラップしてコントロールを転送するJSコードを作成します( main.js ):
//テンプレートのオブジェクトを作成します

var skins = new Skin();



// XML言語テンプレートの形式でロードされたテンプレートに追加する%LANG.xxxxxx%

関数 SetLanguageXML(req){

var r = req.responseXML.getElementsByTagName( "word" )、i;

for (i = 0; i <r.length; i ++)

skins.skin [ 'LANG。' + r [i] .attributes.getNamedItem( "name" ).value] = r [i] .firstChild.nodeValue;

}



//ロードされたテンプレートを%SKIN.xxxxxx%で解析

関数 TraceResponse(req){

skins.skin [ 'SKIN' ] = req.responseText;

skins.trace( 'SKIN' );

}



//言語をロードし、テンプレートをロードし、この後、初期化に進みます

ajax_load( "rus.xml" 、SetLanguageXML、 null 、[ "main.skin" 、TraceResponse、 null 、[ null 、RedrawAll]]); *このソースコードは、 ソースコードハイライターで強調表示されました。


初期化後にブラウザウィンドウにテンプレートを表示する欠落している関数と、テンプレートonclickで使用される関数を追加します。
// onclickによって言語を変更するための関数

関数 ChangeLang(lang){

// rus.xmlとeng.xmlがある場合、別の言語に切り替えるには、言語ファイルの再起動のみが必要です。

ajax_load(lang + ".xml" 、SetLanguageXML、 null 、[ null 、RedrawAll]);

}



//初期化中に初期ページを再生成する関数

関数 RedrawAll(req){

// id = 'body'の要素はhtmlで宣言する必要があると言わなければなりません。 たとえば、<div id = 'body'> </ div>。

skins.redraw( 'body' 、skins.skin [ 'SKIN.BODY' ]);

DrawWelcome();

}



// Cookieを操作するための関数

関数 createCookie(名前、値、日){

if (days){

var date = new Date();

date.setTime(date.getTime()+(days * 24 * 60 * 60 * 1000));

var expires = "; expires =" + date.toGMTString();

}

else var expires = "" ;

document .cookie = name + "=" + value + expires + "; path = /" ;

}



関数 readCookie(名前){

var nameEQ = name + "=" ;

var ca = document .cookie.split( ';' );

forvar i = 0; i <ca.length; i ++){

var c = ca [i];

while (c.charAt(0)== '' )c = c.substring(1、c.length);

if (c.indexOf(nameEQ)== 0) return c.substring(nameEQ.length、c.length);

}

nullを 返し ます

}



//ようこそ画面を印刷します;)

関数 DrawWelcome(){

var date、t;

//クッキーはありますか? その後、すでにユーザーがいました。 この情報をいつ読んで表示するか

if (t = readCookie( 'date' )){

日付= 新しい日付。

date.setTime(t * 1000);

skins.skin [ 'DAY' ] = date.getDate();

skins.skin [ 'MONTH' ] = date.getMonth();

skins.skin [ 'YEAR' ] = date.getFullYear();

show = skins.skin [ 'SKIN.BODY.WELCOME.LAST' ];

} else {

//サイトで初めて-Cookieを作成し、他の情報を表示する場合

日付= 新しい日付。

createCookie( 'date' 、parseInt(date.getTime()/ 1000)、7);

show = skins.skin [ 'SKIN.BODY.WELCOME.FIRST' ];

}



skins.redraw( 'main' 、show);

} *このソースコードは、 ソースコードハイライターで強調表示されています。
多くの場合、テンプレートエンジンを使用すると、「実行可能な」テンプレートを作成できるため、解析が非常に難しくなります。 ここでは、Javascriptを使用して簡単に実装できます。
//サーバーからダウンロードし、info.xmlを明確な形式で印刷します(onclick関数)

関数 ShowInfo(){

skins.redraw( 'main' 、skins.skin [ 'SKIN.BODY.LOADING' ]);

ajax_load( "info.xml" 、DrawInfo);

}



関数 DrawInfo(req){

var i;

var p = req.responseXML.getElementsByTagName( " pricelist " );

//製品リストをゼロにします

skins.skin [ ' PRICES ' ] = "" ;

skins.skin [ 'GOODS.NUM' ] = 1;

for (i = 0; i <p.length; i ++){

//テンプレートのパラメーターを設定します

skins.skin [ 'GOODS.NAME' ] = p [i] .getElementsByTagName( "name" )[0] .firstChild.nodeValue;

skins.skin [ 'GOODS.PRICE' ] = p [i] .getElementsByTagName( "price" )[0] .firstChild.nodeValue;

skins.skin [ 'GOODS.ID' ] = p [i] .getElementsByTagName( "id" )[0] .firstChild.nodeValue;

//製品のリストに追加し、テーブルの完成(レンダリング)パーツ

skins.skin [ ' PRICES ' ] + = skins.use(skins.skin [ 'SKIN.BODY.ORDER.PIECE' ]);

skins.skin [ 'GOODS.NUM' ] ++;

}

skins.redraw( 'main' 、skins.skin [ 'SKIN.BODY.ORDER' ]);

} *このソースコードは、 ソースコードハイライターで強調表示されています。
この場合、 info.xmlファイル次の形式で生成する必要あります。
<? xml バージョン = "1.0" encoding = "windows-1251" > < オブジェクト >

< 価格表 >

< id > 1 </ id >

< name >パン</ name >

< 価格 > 12 </ 価格 >

</ 価格表 >

< 価格表 >

< id > 2 </ id >

< name >スイカ</ name >

< 価格 > 200 </ 価格 >

</ 価格表 >

< 価格表 >

< id > 3 </ id >

< name >ジャガイモ</ name >

< 価格 > 32 </ 価格 >

</ 価格表 >

</ オブジェクト > *このソースコードは、 ソースコードハイライターで強調表示されました。
そして最後に、 index.html 。 はい、私は間違っていませんでした、すなわちhtml:
< html > < head >

< meta http-equiv = "Content-Type" content = "text / html; charset = windows-1251» >

</ >

< body > < div id = 'body' > </ div >

< script type = "text / javascript" src = "main.js" > </ script >

</ body > </ html > *このソースコードは、 ソースコードハイライターで強調表示されました。


実際の例は、 zcn.ru / marketにあります。



4.このアプローチの欠点と利点

欠点はほとんどありませんが、非常に重要です。

-追加のツールを導入せずにURLを操作できない。

-戻るキーと進むキーを使用することはできません。 著者がエミュレーションを提供しなかった場合。

-検索エンジンは、JavascriptとAJAXを解析する方法を知りません。

-ユーザーのJSが無効になる確率。



これらの問題と解決方法については、ここで述べました-habrahabr.ru/blog/webdev/44753.html 、このため私はそれらに焦点を合わせません。



プラスも重要です。

-非常に多く(適切に最適化されている場合)、サーバーの負荷が軽減されます。

-サイトの外観を変更するためにPHPコードを変更する必要はありません-ccs / javascriptおよびテンプレートのみ。

-テンプレートとハンドラーの透明でかなり明確なコード。 新しい「ページ」を追加するのは非常に簡単です。

-さまざまな設定の簡単な変更、他のXMLファイルの簡単なアップロード。 言語、通貨(ドル、摩擦)など。ページをリロードせずに。



All Articles