エス技研

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で検索処理 その2表示件数を動的に変える方法

CakePHPの検索プラグイン Search Pluginの検索処理の中で動的に表示件数を変える方法です。

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

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

CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得

URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。

CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応

CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!

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

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

VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する。
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する

VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。

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

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

CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2
CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその2でバリデーションなどの実用的なカスタマイズ方法を解説。

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

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

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

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