- 追加された行はこの色です。
- 削除された行はこの色です。
**forのループを実現するプラグイン [#ufb9859c]
|RIGHT:70|LEFT:410|c
|~バージョン|全て|
|~投稿者|[[kahata]]|
|~状態|着手|
|~投稿日|&new{2007-06-17 (日) 09:15:24};|
***メッセージ [#x26e0031]
#br
#include(:remark/alpha)
#br
forのループで繰り返し処理を行って表示するプラグイン
たとえば
|名前|郵便番号|住所|電話番号|h
#forloop(1,3,1){{
|名前$n$|郵便番号$n$|住所$n$|電話番号$n$|
}}
|>|>|>|CENTER:フッター|f
書式:
#forloop(繰り返し開始値, 繰り返し終了値, 繰り返し増分){{
繰り返す内容
}}
ここで内容中に$n$を記入すると繰り返し変数に置換される。
とすると
|名前|郵便番号|住所|電話番号|h
|名前1|郵便番号1|住所1|電話番号1|
|名前2|郵便番号2|住所2|電話番号2|
|名前3|郵便番号3|住所3|電話番号3|
|>|>|>|CENTER:フッター|f
と表示されるプラグイン(例のようにヘッダーとフッターが繋がった表にしたい)
***コメント [#t3796977]
- Pukiwikiのテンプレート機能の開発を行っている[[kahata]]です。(([[自作プラグイン/include_template.inc.php]]、[[自作プラグイン/expr.inc.php]]、[[自作プラグイン/if.inc.php]] 、[[自作プラグイン/mathfunc.inc.php]]、[[自作プラグイン/include_template.inc.php/活用例1]] で開発を行っています。)) &new{2007-06-17 (日) 09:17:08};~
将来的には、phpのsmarty、htmlのスタイルシートやxmlのように、スタイル定義部分とコンテンツを分離した機能を実現することを目標にしています。((xoopsのようにpukiwikiでsmartyが使えると申し分ないのですが・・・・))~
以下のような骨子を作成したのですが、行が繋がった一行の表になってしまいます。~
$bodyをget_source()で他のページから取ってくると何となくうまくいくようです。マルチライン引数の処理にからくりがあるようですがよく分りません。開発に詳しい方、ヒントを頂けるとありがたいです。
<?php
function plugin_forloop_convert()
{
$args = func_get_args();
$body = array_pop($args);
$start = $args[0]; $end = $args[1]; $incr = $args[2];
$result = '';
for ($i = $start; $i <= $end; $i += $incr) {
$tmpstr = str_replace('$n$',$i, $body);
$result .= $tmpstr;
}
return convert_html($result);
}
?>
- 複数行の引数の場合、改行コードは \r に変換されて渡されるので、それが原因かもしれません。$body = str_replace("\r", "\n", $body); するとどうなります? -- [[revulo]] &new{2007-06-17 (日) 10:04:55};
-- 早速ありがとうございます。これも試みましたがダメでした。やはり一行になります。~
それと現状ではまだフッターとヘッダーが分離された表になります。array_pop()せずにargs[3]で取得した場合も同じです。 -- [[kahata]] &new{2007-06-17 (日) 10:23:45};
- $body = str_replace('\r','', $body); 、$body .= '\n';、$body .= '\r';も試みましたがダメでした。\n,\rを付加した場合は\n,\rがそのまま元の列の最後に表示されて一列に繋がってしまいます。 ~
さらに『内容』を複数行の引数にせずに第4引数にした場合も同様でした。???-- [[kahata]] &new{2007-06-17 (日) 10:33:53};
- さらに通常の文字列、例えば"今日はよいお天気です$n$"などは上記で問題なく作動しますが、
#forloop(1,3,1){{
-今日はよいお天気です$n$
}}
とすると
-今日はよいお天気です1~
-(実際は半角)今日はよいお天気です2~
-(実際は半角)今日はよいお天気です3~
のようになって第一回目のみpukiwkiの構文変換が作動します。-- [[kahata]] &new{2007-06-17 (日) 11:04:07};
- さらに分りました。 -- [[kahata]] &new{2007-06-17 (日) 11:32:29};~
#forloop(1,1,1){{
-今日はよいお天気です
-今日はよいお天気です
-今日はよいお天気です
}}
としても上と同じ結果になり、どうやら複数行引数の中での文は通常ページの文と同等に処理されないようです。何かよいアイデアはありませんか?
- 「$bodyをget_source()で他のページから取ってくると」ってtracker(tracker_list) プラグインですけど。 -- &new{2007-06-17 (日) 12:08:50};
-- 趣旨は
|名前$n$|郵便番号$n$|住所$n$|電話番号$n$|
のみ書いた独立ページをget_soourceで取得するということです。
- 引数をこう使えば少しは変わるかもしれません。
#forloop(繰り返し開始値, 繰り返し終了値, 繰り返し増分, 繰り返す内容(1行目), 繰り返す内容(2行目), ..., 繰り返す内容(n行目))
として、
<?php
function plugin_forloop_convert()
{
$args = func_get_args();
$start = array_shift($args); $end = array_shift($args); $incr = array_shift($args);
$body = implode("\n", $args) . "\n";
$result = '';
for ($i = $start; $i <= $end; $i += $incr) {
$tmpstr = str_replace('$n$',$i, $body);
$result .= $tmpstr;
}
return convert_html($result);
}
?>
ソースをこうすれば、プラグインの中はうまくいくと思います。~
ただ、最初の例のようにプラグインの中と外を引っ付けるのはこれでは無理です。 -- &new{2007-06-17 (日) 12:50:50};
- とりあえず繰り返すだけなら、最初のコードでも array_pop() の直後に改行コードを変換すれば動きました。でもヘッダやフッタをくっつけるのは難しいですね。 -- [[revulo]] &new{2007-06-17 (日) 13:24:35};
- 複数行引数の利用については[[submenu.inc.php>http://note.sonots.com/?PukiWiki%2Fsubmenu.inc.php]]を参考にしては如何でしょう?。ヘッダ、フッタは複数行引数に入れるようにした方が良いですよ。その方がスマートですよね?。 -- [[taru]] &new{2007-06-17 (日) 13:33:24};
- ヘッダ、フッタ行と、その他の行を切り離して繰り返す部分は、tracker.inc.php のTracker_list->toString() が参考になるかも。 -- &new{2007-06-17 (日) 16:30:03};
- 多くの有益なヒントとガイドをありがとうございます。なんとか行き詰まりが打開できそうな明かりが見えてきました。検討して拙作をまた自作プラグインでご披露します。 -- [[kahata]] &new{2007-06-17 (日) 20:46:07};
- とりあえず技術的に可能かどうか以前に危険なかほりがします。ループ回数10000000000000000000 とでもいたずらされるときびしいのではないでしょうか?最大値を設定すればいいという程度の話でもなく、if プラグインなども含め、根本的に危険性を考慮する思考過程をもって頂いたほうがよさそうです。 -- &new{2007-06-18 (月) 01:53:25};
--- 公開サーバ上で利用しなけりゃだいじょぶぽ -- &new{2007-06-18 (月) 09:09:45};
--- 心得ておきます。あくまで開発過程ということで。。 -- [[kahata]] &new{2007-06-18 (月) 10:15:12};~
余談ですがxoopsにはTemplatesがあって各種モジュールのスタイルが設定できます。ただ使いにくい。~
wikiの自由奔放性を活かしながら機能が実現できないかと・・・・~
pukiwikiのskinで全体の見栄えが変えられますが、ニュースのページ、掲示板のページ、写真集など~
各ページ毎に独自のスタイルを設計して見栄えを良くすることができないかと思っています。~
wiki本体を改造する能力がないもので・・・
#comment