FuelPHP - CSVアップロード機能を実装していくよん
管理システムには必須なCSVアップロード機能の簡易VerをFuelPHPで実装していきます。
CSVアップロード機能を実装する手順
アップロードするフォームを作成
/home/index
にアップロードフォームを作成します。
fuel/app/views/home/index.php
を以下のように変更してください。
<!-- .homeIndex -->
<div class="homeIndex box">
<div class="box-header">
<?php echo Form::open(array("action" => "/home/upload",
"class"=>"form-horizontal",
"enctype"=>"multipart/form-data",
)); ?>
<!-- .box-body -->
<div class="box-body">
<div class="form-group">
<?php echo Form::label('CSVファイルを選択してください', 'csv', array('class'=>'col-sm-4 control-label')); ?>
<?php echo Form::file('csv', array('class' => 'col-sm-4')); ?>
</div>
</div>
<!-- /.box-body -->
<div class="box-footer">
<?php echo Form::submit('submit', '送信', array('class' => 'btn btn-primary pull-right')); ?>
</div>
<!-- /.box-footer -->
<?php echo Form::close(); ?>
</div>
</div>
<!-- /.homeIndex -->
/home/index
にアクセスして以下のような画面が表示されればOKです。
CSVアップロード機能を実装
上記、アップロードフォームで送信すると、HomeコントローラのuploadメソッドにPOSTされます。
<?php
class Controller_Home extends Controller_Base
{
public function before()
{
parent::before();
!Auth::check() and Response::redirect('login');
$this->template->subtitle = '';
}
public function action_index()
{
$data = array();
$this->template->title = "ログイン後の画面";
$this->template->content = View::forge('home/index', $data);
}
public function action_upload()
{
$rows = array();
if (is_uploaded_file($_FILES["csv"]["tmp_name"]))
{
$file_tmp_name = $_FILES["csv"]["tmp_name"];
$file_name = $_FILES["csv"]["name"];
//拡張子を判定
if (pathinfo($file_name, PATHINFO_EXTENSION) != 'csv')
{
$err_msg = 'CSVファイルのみ対応しています。';
}
else
{
// MacのExcelで変換したCSVにも対応するため一旦置換
$buf = file_get_contents($file_tmp_name);
$buf = preg_replace("\r\n|\r|\n","\n", $buf);
$fp = tmpfile();
fwrite($fp, $buf);
rewind($fp);
//配列に変換する
while (($data = fgetcsv($fp, 0, ",")) !== FALSE)
{
$rows[] = $data;
}
fclose($fp);
}
}
else
{
$err_msg = "ファイルが選択されていません。";
}
$header = array_shift($rows);
var_dump($header);
var_dump($rows);
exit();
}
}
Macで作成したCSVでもちゃんと読み込めるように以下の記事を参考に書いています。
PHP – MacのExcelで変換したCSVをfgetcsvで読み込もうとすると改行されなくて一行になってしまう問題 | Miningoo
CSVを読み込んだ後は、煮るなり焼くなりなんとでもしてくださいー!