桜上水日記#2

桜上水在住のフリーのプログラマ/システムエンジニアの徒然なる日記風テキスト

CSV Datasources on CakePHP1.2 備忘録&使用感

CMS案件でcsvを扱う必要があったので備忘録

ソース

@kaz_29さん作成のマルチModel対応のCSV Datasourceを使用しました。
[github: Source]

設置場所

app/models/datasources/csv_source.php

CSV DatasourceをModelとして使う設定

app/config/database.php内に以下を記述
var $csv = array(
'datasource' => 'csv',
'path' => '..\tmp\csv', // local path on the server(windows)
'extension' => 'csv', // file extension of CSV Files
'readonly' => true, // only for reading
'recursive' => false, // only false is supported at the moment
);

linuxで使用する場合はpathの\を/に変更の事。
configファイルなので DS が使えない。。。

csv置き場とファイル名

app/config/database.php内に記述した通り、
app/tmp/csv/
以下にcsvファイルを設置。
ファイル名は
例えば Userモデル の場合は users.csv など、
Cakephpのモデル→テーブル名の規則に準じるファイル名にする。

Modelファイル変更

使用するmodel.phpファイルに

var $useDbConfig = 'csv';

の1行を追加

csvの記述方法

1行目がカラム名になるので使用したいカラム名を記述
2行目以降を実データとする。
csvファイルの文字コードはmb_internal_encoding()と一致するものが望ましいが、
Excel的にShift-JISも扱いたいところ。
その際はcsv_datasouce.php内のread()関数で

// Daten werden aus der Datei in ein Array $data gelesen
while ( ($data = fgetcsv ($this->handle[$model->table], 8192, $this->delimiter)) !== FALSE ) {
if ($lineCount == 0) {

の部分でdata(array)の各要素$valueに
mb_convert_encoding($value, mb_internal_encoding(), 'UTF-8,SJIS')
してやれば良いかと。

※今回の案件ではcsvアップローダでModel用csvをアップロードする際にUTF-8に変換掛けてるので使用しませんでした。

controllerでのmodelデータ呼び出し

後は$usesに使用したいModel突っ込んで、
$this->Model->find('all')なりその他のmethodで呼んでやるだけです。
Cake記法でデータ取得出来るので直感的にコードが書けてうまうまでした。
オレオレcsvにはもう戻れませんw

謝辞

兎にも角にも、PHP勉強会@関東で@kaz_29さんがDataSourceについての発表を行ってくれなければ使用しなかったと思います。

また、複数Modelが使用出来ずに困っていたつぶやき@Twitterを拾って、即修正版を上げて下さいまして、大変助かりました。
大変感謝しております。

まとめ

csv使うPHP案件があったらガンガン使おう!
というわけで備忘録のまとめとさせて頂きます。

-

-

Calendar
Categories
New Entries
Archives
Profile
Other