エス技研

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のFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因

Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。

CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll

主キー(ID)以外のカラムをキーとして更新する方法、updateAllの使い方をサンプルを用いて解説します。

CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつテンプレートファイルがどこにあるか、設定情報ファイルがどこにあるか、を説明しつつカスタマイズの方法を解説します。

CakePHP3でテーブルにカラムを追加したときに変更するポイントのまとめ
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ

CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。

CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法

CakePHP3でcomposerを使ってパッケージ(ライブラリ、プラグイン)をインストールする方法の解説。PHPを使うのはCakePHP3が初めてというような方への使い方から解説。

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

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

Google Analytics APIを CakePHP3で動かしてレポートデータを取得する方法の解説
Google Analytics APIを CakePHP3で動かしてレポートデータを取得する方法の解説

CakePHP3で Google Analytics APIからレポートデータを取得する処理の解説。PHPのサンプルソースをCakePHP3で動くように改造。加えて、ディメンションやメトリックスを条件に設定する方法なども。

CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法

CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。

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

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

CakePHP3のForm Helperの使い方のまとめ

CakePHP3になりフォームヘルパーの使い方も大きく変わりましたので、使い方をまとめました。基本的な使い方からプラスアルファの便利な使い方まで紹介。