(注: 私の元の質問は私の openid にリンクされていませんでした。編集/更新/対応できるようにここに再投稿しています。アクセスできる人が元の質問を削除できる場合: /questions/1554916/how-to-use-the -livevalidation-javascript-library-custom-validate-function 素晴らしいでしょう!!)
やあ皆さん、
私はこれらすべてに非常に慣れていないので、ご容赦ください!
フィールドの livevalidation チェックと、ユーザー名が有効かどうかを確認するための ajax/json チェックを使用してフォームを作成するようにしました。私は標準のライブ検証とうまくやっているようです。
これは私が現時点で持っているもののデモです:リンクテキスト
ajaxユーザー名チェックに応答する方法は、メッセージを表示するように変更するだけなので、livevalidationチェックを使用してajax応答を管理したいので、それらを一緒にリンクできます(空白をチェックしてから使用し、無効にし、OK として渡す)、応答を同じように出力します。
私は現在、このフォームコードを持っています:
<?php
$script = "
$('uname').addEvent('blur', function(e) {
e = new Event(e).stop();
// Show the spinning indicator when pressing the submit button...
$('indicator1').setStyle('display', 'block');
var username = $('uname').value;
if ( username != '' ) {
var url = 'index.php?option=com_chronocontact&chronoformname=custom_livevalidation_test&task=extra&format=raw';
var jSonRequest = new Json.Remote(url, {
onComplete: function(r) {
$('indicator1').setStyle('display','none');
if ( r.username_ok ) {
$('username_msg').setHTML(\"<span style='color:green;'>Username '\"+username+\"' is OK</span>\");
} else {
$('username_msg').setHTML(\"<span style='color:red;'>Sorry, username '\"+username+\"' is already taken</span>\");
}
}
}).send({'username': username});
}
});
";
global $mainframe;
if ($mainframe->isSite())
{
$doc =& JFactory::getDocument();
$script = "
window.addEvent('domready', function() {
$script
});
";
$doc->addScriptDeclaration($script);
};
$script = "
var uname = new LiveValidation('uname', {
validMessage: 'This is a valid username',
wait: 500
});
uname.add(Validate.Presence, {
failureMessage: 'Username must not be blank!'
});
uname.add(Validate.Format, {
pattern: /^[a-zA-Z\-_]{4,16}$/,
failureMessage: 'Username must be between 4 and 16 characters'
});
";
global $mainframe;
if ($mainframe->isSite())
{
$doc =& JFactory::getDocument();
$script = "
window.addEvent('domready', function() {
$script
});
";
$doc->addScriptDeclaration($script);
};
?>
<div>
<span class="cf_label">Username: </span>
<input style="" id="uname" name="uname" class="" title="" value="" type="text">
<span id="indicator1" style="display: none"><img src="/images/hourglass.gif" alt="checking..." /></span>
<div id='username_msg'></div>
</div>
<br />
<input type='submit' name='submit' value='submit' />
これは、バックグラウンドで実行される json 部分です。
<?php
$json = stripslashes($_POST['json']);
$json = json_decode($json);
if ( $json->username ){
$db =& JFactory::getDBO();
$query = "
SELECT COUNT(*)
FROM `jos_users`
WHERE `username` = ".$db->quote($json->username).";";
$db->setQuery($query);
$response = (bool) !$database->loadResult();
$response = array('username_ok' => $response );
echo json_encode($response);
}
?>
したがって、 livevalidation のドキュメントを見ると、次の方法でカスタム検証を使用できます。
// Pass a function that checks if a number is divisible by one that you pass it in args object
// In this case, 5 is passed, so should return true and validation will pass
Validate.Custom( 55, { against: function(value,args){ return !(value % args.divisibleBy) }, args: {divisibleBy: 5} } );
私はこれが非常に不可解であることに気付きました - 私はそこにすべての準備ができている 'function(r)' を指すことができるはずだと思います - しかし、私はそれを正しい方法でやっているとは思えません.
誰でも光を当てることができますか、私はそれを理解し、解決策を明らかにしたいと思っています!!
* アップデート *
私は今、validate.custom 部分の次のコードが機能するはずだと信じるようになりました。
var uname = new LiveValidation('uname', {
validMessage: 'This is a valid username',
wait: 500
});
uname.add(Validate.Presence, {
failureMessage: 'Username must not be blank!'
});
uname.add(Validate.Custom('uname', { against: function(r){
return !(r.username_ok) }, args: {} } ),
failureMessage: 'This username is already taken'
});
uname.add(Validate.Format, {
pattern: /^[a-zA-Z\-_]{4,16}$/,
failureMessage: 'Username must be between 4 and 16 characters'
});
";
ただし、アーキテクチャに問題があるようです。ライブ検証では即時の回答が必要であり、バックグラウンドで ajax が実行されます。私にとってまったく新しい概念である「オブザーバーパターン」を調査する提案がありました-私は通常、CMSのグラフィックデザインと構造側で遊んでいます!
これに戻って機能させる必要があるため、これ以上のヘルプ/説明があれば幸いです!!