1.コントローラーに書き込む
ちょっと複雑に書いていますが、取込エラーした場合のエラーリスト生成を含んでいます。
そのままでも基本使えますが、デバックはしてください。
array_splice
はカラムを削除しているのですが、なんで削除しているのか忘れました。
多分いらないはずです。
controller.php
public function csv() {
error_reporting(0);
ini_set("max_execution_time",600);
// CSV取込
if($_POST['mode'] == "csv"){
$this->set('csvdata', $_POST['data']);
$this->set('txtmode', $_POST['txtmode']);
$result = $_POST['data'];
// 配列に格納
$member_list = explode("\r\n", $result); // 改行で配列
foreach($member_list as $value){
if($value !== reset($member_list)){// 最初は飛ばす
if($_POST['txtmode'] == 0){
$member_lists[] = explode(',',$value); // カンマで区切る
}else{
$member_lists[] = explode("\t",$value); // タブで区切る
}
}
}
//空データ削除
foreach($member_lists as $key => $value){
if(!empty($value[0])){
$lists[] = $value;
}
}
// header情報取得
$column = $this->MemberColumn->find('all');
foreach($column as $value){ // フィールド設定
$column_field[] = $value['MemberColumn']['category_data_name'];
}
$column_field_u = $column_field;
array_splice($column_field_u, 0, 1);
//カラム付ける
foreach($mem_lists as $key => $value){
foreach($column_field as $key2 => $values){
$mem_list[$key][$values] = $value[$key2];
}
}
//insert & update
foreach($mem_list as $value){
$data = array('Members' => $value);
$check = $this->Members->findByMember_id($data['Members']['member_id']);
if(empty($check['Members'])){
try{
$this->Members->save($data, false, $column_field);
}catch(Exception $e){
foreach($member_list as $value){
if(preg_match('/'.$data['Members']['member_id'].'/', $value)){
$errorlist['data']['insert'][] = $value;
}
}
}
}else{
array_splice($column_field_u, 17, 1);
array_splice($data['Members'], 18, 1);
try{
$this->Members->save($data, false, $column_field_u);
}catch(Exception $e){
foreach($member_list as $value){
if(preg_match('/'.$data['Members']['member_id'].'/', $value)){
$errorlist['data']['updata'][] = $value;
}
}
}
}
}
}// csv if end
//エラーリスト
//ヘッダー格納
$errorlist['header'] = (!empty($errorlist['data']))? $member_list[0]: none;
$this->set('errorlist',$errorlist);
2.続いてctpの書き方
カンマ区切りなのか、タブ区切りか選べるようにしてます。
csv.ctp
<?php if(!empty($errorlist['header']) && $errorlist['header'] != 'none'): ?>
<div class="error">
<p>エラーリスト</p>
<p class="attention">データ修正を行い、別途登録してください。</p>
<?php if(!empty($errorlist['data']['insert'])): ?>
<p>インサート</p>
<textarea><?php
echo $errorlist['header'].' ';
foreach($errorlist['data']['insert'] as $error){
echo $error.' ';
}
?></textarea>
<?php endif; ?>
<?php if(!empty($errorlist['data']['updata'])): ?>
<p>アップデート</p>
<textarea><?php
echo $errorlist['header'].' ';
foreach($errorlist['data']['updata'] as $error){
echo $error.' ';
}
?></textarea>
<?php endif; ?>
</div>
<?php endif; ?>
<form method="post" name="csv" id="form" class="csv">
<input type="hidden" name="mode" value="csv">
<div>
<h4>区切り指定</h4>
<label><input type="radio" name="txtmode" value="0" <?php if($txtmode == 0){ echo 'checked'; } ?> required> カンマ区切り</label>
<label><input type="radio" name="txtmode" value="1" <?php if($txtmode == 1){ echo 'checked'; } ?> required> タブ区切り</label>
</div>
<textarea name="data"><?php if(isset($csvdata)){ echo $csvdata; }else{ echo "ログインID\t会員番号\n"; } ?></textarea>
<input type="submit" value="送信">
</form>