エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説

      2020/08/24

CakePHP3で CSVアップロードする処理作成について

 
CakePHP3を利用して、モデルとは直接関係がないフォームを作成します。
そこから CSVファイルをアップロードし、テーブルの情報を新規登録する、更新する、と言う処理について解説をします。
 
 

この記事の参考サイト

 
なお、この記事は、下記の記事を元にして書いています。
https://qiita.com/groggy-chan/items/ba37220abeb23a2c9562
 
上記の記事では、不足している処理や、間違っている箇所がありそのままでは動作しませんでしたので、この記事ではその修正ポイントや、追加の解説をする目的で書き始めました。
 
 

記事で利用するサンプルテーブルの構造

 
また、この記事で利用するテーブルは、下記の構造となっています。
 

 
このテーブルは、下記の CookBookの「ブックマークチュートリアル」で利用したテーブルを流用したテーブルになります。
(記事の「bookmarks」テーブルを元に「flag_code」「flag」のカラムを追加した「bookmarks2」テーブルを作成しています。)
https://book.cakephp.org/3/ja/tutorials-and-examples/bookmarks/intro.html
 
また、「ブックマークチュートリアル」に関連した記事としては以下の記事もあります。
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
 
 

CakePHP3で CSVアップロードする処理の作成手順解説

 

プラグイン「josegonzalez/cakephp-upload」のインストール

 
まず始めに、今回紹介する CSVアップロード処理では、プラグイン「josegonzalez/cakephp-upload」を必要としますので、「josegonzalez/cakephp-upload」をインストールしていない環境ではまず始めにインストールをします。
 
 
「josegonzalez/cakephp-upload」の解説や詳細なインストール方法などは下記に記事を書いていますのでこちらを参考にしてください。
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
 
 

1.「josegonzalez/cakephp-upload」のインストール

 
まず始めに、プラグイン「josegonzalez/cakephp-upload」を Composerを使ってインストールします。
 
コンソールから下記のコマンドを実行します。
 

 
いくつか確認のメッセージが表示されますが、指定のバージョンなどがある場合を除き、デフォルトのままエンターキーのみを入力して進めてください。
 
 

2.ロードする設定を「config/bootstrap.php」に記述

 
インストールしたプラグインを CakePHP3のアプリ内で使用できるようにロードする設定を記述します。
 
記述方法は、2つの方法があり、どちらか好きな方を選択して実行してください。
 
 

2-1.コマンドを実行する

 
下記のコマンドを実行します。
 

 
 

2-2.手作業で「config/bootstrap.php」に記述する方法

 
「/config/bootstrap.php」ファイルに下記の記述を追記します。
追加する場所はファイルの一番下などで OKです。
 

 
 

CSVファイルをアップロードするプログラムの作成

 

CSVファイルをアップロード処理の作成

 
「/src/Form/HogeCsvForm.php」ファイルを作成し、下記の内容を記述します。
 

 
この処理でプラグイン「josegonzalez/cakephp-upload」を必要とします。
また、この「josegonzalez/cakephp-upload」を使用して、アップロードする CSVファイルのサイズや形式などのバリデーションを行います。
 
ファイルのアップロード、バリデーションの方法などは下記にも記事を書いていますので参考にしてください。
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
 
 
また、参考にした元記事のソースコードから下記の点を修正しています。
 
※17行目

 
 

Controllerの作成

 
「/src/Controller/HogesController.php」ファイルを作成し、下記の内容を記述します。
 

 
20~23行目に書いてありますが、アップロードした CSVファイルは「/uploadfiles/tmp/***」に一時的に保存する処理になっています。
処理が終われば削除されますが、処理が途中で止まった場合などはファイルが残り続けますので、実運用の際は定期的に削除する処理などが必要であろうと思います。
 
 
また、Controllerの処理としては、参考にした元記事のソースコードから下記の点を修正しています。
 
 
※2行目

 
 
※15行目

 
 
※17行目

 
 
※29行目

 
ここは間違いではありませんが、CSVファイルの文字コードは、デフォルトでは「sjis」として処理する仕様になっています(「CsvComponent.php」に記述されています)。
 
ですが、最近は「utf8」が多いとおもいますので、ここでそれを指定しておく必要があります。
文字コードが間違っているとエラーとなることが多々あります。
 
 
また、元の処理では CSVファイルの 1行目はタイトル行があるものとして自動的に読み込まれない仕様になっていました。
そのため、これを機動的に対処できるよう 3つ目のパラメータ(true/false)を追加しています。
 

 
「true」のときは 1行目がタイトル行として取り込まない処理が実行されます。
「false」のときはタイトル行がないものとして 1行目から取込処理を行います。
 
「CsvComponent.php」の処理も合わせて確認してください。
 
 
※43~45行目

 
43行目で読み込んだモデル名と 44、45行目のモデル名が異なっていましたので、ここは一致させる必要があります。
この記事では「Bookmarks2」というテーブル(Moldel)を使っていますので、上記のようになります。
 
 
このサンプルプログラムでは、取得した CSVファイルの内容を新規レコードとして追加する処理(Insert)として記述しています。
そのため、「ID」は編集せず自動的に付与される想定です。
 
また、新規追加(Insert)のほかの記述方法や、既存レコードに対して一部の項目だけを変更する処理(Update)の方法などについては、下記に記事を書きましたのであわせて参考にしてください。
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
 
 

Viewの作成

 
「src/Template/Hoges/csv.ctp」ファイルを作成し、下記の内容を記述します。
 

 
2行目の「$hogesCsv」は、Controllerで生成している変数で「/hoges/csv」と言う値が入っています。
ここを下記のように直接パスを記述する方法でも問題ありません。
 

 
 

CSVデータを読み込むコンポーネント作成

 
「Controller\Component\CsvComponent.php」ファイルを作成し、下記の内容を記述します。
 

 
Controllerのところでも説明しましたが、参考にしたサイトの設定では、1行目はヘッダーがあるものとして必ず削除される処理になっていました。
 
そのため、21行目、および、53、57行目に処理を変更し、パラメータで 1行目を削除するかしないかを変更できるようにしています。
 
 
ちなみに、このコンポーネントの処理は、下記のサイトのソースを参考に作成したとのことです。
https://kantaro-cgi.com/blog/php/super-csv-loader.html
 
 
作業はここまでになります。
 
ここまでの作業を行うと、下記の URLで CSVファイルをアップロードするフォームが表示されると思います。
http://example.com/hoges/csv
 
 
記事の途中にも書きましたが、取得した CSVファイルを追加するのではなく、更新したい!と言う場合などは、下記に追加の解説記事を書いていますのであわせて参考にしてください。
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
 
 

CakePHP3の関連記事

CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

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

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP 2.3 コマンドラインからPHPのシェル実行の方法解説

CakePHP 2.3でコマンドラインから CakePHPで記述した処理を実行する方法を解説します。

CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする

CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法

CakePHP3でPHPExcelを利用してエクセルを編集、出力するサンプルソース+解説。PHPExcelのインストール方法の解説からファイル保存とダウンロードの方法なども解説。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法

コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!

CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可

CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!

CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3で生の SQLの実行はConnectionManagerを使う

CakePHP3で生の SQL文を実行する方法を解説。クリエビルダーを使う場合は TableRegistryを利用するが、SQLを実行する場合は ConnectionManagerを使う。プリペアードステートメントの使用方法も解説。

CakePHP3のキャッシュをクリアする方法「bin/cake cache clear_all」を使う
CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う

CakePHP3、CakePHP4では処理を高速化する手法の一つとしてキャッシュを利用している。しかし、その情報は元の情報を更新しても反映されない場合がある。そんなときはキャッシュを削除する必要がある。

CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合

CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。