WinRoadのLaravel4初心者講座

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

Winroad徒然草の管理人がお届けします
ブログ
このエントリーをはてなブックマークに追加

ブログ一覧

Laravel ExcelでExcelファイルの作成

Laravel ExcelでExcelファイルを作成するには、createメソッドを使用します。

Excel::create(ファイル名,クロージャー)

createメソッドの第1引数には、作成するExcelファイル名、第2引数には、クロージャー(無名関数)を指定します。

(例)

Excel::create('Filename',function($excel){
 //ここに作成するExcelのメソッドを記述します。
});

プロパティの変更

書き出すExcelファイルのプロパティは、デフォルトで、app/config/packages/maatwebsite/excel/config.phpの19行目以下の内容が適用されます。

/*
 |--------------------------------------------------------------------------
 | Default properties
 |--------------------------------------------------------------------------
 |
 | The default properties when creating a new Excel file
 |
 */
 'properties' => array(
 'creator' => 'Maatwebsite',
 'lastModifiedBy' => 'Maatwebsite',
 'title' => 'Spreadsheet',
 'description' => 'Default spreadsheet export',
 'subject' => 'Spreadsheet export',
 'keywords' => 'maatwebsite, excel, export',
 'category' => 'Excel',
 'manager' => 'Maatwebsite',
 'company' => 'Maatwebsite',
 ),

デフォルトのプロパティを変更したい場合は、ここを変更して下さい。特に、creatorやmanager、company等は変更しておいた方がいいと思います。

さらに、作成するExcelファイルごとに変更したい場合は、set+プロパティ名メソッドを使用します。

(例)

Excel::create('Filename',function($excel){
 //タイトルの変更
 $excel->setTitle('Winroda徒然草');
 //作成者の変更
 $excel->SetCreator('nakada')->setCompany('builwing');
 //概要(説明文)の変更
 $excel->setDescription('このファイルはWinroadが作成しました');
 });

 エクスポート

作成したExcelファイルを書き出すには、exportメソッドか、downloadメソッドを使用します。exportメソッドとdownloadメソッドの引数には、書き出すファイルの拡張子を指定します。

  • export(‘xls’),download(‘xls’)
    拡張子がxlsのExcel97-2003ブックを書き出します。
  • export(‘xlsx’)、download(‘xlsx’)
    拡張子がxlsxのExcel2007ブックを書き出します。
  • export(‘csv’)、download(‘csv’)
    拡張子がcsvのCSVファイルを書き出します。

(例)

Excel::create('Filename',function($excel){
 //ここにExcelファイルを作成するメソッドを記述します。
 })->export('xlsx');

サーバーに保存

作成したExcelファイルをサーバーに保存するには、storeメソッドを使用します。保存場所は、デフォルトで、app/storage/exportsフォルダになっています。

このデフォルトフォルダは、app/config/packages/maatwebsite/excel/export.phpの123行目に指定されていますので、デフォルトフォルダを変更する場合は、ここを修正します。

/*
 |--------------------------------------------------------------------------
 | Store settings
 |--------------------------------------------------------------------------
 */
'store' => array(
/*
 |--------------------------------------------------------------------------
 | Path
 |--------------------------------------------------------------------------
 |
 | The path we want to save excel file to
 |
 */
 'path' => storage_path('exports'),

また、ファイルごとに、保存場所を変更したい場合は、sotoreメソッドの第2引数に、指定することもできます。

(例)

Excel::create('Filename',function($excel){
 //ここに作成するExcelのメソッドを記述します。
 })->store('xlsx',public_path('excel');

尚、保存と書出を同時にする場合はメソッドチェーンを使用します。

->sotore(‘xlsx’)->export(‘xlsx’);

Laravel Excelの導入

LaravelでExcelファイルを扱うためのパッケージ、Laravel Excelについて調べてみたいと思います。

社内サイトで、名簿や請求書を印刷するのに、ブラウザを使用していましたが、きちっとした帳票を作成したくて探し出したのがこのLaravel Excelです。Excelファイルなら、好みのレイアウトに簡単にできますので、このLaravel Excelで作成したいと思います。

Laravel Excelのインストール

Laravel Excelのインストールは例のごとく、composer.jsonを使用します。ルートフォルダ(appフォルダと同じ階層のトップフォルダ)内のcomposer.jsonに下記を追加します。

"require": {
 "laravel/framework": "4.2.*",
 "maatwebsite/excel": "1.*"
 },

上記の3行目を追加したら、コマンドプロンプトでLaravelをインストールしているフォルダへ移動して、composer updateを行います。

cd \xampp\htdocs\laravel
 composer update

アップデートが完了したら、サービスプロバイダーとエイリアスに登録します。

app/config/app.php

123行目あたり:’Maatwebsite\Excel\ExcelServiceProvider’,

191行目あたり: ‘Excel’ => ‘Maatwebsite\Excel\Facades\Excel’,

そして、コンフィグファイルをインストールします。コマンドプロンプトから下記のコマンドを入力します。

php artisan config:publish maatwebsite/excel

このコンフィグファイルは、app/config/packages/maaewebsite/excelに作成され、excelフォルダ内には、cache.php、config.php、csv.php、export.php、import.php、view.phpの6個のファイルが作成されています。

これで、Laravel Excelのインストールは完了です。次回からは、使い方を調べてみたいと思います。

スマホと携帯を振り分けるには

スマートフォンが普及したとはいえ、未だに携帯(ガラケー)ユーザーは健在です。ですので、携帯ユーザーのためには、携帯専用のサイトを提供したいので、スマートフォンと携帯の振り分け方法について調べてみたいと思います。

いろいろな振り分け方法があるとは思いますが、今回はフィルターとブレードレイアウトを利用して振り分ける方法を調べてみたいと思います。

まず最初に考えた手順は、

  1. フィルターのApp::beforeメソッドで、ユーザーエージェントを取得します。
  2. 次に、取得したユーザーエージェントごとに、layout名のセッションを作成します。
  3. そして、ブレードテンプレートのextendsメソッドで、そのセッションを読み込む

という方法です。

それでは実際に作業してみましょう。

app/filter.php

App::before(function($request)
 {
 //ユーザーエージェントの取得
 $ua = $_SERVER['HTTP_USER_AGENT'];
if ((strpos($ua, 'Android') !== false) &&
 (strpos($ua, 'Mobile') !== false) ||
 (strpos($ua, 'iPhone') !== false) ||
 (strpos($ua, 'Windows Phone') !== false)) {
 // スマートフォンからアクセスされた場合
 Session::put('layout','jqm');
} elseif ((strpos($ua, 'Android') !== false) ||
 (strpos($ua, 'iPad') !== false)) {
 // タブレットからアクセスされた場合
 Session::put('layout','f5');
} elseif ((strpos($ua, 'DoCoMo') !== false) ||
 (strpos($ua, 'KDDI') !== false) ||
 (strpos($ua, 'SoftBank') !== false) ||
 (strpos($ua, 'Vodafone') !== false) ||
 (strpos($ua, 'J-PHONE') !== false)) {
 // 携帯からアクセスされた場合
 Session::put('layout','mobile');
} else {
 // その他(PC)からアクセスされた場合
 Session::put('layout','tbs');
 }
});
  • 4行目:まず最初にユーザーエージェントを取得します。
  • 5-26行目:そして、取得したユーザーエージェントの文字列からアクセスしてきた端末の種類を判別します。
  • 5-6行目:Androidのスマートフォンには、Androidという文字列とMobileという文字列が含まれているのが一般的ですので、この2つの文字列が含まれていたら、Androidスマートフォンと判断します。
  • 7-8行目:iPhoneとWindowsフォンの場合は、それぞれの文字が含まれていますので、それで判断します。
  • 10行目:そして、スマートフォンからアクセスされた場合は、セッションlayoutにjqmという文字列を登録します。
  • この文字列を、ブレードテンプレートの@extends(Session::get(‘layout))で、指定すれば、スマートフォンの時には、app/viewsフォルダにあるjqm.blade.phpファイルをブレードレイアウトとして、読み込みます。
  • 以下、タブレット、携帯、PCの場合も同様です。
  • 上記では、例として、スマートフォン用にjquerymobileを使用したCSSを用意し、タブレット用にはfoundation5を使用したCSS、携帯には携帯用のCSS、それ以外には、twitter Bootstrapを使用したCSSを用意するつもりです。
    • スマートフォン用
      app/views/jqm.blade.php
    • タブレット用
      app/views/f5.blade.php
    • 携帯用
      app/views/mobile.blade.php
    • PC用
      app/views/tbs.blade.php

この方法は、ユーザーエージェントにより、元になるブレードテンプレートを変更し、それぞれのスタイルシートでスマートフォン用、タブレット用、携帯用、PC用と変更します。

次に各デバイス用のテンプレートページを作成します。

(例)app/views/jqm.blade.php

<!DOCTYPE html>
<html lang="ja">
 <head>
 <title>Builwing</title>
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
{{HTML::style('//code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css')}}
{{HTML::script('//code.jquery.com/jquery-2.1.0.min.js')}}
{{HTML::script('//code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js')}}
</head>
<body>
<div data-role="page" id="page1">
 <div data-role="header">
 <h1>Builwing</h1>
 </div><!-- /header -->
 <div role="main" class="ui-content">
 @yield('content')
 </div><!-- /main -->
 <div data-role="footer">
 <h4>Page Footer</h4>
 </div><!-- /footer -->
</div><!--page-->
</body>
</html>
  • 上記は、jquerymobileのCDNを利用して作成しています。

(例)app/views/tbs.blade.php

<!DOCTYPE html>
<html lang="ja">
 <head>
 <title>Builwing</title>
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <!-- Bootstrap -->
 {{HTML::style('tbs/css/bootstrap.min.css')}}
 {{HTML::style('tbs/css/mystyle.css')}}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
 <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
 <!--[if lt IE 9]>
 <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
 <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
 <![endif]-->
 </head>
 <body>
 <div class="content">
 <div class="container">
 @yield("content")
 </div>
 </div>
 <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
 <script src="https://code.jquery.com/jquery.js"></script>
 <!-- Include all compiled plugins (below), or include individual files as needed -->
 {{ HTML::script('tbs/js/bootstrap.min.js') }}
 </body>
</html>
  • 上記は、ダウンロードしてきたTwitter Bootstrapをapp/public/tbsフォルダ内に保存しているものとして作成しています。

そして、最後にコンテンツページでブレードテンプレートを指定すれば完成です。

(例)app/views/user/index.blade.php

@extends(Session::get('layout'))
@section('content')
<h2>ユーザーページ</h2>
ここにコンテンツを入力します。
@stop

この方法だと同じコントローラでデバイスごとのページを作成することができますが、きちんと携帯用のサイトを作成したい方は、Session::put()の場所を、return redirect::to()で移動したいページ(コントローラ)を指定してください。

Twitter BootstrapやFoundation5等のCSSフレームワークがレスポンシブWebデザインを主流として台頭していますが、それは、あくまでもスマートフォン以上のデバイスが中心です。今でもかなりの数を占めている携帯にはやはり携帯用のサイトが依然として必要な状況には変わりありません。

ですので、携帯(ガラケー)には、携帯用のサイトを作成するのも大切だと思います。とりあえず、ガラケー専用のサイトを作成しなくてもCSSのみでもある程度は対応できるはずです。

他にもいい振り分け方や携帯サイトの簡単な作成方法があればご伝授ください。

リストに項目を追加するには

データベーステーブルからリストを取得するには、listsメソッドを使用します。

lists(値,キーカラム)

listsメソッドは、第1引数にリストの値、オプションで第2引数にリストのキーカラムを指定します。

(例)

$user=User::where(‘role_id’,’>=’,70)->lists(‘name’,’id’);
return View::make(‘tanto/create’,compact(‘user’));

  • 上記の例では、role_idが70以上のユーザーを$userリストとして、ビューに引き渡しています。
  • そして下記のビューでユーザー名からユーザーIDを取得することができます。

{{Form::open()}}
{{Form::select(‘user_id’,$user)}}
{{Form::submit()}}

  • ただ、上記の場合は、データベーステーブルからのユーザーIDしか取得することができません。
  • しかし、たまに、データベーステーブル以外の値も追加したいときが発生します。
  • そんなときは、下記のarray_addヘルパー関数を使います。

array_add($配列,キー,値);

array_add関数は、第1引数に、元になる配列を指定します。この配列に、第2引数と第3引数で指定したキーと値を追加します。

それでは、実践してみましょう。

$user=User::where(‘role_id’,’>=’,70)->lists(‘name’,’id’);
$user=array_add($user,”,’無し’);
return View::make(‘tanto/create’,compact(‘user’);

  • 上記の場合は、$userリストに、usersテーブル以外の値を追加することができます。
  • 今回の例では、キーが空白で、値(リストの表示名)が無しのリストを追加することができました。

上記の例では、ビューファイルでのリストの表示は、「無し」が表示されますが、送信されるデータ(Input::get(‘user_id))は空白です。

NULL値を代入したい場合

普通にInput::getで受信した値をデータベースに書き戻した場合、上記のように空白を指定した場合、データベーステーブルには空白値や0が代入されます。

(例)

$tanto=Tanto::find($id);
$tanto->user_id=Input::get(‘user_id’);
$tanto->save();

そこで、下記のように三項演算子を使用すれば、データベーステーブルにNULL値を代入することができます。

$tanto=Tanto::find($id);
$tanto->user_id=Input::get(‘user_id’) ? : null;
$tanto->save();

この三項演算子を使用しなければ、下記のように書かなくてはいけなくなります。

$tanto=Tanto::find($id);
if(Input::has(‘user_id’)):
$tanto->user_id=Input::get(‘user_id’);
else:
$tanto->user_id=null;
endif;
$tanto->save();

三項演算子は使い慣れるとかなり便利ですので、皆さんも多用してください。

HomesteadにphpMyAdminのインストール

Homesteadには、phpMyAdminがついていませんので、ちょっと不便です。

そこで、HomesteadにphpMyAdminをインストールしてみたいと思います。

ターミナル(Git Bash)から、vagrant sshでHomesteadにSSH接続します。

下記のコマンドでphpmyadminをインストールします。

$ sudo aptitude install phpmyadmin

Do you want to continue?[y/n]にyと入力してEnterします。

phpmyadminの使用Webサーバーを訪ねてきますが、何も選択せずに、そのままEnterします。

2014-06-17 7-26-26

データベースの設定をするかどうか確認してきますが、データベースの設定は既にHomesteadで行っていますので、ここでは設定を変更しないので、Noを選択して、Enterします。

2014-06-17 7-30-54

これで、phpMyAdminはインストールされました。

Homestead.yamlの編集

それでは、インストールしたphpMyAdminをHomestead.yamlファイルに追加記述します。

C:\Users\Hide\.homestead\Homestead.yaml

sites:
-map: homestead.app
to: /home/vagrant/laravel
-map: homestead.phpmyadmin
to: /usr/share/phpmyadmin
  • 4行目と5行目を追加します。
  • 4行目のマップの名前は任意ですので、もっと短い名前でも構いません。たとえば、hs.adminとか。
  • ただし、この名前は、下記のhostsファイルの名前と一致するように作成しなければなりません。

hostsファイルにも、上記phpmyadminを追加します。

C:\Windows\System32\drivers\etc\hosts

127.0.0.1 homestead.app
127.0.0.1 homestead.phpmyadmin
  • 2行目を追加しました。

vagrant provisionの実行

上記設定が完了したら、vagrant provisonコマンドで、設定をprovison(供給)します。

$vagrant provision

再設定が完了したら、ブラウザから、homestead.phpmyadmin:8000と入力してください。

下記のようにphpMyAdminのログイン画面が表示されますので、ユーザー名はhomestead、パスワードはsecretでログインできます。

2014-06-17 17-25-27

ログインしたら、homesteadデータベースが確認できました。

2014-06-17 21-34-46

これで、Homesteadがより使いやすくなりました。