Jeans CMS 製作日記:
Deprecated: Function strftime() is deprecated in /home/u109394186/domains/rad51.net/public_html/jeans/jeans/libs/blog.php on line 333
2008年 11月の記事
フォーム表示機能を、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)の部分だけ。
さらにシンプルにするために その2 [General]
2008年11月24日
さて、アイテムとスキン・テンプレートの所有者がすべてsuperadminだと結論付けられるようになった状態で、改めてこれらをパースするための現在のコードを眺めてみる。
まずは、viewクラスに記述の3つのパース用メソッドの定義部分から。
3つに共通しているのは、$additional_dataの部分。異なっているのは、パースするソースを指定する部分で、文字列を直接受け渡す場合と、ファイルから読み込む場合がある。加えて、テンプレートとアイテムの場合、$dataという、SQLクエリーから得られたrowデータを保持する変数への参照が引数にある。
&$dataに関しては、スキンでも『&$data=null』のようにしておけばよいので、簡単。問題は、パースするソースを、どのようにして、共通のメカニズムで受け渡すかである。
まずは、viewクラスに記述の3つのパース用メソッドの定義部分から。
function parse_skin($skin_or_skinname,$file=null,$additional_data=array()); function parse_template($tempname,$type,$additional_data=array(),&$data=null); function parse_item($item,$admin=false,$additional_data=array(),&$data=null);
3つに共通しているのは、$additional_dataの部分。異なっているのは、パースするソースを指定する部分で、文字列を直接受け渡す場合と、ファイルから読み込む場合がある。加えて、テンプレートとアイテムの場合、$dataという、SQLクエリーから得られたrowデータを保持する変数への参照が引数にある。
&$dataに関しては、スキンでも『&$data=null』のようにしておけばよいので、簡単。問題は、パースするソースを、どのようにして、共通のメカニズムで受け渡すかである。
さらにシンプルにするために その1 [General]
2008年11月24日
ごく初めのころ、次のように書いた。
最初にどんな特徴を持たせるかを考えたとき、テンプレートを廃止して、スキンを多層化しようと思っていたのだが、これが大間違いなアイデアであることが判明した。そもそも、スキンとテンプレートは全く別のもので、テンプレートの概念をスキンに入れ込んでしまうことなど不可能だった。それに、Nucleusのスキンは、parsedinclude などの機能で、すでに多層化が実現している。
始め、テンプレートの概念を廃止しようとして、次にそれが無理であると結論していた。で、再度、テンプレートとスキンの概念を統合しようとしている。以前無理だと考えていたことが可能かもしれないという結論になった背景には、実際にコードを書いてみてテンプレートとスキンの機能を比較することが出来るようになったことがある。
viewクラス(旧jitクラス)には、parse_skin, parse_template, parse_itemという、3つのパース用のメソッドがある。これらを統合して、一つにできないかと考えている。つまり、スキンもテンプレートもアイテムも、すべて同じオブジェクトとして扱うことができないかということ。
最初にどんな特徴を持たせるかを考えたとき、テンプレートを廃止して、スキンを多層化しようと思っていたのだが、これが大間違いなアイデアであることが判明した。そもそも、スキンとテンプレートは全く別のもので、テンプレートの概念をスキンに入れ込んでしまうことなど不可能だった。それに、Nucleusのスキンは、parsedinclude などの機能で、すでに多層化が実現している。
始め、テンプレートの概念を廃止しようとして、次にそれが無理であると結論していた。で、再度、テンプレートとスキンの概念を統合しようとしている。以前無理だと考えていたことが可能かもしれないという結論になった背景には、実際にコードを書いてみてテンプレートとスキンの機能を比較することが出来るようになったことがある。
viewクラス(旧jitクラス)には、parse_skin, parse_template, parse_itemという、3つのパース用のメソッドがある。これらを統合して、一つにできないかと考えている。つまり、スキンもテンプレートもアイテムも、すべて同じオブジェクトとして扱うことができないかということ。
汎用PDOエミュレータ [General]
2008年11月17日
主に(な)さんへ(まだ、SkinabbleAdminでPDO使ってたらだけど)。
JeansでのPDOエミュレータを、バージョンアップした。SQLiteだけでなく、MySQLやpgSQLでの使用も視野に入れてある。
JeansでのPDOエミュレータを、バージョンアップした。SQLiteだけでなく、MySQLやpgSQLでの使用も視野に入れてある。
クラスの継承についてのまとめ [General]
2008年11月16日
現在、リファクタリング中。今までのシステムでは、スキン変数・テンプレート変数について、XMLの記述でどのクラスのどのメソッドを呼び出すかを定義していた。この機能は、変数のオーバライドなどを行うには便利であるが、一方でデバッグを困難にしている。Nucleusのスキンの上位互換を保つのに必要な機能なのではあるが、それは別の方法(取り込む際に書き換える)で実現可能なのは、先日の記事で書いたとおり。
で、XMLの記述でどのクラスのどのメソッドを呼び出すかを定義する機能は残すものの、コアのライブラリのコードでは封印することにした。この機能は、プラグインでのみ使用することが推奨される(コアの機能をプラグインでオーバライドするのに必要)。
基本的に、スキン変数の記述は、例えば次のようにする。
<%xxx%>
<%xxx.yyy%>
<%xxx.yyy.zzz%>
<%xxx%>の場合、xxxクラスのdoSkinVarメソッドを呼び出す。<%xxx.yyy%>の場合、xxxクラスのskinvar_yyyメソッドを、<%xxx.yyy.zzz%>の場合は、xxx_yyyクラスの、skinvar_zzzメソッドを呼び出す。
で、XMLの記述でどのクラスのどのメソッドを呼び出すかを定義する機能は残すものの、コアのライブラリのコードでは封印することにした。この機能は、プラグインでのみ使用することが推奨される(コアの機能をプラグインでオーバライドするのに必要)。
基本的に、スキン変数の記述は、例えば次のようにする。
<%xxx%>
<%xxx.yyy%>
<%xxx.yyy.zzz%>
<%xxx%>の場合、xxxクラスのdoSkinVarメソッドを呼び出す。<%xxx.yyy%>の場合、xxxクラスのskinvar_yyyメソッドを、<%xxx.yyy.zzz%>の場合は、xxx_yyyクラスの、skinvar_zzzメソッドを呼び出す。