※下に書いてあることは別にプラグインを作らなくてもCSSだけでどうにでもなります・・・ただプラグインを作ってみたかっただけです。
HTML5を使って input に required 属性を付けると
こんなかんじで格好いいです。
でもこれは HTML5 を使ってるんで validation したあとのエラーメッセージとか至って普通に表示されます。(Email アドレスの記述が間違っている場合のエラー)
これを HTML5 風に変えてみよう・・・
(いろいろめんどくさくなってきたんで途中でやめましたが・・・)
簡単にやったこと
- Formクラスを使って input を生成
- Validationクラスをちょっとだけ修正
- ConfigのValidationにopen_errorを追加
- jQueryプラグイン作って埋め込む
まず、input の生成。これは普通。(required属性はつけません)
<?php echo Form::input('name', '名前'); ?>
次に、fuel/core/classes/validation.php と fuel/core/classes/validation.error.php を修正します。
fuel/core/classes/validation.php 行560
// $output .= $options['open_error'].$e->get_message().$options['close_error']; $output .= $e->_replace_tags($options['open_error']).$e->get_message().$options['close_error'];
open_error のタグをエラーメッセージと同じように置換するようにメソッドを呼び出します。が、_replace_tagsは protected なんで public に変更しました。
fuel/core/classes/validation/error.php 行113
// protected function _replace_tags($msg) public function _replace_tags($msg)
これでOK。
つぎに、fuel/app/config/config.php の validation に open_error を以下のように追加。
'validation' = array(
'open_error' => '<li class="error_:field">',
);
上の :field の部分は validation や input で指定している id になります。
これであとはjQueryのプラグインを埋め込んで実装するだけです。
jquery.validation.js を作って中身は以下
(function($){
function Validation() {
this._defaults = {
form_identifier: 'form_',
error_identifier: 'error_',
};
this._target = null;
this.errors = {};
}
$.extend(Validation.prototype, {
_attach: function(element) {
this._target = element;
this._target.css('display', 'none');
this._errors = this._get_errors();
for (i = 0; i < this._errors.length; i++) {
this._create_message(this._errors[i]);
}
},
_get_errors: function() {
errors = [];
$("li", this._target).each(function(idx, val) {
error = {};
error['id'] = $(val).attr('id')
.replace($.validation._get('error_identifier'), '');
error['text'] = $(val).text();
errors.push(error);
});
return errors;
},
_create_message: function(error) {
e = $('<div>')
.addClass('validation_message')
.text(error.text)
.css('display', 'none');
t = $('#'+this._get('form_identifier')+error.id);
t.after(e);
e.css({
'display': 'inline',
'position': 'absolute',
'top': t.position().top + (t.outerHeight() - e.outerHeight()),
'left': t.position().left + t.outerWidth() + 10,
});
},
_get: function(key) {
return this._defaults[key];
},
});
$.fn.validation = function(options) {
$.extend($.validation._defaults, options);
$.validation._attach(this);
return this;
}
$.validation= new Validation();
window.VALIDATION = $;
})(jQuery);
コメントも何もないですがshow_errors()で表示している内容をとってきてそれぞれのinputの横に出してるだけです。(汚いソースですみません)
使うときはこんなかんじ。
<div class="error">
<?php echo $validation->show_errors(); ?>
</div>
<?php echo Asset::js('jquery-1.7.2.min.js') ?>
<?php echo Asset::js('jquery.validation.js') ?>
<script type="text/javascript">
$(document).ready(function() {
$('div.error').validation();
});
<script>
こんなかんじで表示されます。
最初にも言った通り、べつにプラグインの必要はないです。
それぞれの項目の場所で
<?php echo $valication->error('name'); ?>
とかしてこれにスタイルをつければ同じことできます・・・



0 件のコメント:
コメントを投稿