WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
フォームマクロ

フォームマクロ

このエントリーをはてなブックマークに追加

LARAVEL 4 COOKBOOK』にフォームマクロの作成方法が詳細に記述されていましたので、ご紹介します。

  1. laravel4の公式ドキュメントには、『カスタムマクロ』の項目で、Form::macro(’マクロ名’,クロージャー)で、登録して、Form::マクロ名()で、カスタムマクロを呼び出す。としか記述されていません。
  2. それをどのように利用するかについてはほとんど触れられていませんでしたので、実際に利用することはありませんでした。
  3. ところが、『LARAVEL 4 COOKBOOK』には、カスタムマクロの実際の使用例について詳細に記述されています。
  4. 実際にカスタムマクロを作成して使用してみたいと思います。
  5. 『COOKBOOK』では、Form::macro(“field”,function($options){……});のように、field名でフォームマクロを作成し、textやpassword、checkbox等に対応できるように作成していますが、下記の例では、textフィールド用とパスワードフィールド用のフォームマクロを別々に作成しています。
  6. それ以外のフォームマクロもそんなに難しくないと思いますので、皆さんで試しに作成してみて下さい。
  7. 『COOKBOOK』と同様にappフォルダ直下にtbs_macros.phpファイルを作成し、Twitter Bootstrap3用のフォームマクロを下記のように記述します。
    • //Bootstrap3のHorizontal Formを使用したtextフィールド
       Form::macro("hr_txt", function($options)
       {
       //$markupをリセット
       $markup = "";
       //$typeの初期値に'text'を代入
       $type = "text";
       //オプションのフィールド名が指定されていなければ
       if (empty($options["name"]))
       {
       //フォーム生成を中止
       return;
       }
       //フィールド名を代入
       $name = $options["name"];
       //$labelをリセット
       $label = "";
       //ラベル名が指定されていたら
       if (!empty($options["label"]))
       {
       //$labelにオプションのラベル値を代入
       $label = $options["label"];
       }
       //$labelのサイズをリセット
       $label_size = "";
       //ラベルのサイズ名が指定されていたら
       if (!empty($options["l_size"]))
       {
       //$label_sizeにオプションの値を代入
       $label_size = " ".$options["l_size"];
       }
       //$fieldのサイズをリセット
       $field_size = "";
       //fieldのサイズ名が指定されていたら
       if (!empty($options["f_size"]))
       {
       //$field_sizeにオプションの値を代入
       $field_size = " ".$options["f_size"];
       }
       //$valueの初期値にフォームからの直前値を代入
       $value = Input::old($name);
       //オプションのvalue項目が指定されていたら
       if (!empty($options["value"]))
       {
       //$valueに直前値と初期値を代入
       $value = Input::old($name, $options["value"]);
       }
       //$placeholderをリセット
       $placeholder = "";
       //$placeholderが指定されていたら
       if (!empty($options["placeholder"]))
       {
       //$placeholderにオプションの指定値を代入
       $placeholder = $options["placeholder"];
       }
       //$classをリセット
       $class = "";
       //$classが指定されていたら
       if (!empty($options["class"]))
       {
       //$classに空白+クラスの指定値を代入
       $class = " " . $options["class"];
       }
       //マークアップの作成
       $markup .= "<div class='form-group'>";
       $markup .= Form::label($name, $label, [
       "class" => "control-label".$label_size
       ]);
       $markup .= "<div class=".$field_size.">";
       $markup .= Form::text($name, $value, [
       "class" => "form-control" . $class,
       "placeholder" => $placeholder
       ]);
       $markup .= "</div>";
       $markup .= "</div>";
       return $markup;
       });
      //Bootstrap3のHorizontal Formを使用したpasswordフィールド
       Form::macro("hr_pass", function($options)
       {
       //$markupをリセット
       $markup = "";
       //$nameの初期値に'password'を代入
       $name = "password";
       //$typeの初期値に'password'を代入
       $type = "password";
       //$labelをリセット
       $label = "";
       //ラベル名が指定されていたら
       if (!empty($options["label"]))
       {
       //$labelにオプションのラベル値を代入
       $label = $options["label"];
       }
       //$labelのサイズをリセット
       $label_size = "";
       //ラベルのサイズ名が指定されていたら
       if (!empty($options["l_size"]))
       {
       //$label_sizeにオプションの値を代入
       $label_size = " ".$options["l_size"];
       }
       //$fieldのサイズをリセット
       $field_size = "";
       //ラベルのサイズ名が指定されていたら
       if (!empty($options["f_size"]))
       {
       //$field_sizeにオプションの値を代入
       $field_size = " ".$options["f_size"];
       }
       //$placeholderをリセット
       $placeholder = "パスワード";
       //$placeholderが指定されていたら
       if (!empty($options["placeholder"]))
       {
       //$placeholderにオプションの指定値を代入
       $placeholder = $options["placeholder"];
       }
       //$classをリセット
       $class = "";
       //$classが指定されていたら
       if (!empty($options["class"]))
       {
       //$classに空白+クラスの指定値を代入
       $class = " " . $options["class"];
       }
       //マークアップの作成
       $markup .= "<div class='form-group'>";
       $markup .= Form::label($name, $label, [
       "class" => "control-label".$label_size
       ]);
       $markup .= "<div class=".$field_size.">";
       $markup .= Form::password($name, [
       "class" => "form-control" . $class,
       "placeholder" => $placeholder
       ]);
       $markup .= "</div>";
       $markup .= "</div>";
       return $markup;
       });
    • 30行目:実際にはここに”class=”の値が追加されます。下記のようにbootstrapの”col-sm-3″とか、”col-xs-3″とかを代入する予定です。
      “l_size”=>”col-sm-3”
  8. そして、そのmacros.phpをapp/startフォルダのglobal.phpに登録します。
    • //Bootstrap3用のフォームマクロ
       require app_path().'/tbs_macros.php';
  9. それでは、フォームマクロを使用したビューファイルを下記のように作成してみましょう。
    • @extends('admin.layout')
       @section('content')
       <h1>ユーザー作成ページ</h1>
       {{ Form::open([
       "url" => "/admin/create",
       "class" => "form-horizontal"
       ]) }}
       {{ Form::hr_txt([
       "name" => "name",
       "label" => "氏名",
       "l_size" => "col-sm-3",
       "f_size" => "col-sm-9",
       "placeholder" => "氏名"
       ])}}
       @if($errors->has('name'))
       <div class="alert alert-danger">
       {{$errors->first('name')}}
       </div>
       @endif
       {{ Form::hr_txt([
       "name" => "email",
       "label" => "Eメール",
       "l_size" => "col-sm-3",
       "f_size" => "col-sm-9",
       "placeholder" => "Eメール"
       ])}}
       @if($errors->has('email'))
       <div class="alert alert-danger">
       {{$errors->first('email')}}
       </div>
       @endif
       {{ Form::hr_pass([
       "l_size" => "col-sm-3",
       "f_size" => "col-sm-9",
       ])}}
       @if($errors->has('password'))
       <div class="alert alert-danger">
       {{$errors->first('password')}}
       </div>
       @endif
       {{ Form::submit("作成",['class'=>'btn btn-primary col-sm-4 col-sm-offset-3']) }}
       {{ Form::close() }}
       @stop
    • 4-7行目:php5.4以降、配列を[‘key’=>’value’,’key2’=>’value2′]のような形式で記述できるようなりました。php5.3以前のバージョンをお使いの方は、下記のように記述して下さい。
      {{Form::open(array(
      ‘url’=>’/admin/create’,
      ‘class’=>’form-horizontal’
      ))}}
    • 15-19行目:エラー表示は、フォームマクロ外で作成していますが、『COOKBOOK』では、フォームマクロ内に組み込んでいます。別の機会があればフォームマクロ内にエラー表示も含める方法も検証してみたいと思います。
  10. 下記のようなフォームが簡単に作成できますから便利ですね。
    • laravel026

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です