FuelPHP

FuelPHP - CSVアップロード機能を実装

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を読み込んだ後は、煮るなり焼くなりなんとでもしてくださいー!

-FuelPHP