エス技研

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の関連記事

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のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。

CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除

CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。

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

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

CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定

CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。

CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法

CakePHP3の日時カラムで秒まで扱う場合はdate()、strtotime()関数ではうまくいかない。CakePHP3であらかじめ用意された「i18nFormat()」を使用する。

CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る

他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。

CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3で保存前にバリデーション結果を取得する2つの方法

CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。

CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを
CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを

CakePHP3でルーティングの設定変更をしたけど反映されない!そんなときは慌てず騒がずキャッシュをクリアしよう!ルーティングの設定もキャッシュされることがあるらしい。

CakePHP 2.3 Search Pluginで検索処理 その1設置方法

CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。