0

CakePHP 2.2.1のインストールで、CakeDCによるUtilsプラグインのcsvUpload動作を使用しています。

かなり大きなcsvを正常に処理しているので、うまく機能しています。ただし、私のテーブル/モデルには、一貫性のない関連モデルのIDに基づいているため、固定と見なされる2つのフィールドがあります。したがって、これらの固定値を変数を介して取得する必要があります。これは非常に簡単です。

だから私の質問は、csvUploadの固定フィールドの側面をどのように使用するのですか?私はそれを次のように試しましたが、明らかに機能しなかった多くの小さなバリエーションがあります。

public function upload_csv($Id = null) {
    $unique_add = 69;
    if ( $this->request->is('POST') ) {
        $records_count = $this->Model->find( 'count' );
        try {
            $fixed = array('Model' => array('random_id' => $Id, 'unique_add' => $unique_add));
            $this->Model->importCSV($this->request->data['Model']['CsvFile']['tmp_name'], $fixed);
        } catch (Exception $e) {
            $import_errors = $this->Model->getImportErrors();
            $this->set( 'import_errors', $import_errors );
            $this->Session->setFlash( __('Error Importing') . ' ' . $this->request->data['Model']['CsvFile']['name'] . ', ' . __('column name mismatch.')  );
            $this->redirect( array('action'=>'import') );
        }

        $new_records_count = $this->Model->find( 'count' ) - $records_count;
        $this->Session->setFlash(__('Successfully imported') . ' ' . $new_records_count .  ' records from ' . $this->request->data['Model']['CsvFile']['name'] );
        $this->redirect(array('plugin'=>'usermgmt', 'controller'=>'users', 'action'=>'dashboard'));
    }
}

私が検索したときにこの動作に関する投稿を1つしか見つけられなかったので、どんな助けでも大歓迎です...

4

2 に答える 2

2

同じタスクを実行するためにカスタムメソッドを作成しました。で次のメソッドを定義しますapp\Plugin\Utils\Model\Behavior

public function getCSVData(Model &$Model, $file, $fixed = array())
{
    $settings = array(
              'delimiter' => ',',
              'enclosure' => '"',
              'hasHeader' => true
            );
    $this->setup($Model, $settings);
    $handle = new SplFileObject($file, 'rb');       
    $header = $this->_getHeader($Model, $handle);
    $db = $Model->getDataSource();
    $db->begin($Model);
    $saved = array();
    $data = array();
    $i = 0;
    while (($row = $this->_getCSVLine($Model, $handle)) !== false)
    {
        foreach ($header as $k => $col)
        {
            // get the data field from Model.field              
            $col = str_replace('.', '-', trim($col));
            if (strpos($col, '.') !== false)
            {
                list($model,$field) = explode('.', $col);
                $data[$i][$model][$field] = (isset($row[$k])) ? $row[$k] : '';
            }
            else
            {
                $col = str_replace(' ','_', $col);
                $data[$i][$Model->alias][$col] = (isset($row[$k])) ? $row[$k] : '';
            }
        }
        $is_valid_row = false;

        foreach($data[$i][$Model->alias] as $col => $value )
        {
            if(!empty($data[$i][$Model->alias][$col]))
            {
                $is_valid_row = true;                   
            }
        }
        if($is_valid_row == true)
        {
            $i++;
            $data = Set::merge($data, $fixed);  
        }
        else
        {
            unset($data[$i]);
        }
    }
    return $data;
}   

そして、あなたはそれを使ってそれを使うことができます:

  $csv_data = $this->Model->getCSVData($this->request->data['Model']['CsvFile']['tmp_name'], $fixed);

ここ$csv_dataには、空ではなく、各レコードインデックスに固定フィールドがあるcsvファイルのすべてのレコードの配列が含まれます。

于 2012-09-05T06:32:56.787 に答える
0

それで、アルンに話しているときに、私は自分の質問に答えて、それを理解しました。目の前にあるものを実際に調べるのではなく、幅広く探していました。私はいくつかのデバッグを実行し始め、それを理解しました。

まず第一に、$ unique_add = 69はint、duhと見なされます。csvに追加するには、文字列として表示する必要があります。したがって、単純に$ unique_add='69'になります。

$Idの値を固定配列に直接入力できませんでした。したがって、必要な値を取得するには、単純な検索を実行する必要がありました。

$needed_id = $this->Model->find('first', array(
            'condition'=>array('Model.id'=>$Id)
        )
    );

    $random_id = $needed_id['Model']['id'];

うまくいけば、他の誰もこのばかげた間違いを犯さないので、これが誰かを助けるために必要とされないでしょう。しかし、1つプラス...実際には、CakeDCUtilsプラグインでの固定フィールドの使用を文書化したインターネット上の投稿が複数あります。

于 2012-09-05T11:36:07.160 に答える