二つのパラメータがあって、片方がNULLの場合もう片方を必須にしたいと考え、http://piece-framework.com/
2007/03/post_23.htmlを参考にして次のようなyamlを書きました。
- name: doc_id
description: ドキュメントID
watcher:
target:
- name: kwd
trigger:
comparisonOperator: ==
comparisonTo: null
turnOn:
turnOff:
required:
message: %_description%を指定してください
- name: kwd
description: キーワード
watcher:
target:
- name: doc_id
trigger:
comparisonOperator: ==
comparisonTo: null
turnOn:
turnOff:
required:
message: %_description%を指定してください
一方がnull、もう一方がnull以外の場合でもvalidateの結果がfalseになります。
watcherの指定が間違っているのかとも思うのですが、どこが悪いのか良くわかりません。
どちらか一つが必須というバリデーションの書き方をご存知の方がいらっしゃいましたらお教えください。
よろしくお願いします。
色々試してみたのですが、watcherではrequiredの制御が出来ない?ようなので、以下のように変更しました。
- name: doc_id
description: ドキュメントID
- name: kwd
description: キーワード
watcher:
target:
- name: doc_id
trigger:
comparisonOperator: ==
comparisonTo: NULL
turnOn:
turnOff:
validator:
- name: List
rule:
elements: [on]
message: %_description%がありません
前回の設定でOKと思ったのですが、
以下の設定でkwdがNULLのとき、Listバリデータでfalseが返りません。
残念。
> - name: kwd
> description: キーワード
この件、「二つのフィールドのうちいずれか一つを必須にする」として、
HOWTO ドキュメントを作成しておきました。
--
KUBO Atsuhiro e-mail: itema...@yahoo.co.jp
「人数制限をする」というチェックボックスにチェックを入れた時だけ、
「人数」というテキストボックスへの数字の入力を必須にしたいと思い、
以下のようなバリデーションファイルを書いてみました。
- name: limited
description: 人数制限をする
- name: maxuser
description: 人数
watcher:
target:
- name: limited
trigger:
comparisonOperator: ==
comparisonTo: 1
turnOn:
- maxuser
required:
message: %_description%を入力して下さい
enabled: false
validator:
- name: Range
rule:
min: 1
message: 正しい人数を入力して下さい
一応、これでほぼ希望通りの動作をしてくれるのですが、
チェックを外した状態でテキストボックスに -1 のように入力した場合も、
「正しい人数を~」というエラーメッセージが出てしまいます。
できれば、watcher の条件が満たされるまで validator の判定も行われない
ようにしたいのですが、どのようにすれば良いのでしょうか?
よろしくお願い致します。
手元では試してないのですが、
このようにすれば
> watcher:
> target:
> - name: limited
> trigger:
> comparisonOperator: !=
> comparisonTo: 1
> turnOff:
> - maxuser
ご期待通りの動きになりませんでしょうか?
あるいは、チェックが入っていないときにlimitedフィールド自体が無い場合は、
comparisonTo: を NULL にすればいいのではないかと思います。
期待しつつ試してみたのですが、残念ながら結果は変わらないようです。
ただ、少し不思議なのは、turnOn: でなく turnOff: を使うようにすると、
不正な人数を入力した時に、チェックボックスの部分でもエラーが出ます。
Zend Framework から Piece_Right を呼び出すという使い方をしているので、
その辺で私が何かミスをしている可能性もありますが。
手元のPiece-Unity 0.10.0 と Piece-Right 1.4.0で試してみました。
サンプルのレジストレーションフローに、limitedとmaxuserのフィールドを追加しました。
どうもturnOn/turnOffで制御できるのは、requiredだけのようです。
ルールからrequiredを削り、limited != 1 の時に turnOffする指定(下記)にしても、limitedがNULLの場合に
maxuserに-1を入力するとバリデーションエラーになりました。
- name: maxuser
description: 人数
watcher:
target:
- name: limited
trigger:
comparisonOperator: !=
comparisonTo: 1
turnOff:
- maxuser
validator:
- name: Range
rule:
min: 1
message: 正しい人数を入力して下さい
PieceRightのマニュアルでwatcherの使用例を見ると、validatorのオン/オフもできるように読めるのですが、仕様が変わったの
かもしれません。
http://trac.piece-framework.com/piece-doc/wiki/users/piece-right/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%BA%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%AE%9A%E7%BE%A9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
私があと思いつくのは、validatorにWithMethodを指定して、自分でチェックをしてやることぐらいです。
お役に立てず申し訳ありません。
> どうもturnOn/turnOffで制御できるのは、requiredだけのようです。
確かに現状では、そういう動作になっているように見えます。
マニュアルの表記とは少し食い違っているような気がしますが。
> 私があと思いつくのは、validatorにWithMethodを指定して、自分でチェック
をしてやることぐらいです。
自前のメソッドで、required のチェックと数字のチェックをまとめてやる
ということですか? なるほど、確かにそうすればできるかもしれません。
他に手段がなければ試してみようと思います。
久保です。
Piece_Right の仕様では、フィールドの設定がどんなものであれ、実際に値が
入ってきたときはバリデーションが実行されることになります。
ですので、
> できれば、watcher の条件が満たされるまで validator の判定も行われない
> ようにしたいのですが、どのようにすれば良いのでしょうか?
という使い方はできませんので、watcher を使わずにカスタムバリデータで対
応する必要があります。
--
KUBO Atsuhiro e-mail: ku...@iteman.jp
> Piece_Right の仕様では、フィールドの設定がどんなものであれ、実際に値が
> 入ってきたときはバリデーションが実行されることになります。
>
> ですので、
>
> > できれば、watcher の条件が満たされるまで validator の判定も行われない
> > ようにしたいのですが、どのようにすれば良いのでしょうか?
>
> という使い方はできませんので、watcher を使わずにカスタムバリデータで対
> 応する必要があります。
なるほど、そういう仕様なのですね。
そのうちに、カスタムバリデータを作って真面目に対処してみるかもしれませんが、
とりあえずは、JavaScript でそのフィールドを隠したりして対処しようと思います。
どうもありがとうございました。