0

クライアント側とサーバー側の両方で動作するように、組み込みの Kohana 検証を使用するクライアント側の検証スクリプトに取り組んできました。これまでのところ、サーバー側の作業を行いましたが、javascript を改善するための助けが必要です (私の javascript の知識はそれほど良くありません)。実装を完了します。(現在、入力とテキストエリアで動作します)。

ランダム コントローラー:

    // ...
    $errors = array();

    if ($this->request->method() == 'POST')
    {
        // Post to validate/look and get the decoded array
        $validate = Request::factory('validate/look')->post($this->request->post())->execute()->body();
        $errors = json_decode($validate, TRUE);

        // Empty array, Validation OK
        if ($errors === array())
        {
            // anything u want here
        }
    }

次に、検証コントローラー (任意のコントローラーから、または ajax 経由で呼び出されます):

class Controller_Validate extends Controller {

public function action_look()
{
    //$user = $this->user->loader() ? $this->user : NULL;

    //Validation
    $valid = Validation::factory($this->request->post())
        ->rules('name', array(
            array('not_empty'),
            array('min_length', array(':value', 10)),
            array('max_length', array(':value', 80)),
            array('regex', array(':value', '/^[\pL\pN ]++$/uD')),
            array(array($this, 'check_name')),
        ))
        ->rules('description', array(
            array('not_empty'),
        ))
        ->rule('look_tags', array($this, 'check_tags'))
    ;

    $valid->check();

    // Only get messages for the posted fields
    $resp = array_intersect_key($valid->errors('uploadlook'), $this->request->post());

    $this->response->body(json_encode($resp));
}
}

そして、これはJavaScriptです:

$(function(){
$('.validate').find('input,textarea').blur(function(){
    var element = $(this);
    var name = $(this).attr('name');
    var value = $(this).val();
    $.ajax({
        type: 'POST',
        url: '/comunidad/validate/look',
        data: name + '=' + value,
        success: function(e){
            e = JSON.parse(e);
            if(e.length !== 0) {
                var msg = e[name];
                var error = '<p>' + msg + '</p>';
                if (element.next().length === 0)    element.after(error);
                else                                element.next().replaceWith(error);
            } else {
                if (element.next().length) element.next().remove();
            }
        }
    });
});

});

私はいくつかのフィードバックと、javascript を完成させるための少しの助けが必要です :)

4

1 に答える 1

1

コードに関するフィードバック:検証コードはヘルパーに配置する必要があり、配列を返すだけです。次に、ヘルパーを使用してJSONを出力するAJAXコントローラーが必要です。サーバーサイドチェックでは、ヘルパーのみを使用する必要があります。それははるかにクリーンであり、配列を返すことができる場合、サーバー側のjsonエンコード/デコードはかなり醜いです。

javascriptの何が問題になっていますか?

于 2012-08-21T08:35:16.663 に答える