2015年4月26日日曜日

Laravel5で複数チェックボックスのバリデーションを行う、required_without_all

Laravel5で開発中に、複数checkboxのvalidationが必要になった。少なくとも一つにチェックをつけているかどうかをバリデーションすることになった。

Laravel5には、そのためピタリなValidation ruleがある。hoge required_without_all:foo,bar,...というvalidation ruleがそれだ。hogeは、hoge以外のcheckboxが全て未チェックなら、チェックされなくてはならない。それは、つまり、少なくとも一つがチェックされていなければならないことと同じになる。

複数checkboxをvalidateするための、Request.php、Controller.php、test.blade.php、testconfirm.blade.phpの実例をご紹介します。

test.blade.php
{!! Form::checkbox('service0', '人間', null) !!}人間<br>
{!! Form::checkbox('service1', 'チンパンジー', null) !!}チンパンジー<br>
{!! Form::checkbox('service2', 'ゴリラ', null) !!}ゴリラ<br>
{!! Form::checkbox('service3', 'オランウータン', null) !!}オランウータン<br>

testconfirm.blade.php
{{ Input::get('service0') }}{!! Form::hidden('service0', Input::get('service0')) !!}
{{ Input::get('service1') }}{!! Form::hidden('service1', Input::get('service1')) !!}
{{ Input::get('service2') }}{!! Form::hidden('service2', Input::get('service2')) !!}
{{ Input::get('service3') }}{!! Form::hidden('service3', Input::get('service3')) !!}
// 戻るボタンで戻ったときに入力値を維持しているようにしている

Request.php
public static function rules() {
    return [
        'service0'=>'required_without_all:service1,service2,service3',
        'zip21'=>'required',
        'zip22'=>'required',
        'addr21'=>'required',
        'name'=>'required',
        'email'=>'required|email|confirmed',
        'content'=>'required'
    ];
}

Controller.php
// checkboxのチェックされなかった項目の特別な処理をする。 入力後、内容はメール送信している。
if(isset($input['service0'])){
    Session::put('service0', $input['service0']);
}else{
    Session::put('service0', '');
}

if(isset($input['service1'])){
    Session::put('service1', $input['service1']);
}else{
    Session::put('service1', '');
}

if(isset($input['service2'])){
    Session::put('service2', $input['service2']);
}else{
    Session::put('service2', '');
}

if(isset($input['service3'])){
    Session::put('service3', $input['service3']);
}else{
    Session::put('service3', '');
}


Laravel5のマニュアル http://laravel.com/docs/5.0/validation#available-validation-rules
 

2015年4月18日土曜日

input type="file"のカーソルを手指型にする

ファイルをアップロードする為の<input type="file" name="hata">は、ボタンにマウスを合わせたとき、カーソルの形状が矢印になる。
Web画面上でクリック可能を示すカーソルは、マウスを合わせたとき手指型が常識だと誰もが思っているだろう。なのに、ファイルアップロードのときのボタンはそうなっていない。

そこで、簡単にカーソルの表示を変える方法です。
cssファイルに、input.tegata { cursor:pointer; }と記述し、上記のhtmlを
<input type="file" class="tegata" name="hata">と書き換える。これで、ファイルをアップロードするときの参照ボタンにマウスを合わせると、カーソルが手指型になる。
ただし、chromeはだめなようです。

カーソルにはその他いろいろな型の指定があります。
cursor:pointer 手指型
cursor:default 矢印型
cursor:crosshair 十字型
cursor:move 移動用型
cursor:aouto  状況に応じて自動選択(初期値)
その他


PHP filter_var関数を使って、ログインをメールでもIDでも可能にする(Laravel5での開発で)

Laravel5で社内のシステムを開発するときに、ログインをメールアドレスでもIDでも出来るようにしたかった。そのとき使ったのが、filter_var関数。フィルタにFILTER_VALIDATE_EMAILを使えば簡単なスクリプトで、メールアドレスでもIDでもログインできるようになる。(ほとんど無いと思うけど特殊なメールアドレスには対応できません)

filter_var関数は、PHP5で使える関数で、指定したフィルタでデータをフィルタリング出来る。フィルタは、例えば、FILTER_VALIDATE_EMAILを使えば、メールの正しい型か否かを判断できる。その他、FILTER_VALIDATE_URL、FILTER_VALIDATE_INT、FILTER_VALIDATE_BOOLEAN、FILTER_VALIDATE_IP等がある。

下記がLaravel5で開発したときの実際のスクリプトです。

public function loginhandle(Request $request)
{
 // formのinputがメールかIDかを判定する。ここでfilter_varが役立つ。
 $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';

 $remember = \Input::has('remember');
 if (\Auth::attempt([$field=> $request->input('login'), 'password' => $request->input('password')], $remember))
 {
  $admin = \Auth::user();
  return redirect('admintop');
 }

 return redirect('login')->withErrors(['error'=>'IDかメールアドレスかパスワードが違います']);
}

Laravel5用に書いたhtml部分(少し余分なものも入っているけど)
  {!! Form::open() !!}

    <input type="hidden" name="_token" value="{{ csrf_token() }}">

    {!! Form::label('login', 'メールかID') !!}
    {!! Form::text('login') !!}

    {!! Form::label('password', 'パスワード') !!}
    {!! Form::password('password') !!}

    {!! Form::submit('ログイン') !!}

    {!! Form::label('remember', 'パスワード保存') !!}
    {!! Form::checkbox('remember', '1', true) !!}

  {!! Form::close() !!}

参照:
PHPのドキュメント
楽に検証!値をチェックしてくれるfilter関数
filter_var関数でメールアドレスをバリデーションする



2015年4月5日日曜日

Laravel5利用中に使った「生年月日から年齢を計算する簡単な方法」

Laravel5で開発中に、生年月日から年齢を計算するときに使ったfloor()関数。

// form内のselectボックスで、年、月、日を取得し

$ymd = Request::input('birthy') . Request::input('birthm') . Request::input('birthd');

// $ymdは19880523のような文字列になっている。
// 下の2つのどちらの方法でも年齢が取得できる。今回の開発では、floor()関数を使った。

$nenrei = floor((date('Ymd')-$ymd)/10000); //floor()関数で整数値を取得する
$nenrei = (int)((date('Ymd')-$ymd)/10000); //整数型にキャストする

// floor()関数の動作定義は「最も近い最小の整数値を返す」という動作。引数に負の値を指定する場合にはちょっと注意。floor( -2.55 )は、-3になる。(int)-2.55なら、-2になる。

// floor()関数の同類関数: ceil() は値を切り上げる。round() は整数値に丸める。

/**
(int)の他に使用可能なキャスト
PHP の型キャストは、変換しようとする型を括弧で括り、キャストする変数の前に置く。
------------------------------------------------------------------------------
(int) -> 整数へのキャスト
(bool) -> 論理値へのキャスト
(float) -> floatへのキャスト
(string) -> 文字列へのキャスト
(array) -> 配列へのキャスト
(object) -> オブジェクトへのキャスト
(unset) -> NULLへのキャスト (PHP5)
(binary) -> 2進数へのキャスト(PHP5)
*/