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月26日日曜日
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)
*/
// 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)
*/
2014年10月17日金曜日
CentOS6にて、yumでPHPをupdateバージョンアップする方法
CentOS6にデフォルトで付属しているPHPはバージョンが古いのでバージョンアップしたい。が、しかし、yumでPHPをupdateしようとしてもうまくいかない時がある。その対処方法を記しておきます。
基本的には、remiレポジトリepelレポジトリを追加(場合によっては、rpmforgeレポジトリも追加。PHP5.5にはremi-php55レポジトリがあるようです。)して、yum --enablerepo=epel,remi update phpでバージョンアップできる。
しかし、MySQL関連のファイルなどとのバージョンの整合性で、バージョンアップできないとはねられる場合がある。
そのような時は、/etc/yum.repos.d/CentOS-Base.repoのpriority=1が原因の場合がよくある。各申す私もしばらく気づかず悩んだ。CentOS-Base.repoの中の[base][updates][extras]の3つに、priority=1が書かれていたものを、#priority=1とコメントアウトして、yum --enablerepo=epel,remi update phpを実行すると、魔法のごとくPHPがアップデートされた。
基本的には、remiレポジトリepelレポジトリを追加(場合によっては、rpmforgeレポジトリも追加。PHP5.5にはremi-php55レポジトリがあるようです。)して、yum --enablerepo=epel,remi update phpでバージョンアップできる。
しかし、MySQL関連のファイルなどとのバージョンの整合性で、バージョンアップできないとはねられる場合がある。
そのような時は、/etc/yum.repos.d/CentOS-Base.repoのpriority=1が原因の場合がよくある。各申す私もしばらく気づかず悩んだ。CentOS-Base.repoの中の[base][updates][extras]の3つに、priority=1が書かれていたものを、#priority=1とコメントアウトして、yum --enablerepo=epel,remi update phpを実行すると、魔法のごとくPHPがアップデートされた。
2014年10月2日木曜日
PHPのmb_send_mailが使えなくなったが、QDmailのおかげで助かった
PHPで作った、結果をメール送信するようにしていたシステムで、社内の都合でmb_send_mail()が使えなくなった。困ってネットで探したらQDmailなる、すばらしいモジュールが作られていることがわかった。それを実際にPHPに書いて使ったので、見本として掲載しておきます。
$message =<<<EOM
管理者 または お客 様
問い合わせがありました。または
ありがとうございます。
EOM;
// QDmail使用 今年からメールサーバーがmb_send_mail()でアクセスできなくなったため
require_once('qdmail.php');
require_once('qdsmtp.php'); //こちらは必ずしもrequire_onceしなくてもよいが、この方が何も考え無くてもいいので、とりあえず両方ともrequire_onceしておいた。
$mail = & new Qdmail( 'UTF-8' , 'base64' );
$mail -> smtp(true);
$param = array(
'host'=>'mail.xxxxx.gr.jp',
'port'=>25,
'from'=>'anata@xxxxx.gr.jp',
'protocol'=>'SMTP',
'user'=>'anatadesu',
'pass' => 'pasuwaadodesu',
);
$mail -> smtpServer($param);
//$mail ->to($todata); // 顧客への場合
$mail ->to('kanrisya@xxxxx.gr.jp','赤谷 ゆい'); //管理者の場合
$mail ->subject('問い合わせがありました。');
$mail ->from('anata@xxxxx.gr.jp','株式会社です');
$mail ->text($message);
$return_flag = $mail ->send();
参考 http://qiita.com/tsunet111/items/0ba0e8fc61882c3905c0
他に、上記の各項目の正しい書式の解説ページもあるので探して読んでください。
$message =<<<EOM
管理者 または お客 様
問い合わせがありました。または
ありがとうございます。
EOM;
// QDmail使用 今年からメールサーバーがmb_send_mail()でアクセスできなくなったため
require_once('qdmail.php');
require_once('qdsmtp.php'); //こちらは必ずしもrequire_onceしなくてもよいが、この方が何も考え無くてもいいので、とりあえず両方ともrequire_onceしておいた。
$mail = & new Qdmail( 'UTF-8' , 'base64' );
$mail -> smtp(true);
$param = array(
'host'=>'mail.xxxxx.gr.jp',
'port'=>25,
'from'=>'anata@xxxxx.gr.jp',
'protocol'=>'SMTP',
'user'=>'anatadesu',
'pass' => 'pasuwaadodesu',
);
$mail -> smtpServer($param);
//$mail ->to($todata); // 顧客への場合
$mail ->to('kanrisya@xxxxx.gr.jp','赤谷 ゆい'); //管理者の場合
$mail ->subject('問い合わせがありました。');
$mail ->from('anata@xxxxx.gr.jp','株式会社です');
$mail ->text($message);
$return_flag = $mail ->send();
参考 http://qiita.com/tsunet111/items/0ba0e8fc61882c3905c0
他に、上記の各項目の正しい書式の解説ページもあるので探して読んでください。
ラベル:
mb_send_mail,
php,
qdmail,
qdsmtp
2014年9月20日土曜日
session_start()はコールする位置(記述する位置)が重要 PHPマニュアル
3月と9月、半年に一度使うプログラムを少し直した。3月に使った後に直しておいて9月に使った。AページからBページへ遷移して、Aページで入力した内容をプログラム処理して、Bページで表示するはずが、表示できなくなった。
調べてみると、スーパーグローバル$_SESSIONの内容が消滅してしまっている。3月に直したときは、直す前のセッションがまだ残っていて、エラーが現出しなかった。正確には、消滅というより、セッションが再開できず$_SESSIONの内容が使えなかった。
3月に直して半年経っているので、直した部分をすぐには思い出せなかった。最初からプログラムの流れを全部追ってみて原因がわかった。
session_start()の記述位置を変えてやらないといけなくなっていた。途中にページをはさんだので、直す前のままのsession_start()の位置では、セッションが再開されなくなっていた。途中に挟んだページにsession_start()を入れ直してやらなければいけなかった。
session_start()の記述位置(コールする位置)に関して、少々間違った記述をしているホームページがよくあるので、正しい認識をここに記しておく。
正しくない認識: session_start()は、<?phpの直後に書く。
<?php
session_start();
// session_start()は<?phpの直後に書く。他のどの記述よりも上に書く。
// ここからプログラムを書く
?>
正しい認識:: クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要がある。(通常は、クッキーに基づくセッションを使っている)
つまり、ブラウザに出力する処理でなければ、<?phpとsession_start()の間に、いろいろ記述してもよい。
PHPマニュアル session_start()
調べてみると、スーパーグローバル$_SESSIONの内容が消滅してしまっている。3月に直したときは、直す前のセッションがまだ残っていて、エラーが現出しなかった。正確には、消滅というより、セッションが再開できず$_SESSIONの内容が使えなかった。
3月に直して半年経っているので、直した部分をすぐには思い出せなかった。最初からプログラムの流れを全部追ってみて原因がわかった。
session_start()の記述位置を変えてやらないといけなくなっていた。途中にページをはさんだので、直す前のままのsession_start()の位置では、セッションが再開されなくなっていた。途中に挟んだページにsession_start()を入れ直してやらなければいけなかった。
session_start()の記述位置(コールする位置)に関して、少々間違った記述をしているホームページがよくあるので、正しい認識をここに記しておく。
正しくない認識: session_start()は、<?phpの直後に書く。
<?php
session_start();
// session_start()は<?phpの直後に書く。他のどの記述よりも上に書く。
// ここからプログラムを書く
?>
正しい認識:: クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要がある。(通常は、クッキーに基づくセッションを使っている)
つまり、ブラウザに出力する処理でなければ、<?phpとsession_start()の間に、いろいろ記述してもよい。
PHPマニュアル session_start()
登録:
投稿 (Atom)