ミニ白扇の入力チェック例を考えてみまして、なんだか一見うまく動いているようなので、ご笑覧いただけたらとおもい。
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の綴り)。
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らしい統一感のないやり方になってますね
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>
jidaikoboさん、こんにちは。
- エラーをまとめて表示する
- エラー表示順と余計な行が追加されてしまうこと
- エラー表示部分のテンプレート
いずれも修正してみました。
手抜きして 1.08a という形にしたので、表面上は変わったようにみえませんが、アーカイブのタイムスタンプで確認してください。
ちなみにこれ、
'stop_reasons' => array_merge( $stop_reason_extras , $stop_reasons ) ,
<br />が間に挟まるのが嫌で、あえてこの順番にした、という手抜きな経緯があったりします
GIJOE さん、jidaikobo です。
素早いご対応をいただいたのに、お返事遅くなってすみません。
ようやくダウンロードして拝見できました。
なるほど、array_pop ってのを使うんですね。
はじめての海外旅行みたいなもんで、何を聞いても勉強になっちゃうんですが、やっぱり勉強になりました
Quote:
GIJOE wrotes:
'stop_reasons' => array_merge( $stop_reason_extras , $stop_reasons ) ,
<br />が間に挟まるのが嫌で、あえてこの順番にした、という手抜きな経緯があったりします
確信犯だったんですね
いや、じつも僕もこれでいーかなーとかよぎったんですが……。