General
Jeans & Development | 電子ブロック工房 | 三日坊主 | フロントページ |
テンプレートの仕様 [General]
2009年6月15日
Nucleusでいうところのテンプレート変数の仕様がほぼ決まった。Nucleusでは<%title%> <%body%>などいくつかあるが、Jeansでは一つのスキン変数(例えば、<%contents%>)を、Nucleusのテンプレート変数に割り当てる。
例えば、Nucleusの<%title%>は、Jeansでは<%contents(title)%>とする。いまのところ、この<%contents%>のシンタックスは、以下のとおり。
<%contents( column-SQL [, mode [, maxlength [, toadd ] ] ] )%>
・column-SQLは、title, body, more など。SQLクエリーのSELECT節の内容に準拠。
・modeは、hsc(デフォルト), raw, strip_tags, shorten, constのどれか。
・shortenモードの際、maxlength, toadd を指定することができる。
ただし、このようなシンプルな仕様では、Nucleusの<%morelink%>のような複雑な動きをするものを実装しづらい。これを可能にするため、例えば$row['morelink']に、ラムダもしくはarrayで指定されたクラスメソッドが設定されている場合に、それを呼び出すことにする。
view::showUsingQueryの実行の際、それぞれのrowのパースの前後に実行するためのラムダ(もしくは、クラスメソッド等)を指定できるよう西、このラムダ中で$rowを書き換えることができるようにしておく。
contentsというつづりが長いので、rowとか、dataとか、もう少し短いものにしようかと考えているところ。
ところで、先日議論したスキンの仕様であるが、スキンディレクトリ内にあるskin.incをパースする方法で、ほぼ決まり。skin.inc内に<%skin.selector%>を記述し、skin::skinvar_selector()メソッド内で、skin_index.incやskin_item.incなどに分岐する。
例えば、Nucleusの<%title%>は、Jeansでは<%contents(title)%>とする。いまのところ、この<%contents%>のシンタックスは、以下のとおり。
<%contents( column-SQL [, mode [, maxlength [, toadd ] ] ] )%>
・column-SQLは、title, body, more など。SQLクエリーのSELECT節の内容に準拠。
・modeは、hsc(デフォルト), raw, strip_tags, shorten, constのどれか。
・shortenモードの際、maxlength, toadd を指定することができる。
ただし、このようなシンプルな仕様では、Nucleusの<%morelink%>のような複雑な動きをするものを実装しづらい。これを可能にするため、例えば$row['morelink']に、ラムダもしくはarrayで指定されたクラスメソッドが設定されている場合に、それを呼び出すことにする。
view::showUsingQueryの実行の際、それぞれのrowのパースの前後に実行するためのラムダ(もしくは、クラスメソッド等)を指定できるよう西、このラムダ中で$rowを書き換えることができるようにしておく。
contentsというつづりが長いので、rowとか、dataとか、もう少し短いものにしようかと考えているところ。
ところで、先日議論したスキンの仕様であるが、スキンディレクトリ内にあるskin.incをパースする方法で、ほぼ決まり。skin.inc内に<%skin.selector%>を記述し、skin::skinvar_selector()メソッド内で、skin_index.incやskin_item.incなどに分岐する。
セッションの管理、等 [General]
2009年5月30日
遅々として、進まない。が、頭の中では進んでいる事があるので、メモ。
まず一つは、前回の記事で議論した、スキンの仕様に付いて。imagepopupなどの表示をどうしようかという話であった。多分、Nucleusのselector()に相当する機能を、スキン変数として供給する形になる。つまり、スキンの本体の内容は『<%skin.selector()%>』だけとする。ここからskin::var_selector()メソッドが呼び出されるが、これがNucleusのselector()に相当する形。ここから、gospelスキンのそれぞれの内容を、$_GETの情報に従って選び出せば良い。skin.selectorに与える引数で、どんなスキンタイプが使えるかが、ある程度制御できるはず。
もう一つ考えている事は、管理画面に付いてである。NP_adminを作成する上で、操作の確認画面(何かの削除とか)の為のスキンが、やたら多い事に気がついた。しかも、それぞれで少しずつ表示内容が異なるため、共通のスキンでこれらを一括して管理する事が出来ず、アクションごとにスキンを用意する事になってしまう。そこで、セッションIDごとにアクションの内容をDBに保存しておく事を考えている。こうすれば、DBの内容を表示する為のスキンを一つ用意しておくだけで良いはず。管理用のスキンが、かなりすっきりすると思う。
まず一つは、前回の記事で議論した、スキンの仕様に付いて。imagepopupなどの表示をどうしようかという話であった。多分、Nucleusのselector()に相当する機能を、スキン変数として供給する形になる。つまり、スキンの本体の内容は『<%skin.selector()%>』だけとする。ここからskin::var_selector()メソッドが呼び出されるが、これがNucleusのselector()に相当する形。ここから、gospelスキンのそれぞれの内容を、$_GETの情報に従って選び出せば良い。skin.selectorに与える引数で、どんなスキンタイプが使えるかが、ある程度制御できるはず。
もう一つ考えている事は、管理画面に付いてである。NP_adminを作成する上で、操作の確認画面(何かの削除とか)の為のスキンが、やたら多い事に気がついた。しかも、それぞれで少しずつ表示内容が異なるため、共通のスキンでこれらを一括して管理する事が出来ず、アクションごとにスキンを用意する事になってしまう。そこで、セッションIDごとにアクションの内容をDBに保存しておく事を考えている。こうすれば、DBの内容を表示する為のスキンを一つ用意しておくだけで良いはず。管理用のスキンが、かなりすっきりすると思う。
スキンの仕様が決まらない [General]
2009年3月11日
テンプレートの仕様はほぼ決まり。これはNP_adminでやっているのと同じように、スキンディレクトリに用意したxxx.incファイルに、ヘッダ・ボディ・フッタ・ノティスに分けて記述し、view::showUsingQueryを用いて、
ヘッダ
ボディ×レコード数
フッタ
の順に出力するというもの。レコード数がゼロのときは、ノティスが出力される。今後書くPHPのコードのかなりの部分は、view::showUsingQueryに渡すSQLクエリー文の作成に費やされることであろう。Jeans CMSとはとどのつまり、DBを利用した表示システムなので、こういった形になって行くことは、多分理想に近い。
一方、スキンの記述をどうするかがまだ決まらない。NP_adminの場合、すべてのページに共通の記述があるのでそれをNucleusスキンのindexに記述しておき、その中にある<%admin%>スキン変数により、各ページ別の内容を表示している。この仕組みがJeansにそのまま使えると思ったが、そうではないようだ。ほとんどのページはこれでOKだが、この仕組みではimagepopupやそれに類した表示ができない。
よたかさんからgospelスキンのJeansでのデフォルトスキンとしての使用承諾を得ているものの、スキン部分の仕様がまだ決まらないので、先に進めないでいる。よたかさんがgospelスキンで行っている工夫を崩さずにスキンの仕様を決めるのが、すっきりしたツールになる一つの道のように思える。
ヘッダ
ボディ×レコード数
フッタ
の順に出力するというもの。レコード数がゼロのときは、ノティスが出力される。今後書くPHPのコードのかなりの部分は、view::showUsingQueryに渡すSQLクエリー文の作成に費やされることであろう。Jeans CMSとはとどのつまり、DBを利用した表示システムなので、こういった形になって行くことは、多分理想に近い。
一方、スキンの記述をどうするかがまだ決まらない。NP_adminの場合、すべてのページに共通の記述があるのでそれをNucleusスキンのindexに記述しておき、その中にある<%admin%>スキン変数により、各ページ別の内容を表示している。この仕組みがJeansにそのまま使えると思ったが、そうではないようだ。ほとんどのページはこれでOKだが、この仕組みではimagepopupやそれに類した表示ができない。
よたかさんからgospelスキンのJeansでのデフォルトスキンとしての使用承諾を得ているものの、スキン部分の仕様がまだ決まらないので、先に進めないでいる。よたかさんがgospelスキンで行っている工夫を崩さずにスキンの仕様を決めるのが、すっきりしたツールになる一つの道のように思える。
NP_admin 製作進捗 [General]
2009年1月2日
バックアップをかねて、ブログに現在のバージョン(v 0.1.9)をアップ。
次のバージョン、0.2.0では、スキン・テンプレート変数の使用を少し変える予定なので、その前の動くバージョンを保存しておく意味も兼ねている。
今までに完成しているアクションは、以下の通り。
overview, banlist, blogsettings, bookmarklet, browsowncomments, browseownitems, createitem, deleteblog, editmembersettings, itemlist, showlogin
次にitemeditアクションを実装する部分で引っかかり、全体の仕様を少し変更することになった。その大幅な変更の前の保存版が、v0.1.9。
次のバージョン、0.2.0では、スキン・テンプレート変数の使用を少し変える予定なので、その前の動くバージョンを保存しておく意味も兼ねている。
今までに完成しているアクションは、以下の通り。
overview, banlist, blogsettings, bookmarklet, browsowncomments, browseownitems, createitem, deleteblog, editmembersettings, itemlist, showlogin
次にitemeditアクションを実装する部分で引っかかり、全体の仕様を少し変更することになった。その大幅な変更の前の保存版が、v0.1.9。
NP_admin [General]
2008年12月26日
Jeans自体のコード書きは少しお預けにして、Nucleus用のSkinnable Adminの作成を始めた。これを進めていく上で、お宝を発見したと言うか、頭の中がずいぶん整理されてきたと言うか、得るものがあったので、メモしておく。
ここで得られたことは、Jeansのスキン・テンプレートエンジンの構造に大きく影響するかもしれない。やはり、実際の用途に当てはめながらこういったエンジンを作っていくほうが、色々と見えてくるものなのだろうか。
ここで得られたことは、Jeansのスキン・テンプレートエンジンの構造に大きく影響するかもしれない。やはり、実際の用途に当てはめながらこういったエンジンを作っていくほうが、色々と見えてくるものなのだろうか。
skin.selector [General]
2008年12月15日
Nucleusでは、スキンの表示は、globalfunctions.phpにあるselector()という関数で行う。同様の仕組みをJeansでも実装する必要があるが、これをcore.phpに入れるのにはためらいがあった。というのは、Nucleusのselector()は実行しない場合があるからで、例えばaction.phpの呼び出しなどがこれに相当する。Jeansでは、実行しないコードはパースもしないのが基本だ。
色々考えた末、selector()に相当するスキン変数、<%skin.selector%>を作成することにした。スキンのパースは、skin_start.incから始まり、このincファイルでは例えば次のように記述する。
こうすることにより、
1)selector()相当の機能を、core.phpから外に出すことが可能
2)スキンの記述を、<html>…</html>などの開始タグ・終了タグときれいに対応付けることが可能
といったメリットがある。今後同様に、Nucleusにあるさまざまな機能をこのような形で実装することにより、ハウスキーピング遺伝子のシンプルさを保つような方法を取っていくと思う。
補足:
1)ファイル名をskin_start.incにするかどうかは未定
2)NucleusのスキンをJeansに取り込む際は、次のようなコードを含むskin_start.incを作成すれば事足りる。
3)<%parsedinclude%>はviewクラスで処理される特別なスキン変数であり、ファイル内容はスキンパース時にコンパイルされる。一方、<%skin.selector%>は通常のスキン変数であり、ファイル内容はスキン変数の呼び出し時にコンパイルされる。これは、例えば個別アイテムページの表示の際はメインの目次ページのパースは必要ないため。
色々考えた末、selector()に相当するスキン変数、<%skin.selector%>を作成することにした。スキンのパースは、skin_start.incから始まり、このincファイルでは例えば次のように記述する。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%text(_SKIN_LANG)%>" lang="<%text(_SKIN_LANG)%>"> <head> <%skin.selector(header)%> </head> <body> <%skin.selector%> </body> </html>
こうすることにより、
1)selector()相当の機能を、core.phpから外に出すことが可能
2)スキンの記述を、<html>…</html>などの開始タグ・終了タグときれいに対応付けることが可能
といったメリットがある。今後同様に、Nucleusにあるさまざまな機能をこのような形で実装することにより、ハウスキーピング遺伝子のシンプルさを保つような方法を取っていくと思う。
補足:
1)ファイル名をskin_start.incにするかどうかは未定
2)NucleusのスキンをJeansに取り込む際は、次のようなコードを含むskin_start.incを作成すれば事足りる。
<%skin.selector%>
3)<%parsedinclude%>はviewクラスで処理される特別なスキン変数であり、ファイル内容はスキンパース時にコンパイルされる。一方、<%skin.selector%>は通常のスキン変数であり、ファイル内容はスキン変数の呼び出し時にコンパイルされる。これは、例えば個別アイテムページの表示の際はメインの目次ページのパースは必要ないため。
ver 0.2.1.1.0α [General]
2008年12月6日
間違って作成中及び以前のバージョンのJeansを全部消去してしまいそうになったので、バックアップの意味で現在のバージョンを公開。
デフォルトスキンのindexとitemがほぼ表示できるようになっている。管理画面などはまだまったく手をつけていない。
<%media(20081207-jeans 0.2.1.1.0.zip|jeans 0.2.1.1.0.zip)%>
デフォルトスキンのindexとitemがほぼ表示できるようになっている。管理画面などはまだまったく手をつけていない。
<%media(20081207-jeans 0.2.1.1.0.zip|jeans 0.2.1.1.0.zip)%>
イベント機能について [General]
2008年12月4日
現在、以前述べたリファクタリング計画を遂行中で、少しずつではあるが、すっきりしてきた。アイテム用テンプレート変数のためのメソッド(それぞれ、1-5行ほど)がitemクラスにずらっと並んだ姿は、壮観である。
さて、まだまだ先のことなのだが、イベント機能に付いて風呂でいろいろ考えていて思いついたことがあるので、それをメモ。
さて、まだまだ先のことなのだが、イベント機能に付いて風呂でいろいろ考えていて思いついたことがあるので、それをメモ。
フォーム表示機能を、parsedincludeに統合 [General]
2008年11月30日
Nucleusにおける、次のスキン変数を廃止した。
phpinclude
searchform
nucleusbutton
loginform
commentform
membermailform
Jeansでは、次のように代替できる。
<%parsedinclude(xxx.inc)%>
<%parsedinclude(forms/searchform.inc)%>
<%parsedinclude(forms/jeansbutton.inc)%>
<%parsedinclude(forms/loginform.inc)%>
<%parsedinclude(forms/commentform.inc)%>
<%parsedinclude(forms/membermailform.inc)%>
これに従い、parsedincludeを機能拡張し、スキン変数での引数を、<%1%> <%2%>などのところに挿入できるようにした。なお、各フォームでのデフォルト値は、インクルードされるテンプレートで、<%1(xxx)%> <%2(yyy)%>のように記述する。ただし、テンプレート中で一番初めのところでこのように記述すること。
もし、スキンがforms/searchform.incなどのファイルを持たない場合、jeans/skindefault/ディレクトリ中のファイルが使用される。
phpinclude
searchform
nucleusbutton
loginform
commentform
membermailform
Jeansでは、次のように代替できる。
<%parsedinclude(xxx.inc)%>
<%parsedinclude(forms/searchform.inc)%>
<%parsedinclude(forms/jeansbutton.inc)%>
<%parsedinclude(forms/loginform.inc)%>
<%parsedinclude(forms/commentform.inc)%>
<%parsedinclude(forms/membermailform.inc)%>
これに従い、parsedincludeを機能拡張し、スキン変数での引数を、<%1%> <%2%>などのところに挿入できるようにした。なお、各フォームでのデフォルト値は、インクルードされるテンプレートで、<%1(xxx)%> <%2(yyy)%>のように記述する。ただし、テンプレート中で一番初めのところでこのように記述すること。
もし、スキンがforms/searchform.incなどのファイルを持たない場合、jeans/skindefault/ディレクトリ中のファイルが使用される。
さらにシンプルにするために その3 [General]
2008年11月26日
風邪で一日仕事を休み、布団に包まったりしてのんびりしながら一日考えてみた。
結論は、3つのメソッド、parse_skin, parse_template, parse_item は、さわる必要がまったくないということ。これら3つのメソッドは、copileメソッドおよびparse_compliedメソッドの実装をラップしている存在であり、インターフェースが違うだけで実質は同じメカニズムを利用しているためである。
(どうも、こういったことをまともに勉強したことが無く独学なので、自分自身で良く分かっていない部分があるのだが、仕方の無いところ。)
他方で、少し変更したいと思っている点は次の通り。skin, template, item用の変数を実装するための各クラスでの記述などが、現在の仕様では別々になっているのだが、これを一元化する。これにより、『template用のメソッドを見つけようとして見つからなかった場合にskin用のメソッドを呼び出す』などの記述が必要なくなり、各変数用のコードがシンプルに記述出来る。
今回の件について、少しまとめてみた。
1)Jeans CMSを利用する上で、スキン・テンプレート・アイテムはそれぞれ異なった概念(Nucleusと同じ)。
2)これらを呼び出すためのviewクラスでのメソッドは、parse_skin, parse_template, parse_itemと、3つ用意されている。
3)スキン・テンプレート・アイテムのパースは、viewクラスに記述された共通のメソッドを通じて実行される。
4)パースされたコードから各変数を記述するためのメソッドは、共通のメカニズムで呼び出される。
つまり、今回の変更で行おうとしているのは、4)の部分だけ。
結論は、3つのメソッド、parse_skin, parse_template, parse_item は、さわる必要がまったくないということ。これら3つのメソッドは、copileメソッドおよびparse_compliedメソッドの実装をラップしている存在であり、インターフェースが違うだけで実質は同じメカニズムを利用しているためである。
(どうも、こういったことをまともに勉強したことが無く独学なので、自分自身で良く分かっていない部分があるのだが、仕方の無いところ。)
他方で、少し変更したいと思っている点は次の通り。skin, template, item用の変数を実装するための各クラスでの記述などが、現在の仕様では別々になっているのだが、これを一元化する。これにより、『template用のメソッドを見つけようとして見つからなかった場合にskin用のメソッドを呼び出す』などの記述が必要なくなり、各変数用のコードがシンプルに記述出来る。
今回の件について、少しまとめてみた。
1)Jeans CMSを利用する上で、スキン・テンプレート・アイテムはそれぞれ異なった概念(Nucleusと同じ)。
2)これらを呼び出すためのviewクラスでのメソッドは、parse_skin, parse_template, parse_itemと、3つ用意されている。
3)スキン・テンプレート・アイテムのパースは、viewクラスに記述された共通のメソッドを通じて実行される。
4)パースされたコードから各変数を記述するためのメソッドは、共通のメカニズムで呼び出される。
つまり、今回の変更で行おうとしているのは、4)の部分だけ。