Ignore:
Timestamp:
2013/01/16 12:18:03 (11 years ago)
Author:
undertree
Message:

#1871 (商品登録CSV 末尾に改行がない CSV で誤動作)

・CSVファイルの読み込み処理の別メソッド化
・CSVファイル末尾の改行有無で動作が変わらないように調整

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_12-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php

    r22251 r22254  
    160160 
    161161    /** 
     162     * CSVファイルを読み込んで、保存処理を行う 
     163     * 
     164     * @param $objFormParam 
     165     * @param $fp CSVファイルポインタ 
     166     * @param $objQuery 保存を行うためのクエリ(指定がない場合、テストのみを行う) 
     167     * @return boolean errFlag. 読み込みに失敗した場合true 
     168     */ 
     169    function lfReadCSVFile(&$objFormParam, &$fp, $objQuery = null) { 
     170        $dry_run = ($objQuery===null) ? true : false; 
     171        // 登録対象の列数 
     172        $col_max_count = $objFormParam->getCount(); 
     173        // 行数 
     174        $line_count = 0; 
     175        // 処理に失敗した場合にtrue 
     176        $errFlag = false; 
     177 
     178        while (!feof($fp)) { 
     179            $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
     180 
     181            // 行カウント 
     182            $line_count++; 
     183            // ヘッダ行はスキップ 
     184            if ($line_count == 1) { 
     185                continue; 
     186            } 
     187            // 空行はスキップ 
     188            if (empty($arrCSV)) { 
     189                continue; 
     190            } 
     191            // 列数が多すぎる場合はエラー、列数が少ない場合は未設定として配列を補う 
     192            $col_count = count($arrCSV); 
     193            if ($col_count > $col_max_count) { 
     194                $this->addRowErr($line_count, '※ 項目数が' . $col_count . '個検出されました。項目数は' . $col_max_count . '個になります。'); 
     195                $errFlag = true; 
     196                break; 
     197            } elseif ($col_count < $col_max_count) { 
     198                $arrCSV = array_pad($arrCSV, $col_max_count, ""); 
     199                if (!$dry_run) { 
     200                    $this->addRowResult($line_count, ($col_count + 1) . "項目以降を空欄として読み込みました"); 
     201                } 
     202            } 
     203 
     204            // シーケンス配列を格納する。 
     205            $objFormParam->setParam($arrCSV, true); 
     206            $arrRet = $objFormParam->getHashArray(); 
     207            $objFormParam->setParam($arrRet); 
     208            // 入力値の変換 
     209            $objFormParam->convParam(); 
     210 
     211            // <br>なしでエラー取得する。 
     212            $arrCSVErr = $this->lfCheckError($objFormParam); 
     213            if (count($arrCSVErr) > 0) { 
     214                foreach ($arrCSVErr as $err) { 
     215                    $this->addRowErr($line_count, $err); 
     216                } 
     217                $errFlag = true; 
     218                break; 
     219            } 
     220 
     221            if (!$dry_run) { 
     222                $this->lfRegistProduct($objQuery, $line_count, $objFormParam); 
     223                $arrParam = $objFormParam->getHashArray(); 
     224 
     225                $this->addRowResult($line_count, '商品ID:'.$arrParam['product_id'] . ' / 商品名:' . $arrParam['name']); 
     226            } 
     227            SC_Utils_Ex::extendTimeOut(); 
     228        } 
     229        return $errFlag; 
     230    } 
     231 
     232    /** 
    162233     * CSVアップロードを実行します. 
    163234     * 
     
    192263        $this->arrFormKeyList = $objFormParam->getKeyList(); 
    193264 
    194         // 登録対象の列数 
    195         $col_max_count = $objFormParam->getCount(); 
    196         // 行数 
    197         $line_count = 0; 
    198  
    199265        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
    200266        $objQuery->begin(); 
    201267 
    202         $errFlag = false; 
    203         $all_line_checked = false; 
    204  
    205         while (!feof($fp)) { 
    206             $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
    207  
    208             // 全行入力チェック後に、ファイルポインターを先頭に戻す 
    209             if (feof($fp) && !$all_line_checked) { 
    210                 rewind($fp); 
    211                 $line_count = 0; 
    212                 $all_line_checked = true; 
    213                 continue; 
    214             } 
    215  
    216             // 行カウント 
    217             $line_count++; 
    218             // ヘッダ行はスキップ 
    219             if ($line_count == 1) { 
    220                 continue; 
    221             } 
    222             // 空行はスキップ 
    223             if (empty($arrCSV)) { 
    224                 continue; 
    225             } 
    226             // 列数が多すぎる場合はエラー、列数が少ない場合は未設定として配列を補う 
    227             $col_count = count($arrCSV); 
    228             if ($col_count > $col_max_count) { 
    229                 $this->addRowErr($line_count, '※ 項目数が' . $col_count . '個検出されました。項目数は' . $col_max_count . '個になります。'); 
    230                 $errFlag = true; 
    231                 break; 
    232             } elseif ($col_count < $col_max_count) { 
    233                 $arrCSV = array_pad($arrCSV, $col_max_count, ""); 
    234                 $this->addRowResult($line_count, ($col_count + 1) . "項目以降を空欄として読み込みました"); 
    235             } 
    236             // シーケンス配列を格納する。 
    237             $objFormParam->setParam($arrCSV, true); 
    238             $arrRet = $objFormParam->getHashArray(); 
    239             $objFormParam->setParam($arrRet); 
    240             // 入力値の変換 
    241             $objFormParam->convParam(); 
    242             // <br>なしでエラー取得する。 
    243             $arrCSVErr = $this->lfCheckError($objFormParam); 
    244  
    245             // 入力エラーチェック 
    246             if (count($arrCSVErr) > 0) { 
    247                 foreach ($arrCSVErr as $err) { 
    248                     $this->addRowErr($line_count, $err); 
    249                 } 
    250                 $errFlag = true; 
    251                 break; 
    252             } 
    253  
    254             if ($all_line_checked) { 
    255                 $this->lfRegistProduct($objQuery, $line_count, $objFormParam); 
    256                 $arrParam = $objFormParam->getHashArray(); 
    257  
    258                 $this->addRowResult($line_count, '商品ID:'.$arrParam['product_id'] . ' / 商品名:' . $arrParam['name']); 
    259             } 
    260             SC_Utils_Ex::extendTimeOut(); 
     268        // CSVからの読み込み、入力エラーチェック 
     269        $errFlag = $this->lfReadCSVFile($objFormParam, $fp); 
     270        if (!$errFlag) { 
     271            rewind($fp); 
     272            // CSVからの読み込み、保存  
     273            $errFlag = $this->lfReadCSVFile($objFormParam, $fp, $objQuery); 
    261274        } 
    262275 
Note: See TracChangeset for help on using the changeset viewer.