PEAK XOOPS - ミニ白扇の使い方 (1) in englishin japanese

Archive | RSS |
XOOPS
XOOPS : ミニ白扇の使い方 (1)
Poster : GIJOE on 2006-08-27 17:05:28 (32845 reads)

in englishin japanese
XOOPS 2.0.x用モジュールとして放流しておきながら、あまりにもおざなりなドキュメントで申し訳なかったのですが、一応、ミニ白扇の使い方を書いておきます。

第1回は、登録画面とアカウント編集画面だけをカスタマイズしたい(それも項目の追加はなく、デザイン変更もしくは項目の削除だけがある)、という場合のやり方です。

minihakuのインストールそのものは、極めて簡単です。モジュールとしてインストールして、mainfile.php に1行追加するだけです。

これで、XOOPS 2.0.xではXoopsFormべた書きで、Hack以外には手の出せなかった登録画面とアカウント編集画面がテンプレート化されます。あとは、デザイナーにお任せすることができるわけです。

アカウント編集(minihaku_edituser.html)には、ICQだのAIMだの余計な項目がいっぱいあるはずです。それらをバシバシと削るのも自由です。

ただ、登録画面・アカウント編集画面のいずれもフォームであり、必須項目というのが存在します。例えば、ユーザ登録では、メールアドレスが必須項目になっているのですが、コミュニティによっては、メールアドレスが必要でないサイトもあります。この場合、フォームからメールアドレス項目を削るだけではうまく行きません。

これらの必須項目については、config.php で処理を行います。include/ フォルダの下に、config.php を作ってください。config.dist.php を config.php にリネームするのも手ですが、今回は新規に作成するのが良いでしょう。


<?php
$auto_belong_groups = array( XOOPS_GROUP_USERS ) ; // default (2)
$allow_blank_email = true ;
$allow_blank_vpass = true ;
?>


1行目はとりあえずここでは説明しません。config.phpに必要な行だとだけ覚えておいてください。

2行目の追加で、メールアドレス項目が必須ではなくなります。3行目の追加で、パスワード確認も意味を持たなくなりますので、やはりフォームから削除可能となります。(私自身、同じ文字列を二度タイプさせるインターフェースの効果には疑問があります。)

なお、フォームとは無関係の「アカウント情報」については、システムモジュールの system_userinfo.html を編集するだけです。これはミニ白扇がない場合と同様ですが、minihaku_edituser.html と項目を揃えることが出来る、というのがミニ白扇の意義となります。

とりあえず以上で第1回は終わりとしますが、Cube 2.1 であれば、ユーザ登録もアカウント編集も完全にテンプレート化されていますので、今回のようなケースでは、そもそもミニ白扇のようなフック処理自体、一切不要です。

XOOPS 2.0.x に存在していた未入力チェックのJavaScriptなどは廃されていますが、もともとXoopsFormの入力チェックなんて中途半端も良いところだったので、すべての妥当性検査をアクションフォームに任せる、というCube2.1の方向性には賛成です。

ただ、それでも、PHPカンファレンス2006での小山さんのデモを見てしまった後では、完全にPOSTされてからでないと妥当性検査を通過しないインターフェースは古めかしいなあ、なんて思えなくもありません


Related articles
Printer friendly page Send this story to a friend

Comments list

tomato  Posted on 2007/6/6 23:37
ご指導ありがとうございました。userモジュールのテンプレートをいじってみたら変えることができました。XoopsCube Legacy 2.1.0もいじることでいい勉強になりました、結果として4つのファイルを書き換えることで登録時の項目が変更できることがわかりました。
user
|_templates
|...|_user_register_form.html(新規登録画面)
|...|_user_register_confirm.html(新規登録の確認画面)
|
|_language
|...|_japanese
|......|_main.php(項目名称の変更)
|
|_forms
|...|_UserRegisterEditForm.class.php(データベースに登録)
|
つまづいたのは、新規登録画面と、新規登録の確認画面はFTPするだけでは反映されず、管理者メニューからテンプレートを書き換える作業がある点です。
1.互換レンダーシステムから
|_テンプレート管理
|_defaultのXOOPS Cube Default Template Set を複製

2.複製したテンプレートセットから
  ユーザーモジュール (16)を選択し、user_register_form.htmlとuser_register_confirm.htmlを編集します。

3.上記のUserRegisterEditForm.class.phpとmain.phpは普通にFTPで書き換えることでOKでした。

以上、ありがとうございました。
GIJOE  Posted on 2007/6/2 6:03
う〜ん。正直言って、試していないので判りません。

ミニ白扇って、もともとX2の弱点を補うためのものであって、ユーザ登録・アカウント編集関連もモジュール化/テンプレート化されているLegacy 2.1では、ほとんど意味がありません。

テンプレートをいじるだけなら、すなおに、userモジュールのテンプレートをいじるべきですし、ロジックもフックしたいなら、Legacy 2.1らしい方法を検討すべきでしょう。

ユーザ登録とかも、基本的にはデリゲートで実現しているので、まともにフックできるはずです。(あまり追ってないので自信はありません)
tomato  Posted on 2007/6/1 8:53
こんにちは、
このミニ白扇ですが、Xoops Cube 2.1でも使用できますでしょうか?
「ミニ白扇の使い方 (1)」の通りmainfile.phpに1行書き込みを行うところまでいってから試しに新規登録してみると、「_US_NOREGISTER」 と表示され前に進めません。
よろしくお願いいたします。
jidaikobo  Posted on 2007/1/16 16:48
GIJOE さん、jidaikobo です。
素早いご対応をいただいたのに、お返事遅くなってすみません。
ようやくダウンロードして拝見できました。

なるほど、array_pop ってのを使うんですね。
はじめての海外旅行みたいなもんで、何を聞いても勉強になっちゃうんですが、やっぱり勉強になりました

Quote:

GIJOE wrotes:
'stop_reasons' => array_merge( $stop_reason_extras , $stop_reasons ) ,
<br />が間に挟まるのが嫌で、あえてこの順番にした、という手抜きな経緯があったりします
確信犯だったんですね
いや、じつも僕もこれでいーかなーとかよぎったんですが……。
GIJOE  Posted on 2007/1/12 12:34 | Last modified
jidaikoboさん、こんにちは。

- エラーをまとめて表示する
- エラー表示順と余計な行が追加されてしまうこと
- エラー表示部分のテンプレート

いずれも修正してみました。

手抜きして 1.08a という形にしたので、表面上は変わったようにみえませんが、アーカイブのタイムスタンプで確認してください。

ちなみにこれ、
'stop_reasons' => array_merge( $stop_reason_extras , $stop_reasons ) ,
<br />が間に挟まるのが嫌で、あえてこの順番にした、という手抜きな経緯があったりします
jidaikobo  Posted on 2007/1/12 7:47
jidaikobo です。GIJOE さん、ご勘案ありがとうございます!

で、さっそく1.08で遊んでみたんですが、ちょっと気になることがあり、ご報告させてください。

1.08だと、オリジナルのエラーを吐こうとすると、エラー報告が2段階に分かれちゃいます。
たとえば下記のような入力必須項目を用意してみたんですが……

if( ! empty( $_POST['do_register'] )){
	if($_POST['familyname']==''){
		$stop_reason_extras[] = "姓は入力必須項目です。<br />";
	}
}

新規登録でいっさい入力せずにエンターすると、まずは minihaku の config のエラーからのみ処理されます。つまりエラーは「姓は入力必須項目です。」だけが表示されます。
で、このエラーを乗り越えると、あらためて ID を入れなさい、とかパスワードを入れなさい、というエラーが来ます。

これはどうやら54行目で、$stop_reason_extras の処理をしてから従来のエラーを処理しているからのようでして、段階を分けると、一発でエラーがくるようです。

if( ! empty( $_POST['do_register'] ) && empty( $stop_reason_extras ) && ! ( $stop_reason = userCheck( $allowed_requests['uname'] , $email4check , $allowed_requests['pass'] , $allowed_requests['vpass'] ) ) ) {
を下記のようにすると、エラーが来ます。
if( ! empty( $_POST['do_register'] ))$stop_reason = userCheck( $allowed_requests['uname'] , $email4check , $allowed_requests['pass'] , $allowed_requests['vpass'] );
if( ! empty( $_POST['do_register'] ) && empty( $stop_reason_extras ) && empty( $stop_reason ) ) {
いかがでしょうか??

■ここからは趣味の問題かもしれませんが、いちおうご報告。
で、こうすると、なんとなく169行目のエラー表示順をいじりたくなります。
ID やらパスワードのエラーの行に続けて追加項目のエラーを表示したいということです。

'stop_reasons' => array_merge( $stop_reason_extras , $stop_reasons ) ,
'stop_reasons' => array_merge( $stop_reasons , $stop_reason_extras ) ,

で、うかつにこれをしてしまうと、配列にしたエラー文字列が、explode の仕様のため、ひとつ余分に配列を作る(?)ため(末尾の<br />のせい?)、エラーの文字列の間に変な改行が追加されてしまいます(アサインされているstop_reasonsの順番をいじらなければ、フォームとエラー文の間の<br />になるからいいといえばいいんですが)。
で、エラー文字列からあらかじめ末尾の br をとると、うまくいくんですが、何ともかんともニンニンです。

■さらに趣味の問題ですが続けます。
せっかく配列わたしになったらテンプレートもこうしたいなーと思ったり
#たしかにあんまり HTML のタグまでアサインで渡してもらうよりこっちの方がうれしいですね。

<ul>
	<{foreach from=$stop_reasons item="reason"}>
		<li><strong style='color:#ff0000; font-weight:bold;'><{$reason}></strong></li>
	<{/foreach}>
</ul>
GIJOE  Posted on 2007/1/10 5:36
Quote:

jidaikobo wrotes:
die するんだったら config.php で完結するのかなーと思うんですが、せっかくなので、XOOPS の表示にあわせられないかなといじってみたんですが、
こっちの方がずっとスマートですね!
というわけで、さっそく取り込ませていただきました。

その取り込み方ですが、独立したエラー文字列を <br /> でつなげた文字列として持ち運ぶのは個人的に嫌なので、エラー文字列は配列として扱うことにしてます。

例えば、config.php において、
die( "invalid sex" ) ;
となっていたら、
$stop_reason_extras[] = "invalid sex" ;
とすることで、フォーム上部にエラー文が表示されるようになります。

エラー配列の展開はあくまでテンプレートで行います。

<span style='color:#ff0000; font-weight:bold;'>
	<{foreach from=$stop_reasons item="reason"}>
		<{$reason}><br />
	<{/foreach}>
</span>

従来型のアサインもしてますので、テンプレートの互換性がいきなりなくなる、ということはありません。


しかし、このエラー文の扱いをよく見たら、registerは<br />区切りで、edituserは配列、といういかにもXOOPSらしい統一感のないやり方になってますね
GIJOE  Posted on 2007/1/10 4:17 | Last modified
Quote:

jidaikobo wrotes:
僕のコメント投稿の BB code 表示も直してくださったんですね。ありがとうございました。あれ? とおもったんですが、放置してしまいました
例のクイック投稿からだと、デフォルトで「改行」しかONにならないんですよ。
このあたり、クイック投稿からでも、BBCodeとかを有効にすべきかどうか、悩みどころではあります。(クイック投稿フォームにはあまりボタンを配置したくないので)
とりあえず、このスレッドの最初の投稿については、勝手にBBCodeとスマイリーを有効にしました。

Quote:
ちなみに文例なので、修正の必要があるかどうか分らないんですが、ミニ白扇の使い方 (4)でも、false 表記になっています。いちおうお伝えまで。
ここは、config.php の書き方なので、config.dist.php のままになってます。
たぶん、これで問題ないはずです。
ご指摘ありがとうございました。
jidaikobo  Posted on 2007/1/9 8:22 | Last modified
お返事ありがとうございます(あ、アバターが青い?)。
僕のコメント投稿の BB code 表示も直してくださったんですね。ありがとうございました。あれ? とおもったんですが、放置してしまいました

たしかに落ち着いてコードを追っていくと、環境どうのこうのの問題でなかったですね。ハズかしい投稿をしてしまいました……。
ちなみに文例なので、修正の必要があるかどうか分らないんですが、ミニ白扇の使い方 (4)でも、false 表記になっています。いちおうお伝えまで。

Quote:
すり抜け方そのものは結構泥臭いですよ〜
コード読む前に、僕だったらどうするだろうと考えたんですが、コアをいじらないとどうにもならないように思い込んでいました。
僕みたいな初心者から見ると、なんというか、いろいろな問題をカロやかに一行でさっとかわしているような印象です。
……って、ご本人が泥臭いと評しておられるのに、あんまり言うと、気持ち悪いですね
jidaikobo  Posted on 2007/1/9 8:10 | Last modified
ミニ白扇の入力チェック例を考えてみまして、なんだか一見うまく動いているようなので、ご笑覧いただけたらとおもい。
die するんだったら config.php で完結するのかなーと思うんですが、せっかくなので、XOOPS の表示にあわせられないかなといじってみたんですが、僕のできるようにやろうとすると、registerhook.php をいじらずにはできませんでした
間抜けなことをしていたらごめんなさい。

■config.php(エラーを日本語で返すときは EUC で保存)
// request maintenances
$stop_reason_extra_fields = '';

if( ! empty( $_POST['do_register'] )){
	if($_POST['code_a']==''){
		$stop_reason_extra_fields .= "コードAは入力必須項目です。<br />";
	}
	if($_POST['code_b']==''){
		$stop_reason_extra_fields .= "コードBは入力必須項目です。<br />";
	}
}

■registerhook.php l53付近
if( ! empty( $_POST['do_register'] ) && ! ( $stop_reason = userCheck( $allowed_requests['uname'] , $email4check , $allowed_requests['pass'] , $allowed_requests['vpass'] ) ) && $stop_reason_extra_fields=='' ) {

■registerhook.php l161付近
	include XOOPS_ROOT_PATH.'/header.php' ;
+	$stop_reason .= $stop_reason_extra_fields;
	$xoopsOption['template_main'] = 'minihaku_register.html' ;

--追加です。
■edituserhook.php l86付近
アカウントの編集でも config で設定したエラーを表示する場合。
+	if (!$stop_reason_extra_fields == ''){
+		$errors[] = $stop_reason_extra_fields;
+	}
	if (count($errors) > 0) {

--shamefull typoがあったので、こっそり修正(fieldsの綴り)。
Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!