バージョン選択
フォーラム
メニュー
オンライン状況
|
|
72 人のユーザが現在オンラインです。 (58 人のユーザが フォーラム を参照しています。) |
|
|
質問 > 管理機能 > カテゴリーCSV(category.csv)の登録について |
|
管理機能
投稿者 |
スレッド |
468 |
投稿日時: 2018/10/21 8:36
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: カテゴリーCSV(category.csv)の登録について /src/Eccube/Controller/Admin/Product/CsvImportController.phpにある private function getCategoryCsvHeader()の記述はどのようになっていますか? ここにインポートするCSVの項目(フォーマット)が配列で定義されており、 CSVの1行目と比較しています。 この部分が何かカスタマイズされているのではないでしょうか? ---------------- 株式会社シロハチ ■ECCUBE2系、3系構築カスタマイズご相談ください。 ■EC-CUBE3マニュアル ■blog
|
|
|
Ringo |
投稿日時: 2018/10/20 18:49
対応状況: −−−
|
常連 登録日: 2018/8/10 居住地: 投稿: 70 |
Re: カテゴリーCSV(category.csv)の登録について <確認事項> 現在 https://itoben.com/blog/2384.htmlを見ると EC-CUBE3機能カスタマイズ版C3016D1807A (ECCUBE3.0.16ベース) ですが、 当時、購入されたのは EC-CUBE3機能カスタマイズ版xxxx..... (ECCUBE3.0.15ベース) という理解でよろしいでしょうか(?1) 現在のEC-CUBE3機能カスタマイズ版C3016D1807Aのデモで「カテゴリCSV登録」画面を開くと「カテゴリ登録CSVファイルフォーマット」が カテゴリID カテゴリ名 親カテゴリID カテゴリー説明 title author description keyword meta_robots 画像 ですが「C-CUBE3機能カスタマイズ版xxxx.....(ECCUBE3.0.15ベース)」も同じですか(?2) 「雛形ファイルダウンロード」でのcategory.csvのヘッダーは カテゴリID,カテゴリ名,親カテゴリID,カテゴリー説明,title,author,description,keyword,meta_robots,画像 ですか(?3) <小生の今後の対応可能の為の情報提供願い> 1. 再三になりますが、 https://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=thread&topic_id=20921&forum=11&post_id=88668#forumpost88668の実施と結果の情報は頂けませんか(?4) 2. dtb_categoryのフィールド定義情報 >AAA、BBB、それぞれの「dtb_category」のカラム構造が異なっているのだと思います。 デモサイト(3.0.16カスタマイズ)を見る限り「異なってます」よね(?5) BBBのdtb_categoryの定義文を確認して、教えて貰えますか(?6) もし、定義文の確認の仕方が分からないない場合は「そう言って」ください。 ?1〜6に対して、回答できる部分で良いので回答を頂けますか?
|
|
|
yamasan |
投稿日時: 2018/10/19 16:43
対応状況: −−−
|
常連 登録日: 2017/9/7 居住地: 投稿: 52 |
Re: カテゴリーCSV(category.csv)の登録について その後ですが、 カスタマイズを購入した https://itoben.com/blog/「ITOBEN STYLE」さんより >フォーマットが違うというのは、 意味として、カラムの構成が違うということではないでしょうか? AAA、BBB、それぞれの「dtb_category」のカラム構造が異なっているのだと思います。 と返信を頂いたので こちらからの返信で >AAAというサイトを抜きで、 BBBというカスタマイズ版をインストールした直後(インストールしただけでなにもいじっていない)のサイトで 管理画面からcategory.csvをダウンロードし、それをそのままアップロードを試しても 「CSVのフォーマットが一致しません」とオレンジの文字ででるので >AAA、BBB、それぞれの「dtb_category」のカラム構造が異なっている のとは違うのではと考えられます。 と送ったところ >申し訳ございません。 内容的に、こちらのサポート外だと思うのですが。 ときたので >こちらのサポート外だと思うのですが。 ということですが、 ノーマルのEC-CUBE3.・・だと インストールした直後に↓ 管理画面からcategory.csvをダウンロードし、それをそのままアップロードでは 「CSVデータが存在しません。」という正常な動作です。 カスタマイズ版をインストールした場合のみ インストールした直後でも↓ 管理画面からcategory.csvをダウンロードし、それをそのままアップロードすると 「フォーマットが一致しません」とでます。 ノーマルのEC-CUBE3.0.・・の 「CsvImportController.php」と カスタマイズ版の 「CsvImportController.php」の中身がインストール前で若干違います。 と送ったところです。 原因に辿り着けそうにありません・・。
|
|
|
yamasan |
投稿日時: 2018/10/11 13:21
対応状況: −−−
|
常連 登録日: 2017/9/7 居住地: 投稿: 52 |
Re: カテゴリーCSV(category.csv)の登録について インストール前といいましょうか、 itobenさんのほうの「ゼロインストールパッケージ(3.0.15)」の物でして それのインストール前のCsvImportController.phpです。
ややこしくて申し訳ございません。
itobenさんのほうに問い合わせてみます。
|
|
|
Ringo |
投稿日時: 2018/10/11 12:53
対応状況: −−−
|
常連 登録日: 2018/8/10 居住地: 投稿: 70 |
Re: カテゴリーCSV(category.csv)の登録について > https://itoben.com/blog/2384.htmlのカスタマイズ版のインストール前の >「CsvImportController.php」の中身は下記のとおりです。 ECCUBE3.0.15には無い↓のコードがありますね。 「インストール前」ではなく、「インストール 後」ではないでしょうか? ※やはり、カテゴリ関係で、修正されている気配がします。
if (Str::isNotBlank($row['カテゴリー説明'])) {
$Category->setCategoryDescription(Str::trimAll($row['カテゴリー説明']));
} else {
$Category->setCategoryDescription(null);
}
|
|
|
Ringo |
投稿日時: 2018/10/11 11:45
対応状況: −−−
|
常連 登録日: 2018/8/10 居住地: 投稿: 70 |
Re: カテゴリーCSV(category.csv)の登録について >$this->addErrors('CSVのフォーマットが一致しません。getImportData'); はCsvImportController.phpの↓のreturn値次第。
620: /**
621: * アップロードされたCSVファイルの行ごとの処理
622: *
623: * @param $formFile
624: * @return CsvImportService
625: */
626: protected function getImportData($app, $formFile)
627: {
628: // アップロードされたCSVファイルを一時ディレクトリに保存
629: $this->fileName = 'upload_' . Str::random() . '.' . $formFile->getClientOriginalExtension();
630: $formFile->move($app['config']['csv_temp_realdir'], $this->fileName);
631:
632: $file = file_get_contents($app['config']['csv_temp_realdir'] . '/' . $this->fileName);
633:
634: if ('\\' === DIRECTORY_SEPARATOR && PHP_VERSION_ID >= 70000) {
635: // Windows 環境の PHP7 の場合はファイルエンコーディングを CP932 に合わせる
636: // see https://github.com/EC-CUBE/ec-cube/issues/1780
637: setlocale(LC_ALL, ''); // 既定のロケールに設定
638: if (mb_detect_encoding($file) === 'UTF-8') { // UTF-8 を検出したら SJIS-win に変換
639: $file = mb_convert_encoding($file, 'SJIS-win', 'UTF-8');
640: }
641: } else {
642: // アップロードされたファイルがUTF-8以外は文字コード変換を行う
643: $encode = Str::characterEncoding(substr($file, 0, 6));
644: if ($encode != 'UTF-8') {
645: $file = mb_convert_encoding($file, 'UTF-8', $encode);
646: }
647: }
648: $file = Str::convertLineFeed($file);
649:
650: $tmp = tmpfile();
651: fwrite($tmp, $file);
652: rewind($tmp);
653: $meta = stream_get_meta_data($tmp);
654: $file = new \SplFileObject($meta['uri']);
655:
656: set_time_limit(0);
657:
658: // アップロードされたCSVファイルを行ごとに取得
659: $data = new CsvImportService($file, $app['config']['csv_import_delimiter'], $app['config']['csv_import_enclosure']);
660:
661: $ret = $data->setHeaderRowNumber(0);
662:
663: return ($ret !== false) ? $data : false;
664: }
>$this->addErrors('CSVのフォーマットが一致しません。columnHeaders'); は eccube-3.0.15/src/Eccube/Service/CsvImportService.php
/**
* Get column headers
*
* @return array
*/
public function getColumnHeaders()
{
return array_keys($this->columnHeaders);
}
からの「return array_keys($this->columnHeaders);」次第。 故、 >ただ、「管理画面」「カテゴリ登録」「CSVダウンロード」した場合のcsvファイルは >「カテゴリID,カテゴリ名,親カテゴリID」となり、そのまま「カテゴリCSV登録」すると、 >「CSVデータが存在しません。」 >となるはずなのですが、、、 とならない以上、ソースが改変されているはず、、、と、推測せざる得ず、 そのソースは「itobenさん」からのご購入ということなので、 >「諸々」ご購入先のitobenさんにご確認ください。 と記させて頂きました。
|
|
|
Ringo |
投稿日時: 2018/10/11 11:13
対応状況: −−−
|
常連 登録日: 2018/8/10 居住地: 投稿: 70 |
Re: カテゴリーCSV(category.csv)の登録について >>$this->addErrors('CSVのフォーマットが一致しません。getImportData'); >>$this->addErrors('CSVのフォーマットが一致しません。columnHeaders'); >>での、動作確認は出来ませんか? > >すみません、こちらはどのようにしたら宜しいでしょうか。 https://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=thread&topic_id=20921&forum=11&post_id=88668#forumpost88668の様にCsvImportController.phpに「識別用文字列(getImportDataやcolumnHeaders)」を追記して、CSV登録して、どちらのメッセージが表示されるか、、、が確認したい。 という事なのですが、出来ますでしょうか?
|
|
|
Ringo |
投稿日時: 2018/10/9 19:58
対応状況: −−−
|
常連 登録日: 2018/8/10 居住地: 投稿: 70 |
Re: カテゴリーCSV(category.csv)の登録について 「諸々」ご購入先のitobenさんにご確認ください。
|
|
|
yamasan |
投稿日時: 2018/10/9 13:13
対応状況: −−−
|
常連 登録日: 2017/9/7 居住地: 投稿: 52 |
Re: カテゴリーCSV(category.csv)の登録について >「キャッシュバグ修正済み」はtwigのバージョンアップ(差替え)ですか? 「キャッシュバグ修正済み」はtwigのバージョンアップを差替えたものです。 >CsvImportController.phpはカスタマイズされてますか? いえ、一切いじっておりません。 ↓ https://itoben.com/blog/2384.htmlこちらのEC-CUBE3.のカスタマイズ版をインストールした状態のままです。 >「ec-cube-3.0.15.zip」が、既に、手元にない場合は > https://github.com/EC-CUBE/ec-cube/tree/3.0.15>の「右端」「Clone or download」内「Download ZIP」で、ダウンロードしてください。 https://itoben.com/blog/2384.htmlのカスタマイズ版のインストール前の 「CsvImportController.php」の中身は下記のとおりです。 442行目の * カテゴリ登録CSVアップロードから564行目まで↓ * カテゴリ登録CSVアップロード
*/
public function csvCategory(Application $app, Request $request)
{
$form = $app['form.factory']->createBuilder('admin_csv_import')->getForm();
$headers = $this->getCategoryCsvHeader();
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
if ($form->isValid()) {
$formFile = $form['import_file']->getData();
if (!empty($formFile)) {
log_info('カテゴリCSV登録開始');
$data = $this->getImportData($app, $formFile);
if ($data === false) {
$this->addErrors('CSVのフォーマットが一致しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
$keys = array_keys($headers);
$columnHeaders = $data->getColumnHeaders();
if ($keys !== $columnHeaders) {
$this->addErrors('CSVのフォーマットが一致しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
$size = count($data);
if ($size < 1) {
$this->addErrors('CSVデータが存在しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
$headerSize = count($keys);
$this->em = $app['orm.em'];
$this->em->getConfiguration()->setSQLLogger(null);
$this->em->getConnection()->beginTransaction();
// CSVファイルの登録処理
foreach ($data as $row) {
if ($headerSize != count($row)) {
$this->addErrors(($data->key() + 1) . '行目のCSVフォーマットが一致しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
if ($row['カテゴリID'] == '') {
$Category = new Category();
} else {
if (!preg_match('/^\d+$/', $row['カテゴリID'])) {
$this->addErrors(($data->key() + 1) . '行目のカテゴリIDが存在しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
$Category = $app['eccube.repository.category']->find($row['カテゴリID']);
if (!$Category) {
$this->addErrors(($data->key() + 1) . '行目のカテゴリIDが存在しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
if ($row['カテゴリID'] == $row['親カテゴリID']) {
$this->addErrors(($data->key() + 1) . '行目のカテゴリIDと親カテゴリIDが同じです。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
}
if (Str::isBlank($row['カテゴリ名'])) {
$this->addErrors(($data->key() + 1) . '行目のカテゴリ名が設定されていません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
} else {
$Category->setName(Str::trimAll($row['カテゴリ名']));
}
if ($row['親カテゴリID'] != '') {
if (!preg_match('/^\d+$/', $row['親カテゴリID'])) {
$this->addErrors(($data->key() + 1) . '行目の親カテゴリIDが存在しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
$ParentCategory = $app['eccube.repository.category']->find($row['親カテゴリID']);
if (!$ParentCategory) {
$this->addErrors(($data->key() + 1) . '行目の親カテゴリIDが存在しません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
} else {
$ParentCategory = null;
}
if (Str::isNotBlank($row['カテゴリー説明'])) {
$Category->setCategoryDescription(Str::trimAll($row['カテゴリー説明']));
} else {
$Category->setCategoryDescription(null);
}
$Category->setParent($ParentCategory);
if ($ParentCategory) {
$Category->setLevel($ParentCategory->getLevel() + 1);
} else {
$Category->setLevel(1);
}
if ($app['config']['category_nest_level'] < $Category->getLevel()) {
$this->addErrors(($data->key() + 1) . '行目のカテゴリが最大レベルを超えているため設定できません。');
return $this->render($app, $form, $headers, $this->categoryTwig);
}
$status = $app['eccube.repository.category']->save($Category);
if (!$status) {
$this->addErrors(($data->key() + 1) . '行目のカテゴリが設定できません。');
}
if ($this->hasErrors()) {
return $this->render($app, $form, $headers, $this->categoryTwig);
}
$this->em->persist($Category);
}
$this->em->flush();
$this->em->getConnection()->commit();
log_info('カテゴリCSV登録完了');
$app->addSuccess('admin.category.csv_import.save.complete', 'admin');
}
}
}
return $this->render($app, $form, $headers, $this->categoryTwig);
}
>$this->addErrors('CSVのフォーマットが一致しません。getImportData'); >$this->addErrors('CSVのフォーマットが一致しません。columnHeaders'); >での、動作確認は出来ませんか? すみません、こちらはどのようにしたら宜しいでしょうか。
|
|
|
Ringo |
投稿日時: 2018/10/9 12:33
対応状況: −−−
|
常連 登録日: 2018/8/10 居住地: 投稿: 70 |
Re: カテゴリーCSV(category.csv)の登録について >EC-CUBE3.0.15(キャッシュバグ修正済み)使用。 ※・「キャッシュバグ修正済み」はtwigのバージョンアップ(差替え)ですか? ・CsvImportController.phpはカスタマイズされてますか? ご提示頂いたコードの行数が素↓のコードとずれているのが「???」 素のeccube-3.0.15\src\Eccube\Controller\Admin\Product\CsvImportController.phpの「カテゴリ登録CSVアップロード」は「409」行目からです。 >ただ、「管理画面」「カテゴリ登録」「CSVダウンロード」した場合のcsvファイルは >「カテゴリID,カテゴリ名,親カテゴリID」となり、そのまま「カテゴリCSV登録」すると、 >「CSVデータが存在しません。」 >となるはずなのですが、、、 とならないとすると、CsvImportController.phpが壊れているかも。 今一度「ec-cube-3.0.15.zip」より「CsvImportController.php」取出し、置き換えてみてはいかかでしょう? ※カスタマイズされている場合は、現ファイルはバックアップを取ってください。 「ec-cube-3.0.15.zip」が、既に、手元にない場合は https://github.com/EC-CUBE/ec-cube/tree/3.0.15の「右端」「Clone or download」内「Download ZIP」で、ダウンロードしてください。 尚、コード等の文字情報は[code][/code]([ ]は半角)で挟んで頂けると、こちらで、copy and pastして、再現・解析がしやすいです。 「画像」ではいかんともしがたいです。 あと、 $this->addErrors('CSVのフォーマットが一致しません。getImportData'); $this->addErrors('CSVのフォーマットが一致しません。columnHeaders'); での、動作確認は出来ませんか?
409: /**
410: * カテゴリ登録CSVアップロード
411: */
412: public function csvCategory(Application $app, Request $request)
413: {
414:
415: $form = $app['form.factory']->createBuilder('admin_csv_import')->getForm();
416:
417: $headers = $this->getCategoryCsvHeader();
418:
419: if ('POST' === $request->getMethod()) {
420:
421: $form->handleRequest($request);
422:
423: if ($form->isValid()) {
424:
425: $formFile = $form['import_file']->getData();
426:
427: if (!empty($formFile)) {
428:
429: log_info('カテゴリCSV登録開始');
430:
431: $data = $this->getImportData($app, $formFile);
432: if ($data === false) {
433: $this->addErrors('CSVのフォーマットが一致しません。getImportData');
434: return $this->render($app, $form, $headers, $this->categoryTwig);
435: }
436:
437: $keys = array_keys($headers);
438: $columnHeaders = $data->getColumnHeaders();
439: if ($keys !== $columnHeaders) {
440: $this->addErrors('CSVのフォーマットが一致しません。columnHeaders');
441: return $this->render($app, $form, $headers, $this->categoryTwig);
442: }
443:
444: $size = count($data);
445: if ($size < 1) {
446: $this->addErrors('CSVデータが存在しません。');
447: return $this->render($app, $form, $headers, $this->categoryTwig);
448: }
449:
450: $headerSize = count($keys);
451:
452: $this->em = $app['orm.em'];
453: $this->em->getConfiguration()->setSQLLogger(null);
454:
455: $this->em->getConnection()->beginTransaction();
456:
457: // CSVファイルの登録処理
458: foreach ($data as $row) {
459:
460: if ($headerSize != count($row)) {
461: $this->addErrors(($data->key() + 1) . '行目のCSVフォーマットが一致しません。');
462: return $this->render($app, $form, $headers, $this->categoryTwig);
463: }
464:
465: if ($row['カテゴリID'] == '') {
466: $Category = new Category();
467: } else {
468: if (!preg_match('/^\d+$/', $row['カテゴリID'])) {
469: $this->addErrors(($data->key() + 1) . '行目のカテゴリIDが存在しません。');
470: return $this->render($app, $form, $headers, $this->categoryTwig);
471: }
472: $Category = $app['eccube.repository.category']->find($row['カテゴリID']);
473: if (!$Category) {
474: $this->addErrors(($data->key() + 1) . '行目のカテゴリIDが存在しません。');
475: return $this->render($app, $form, $headers, $this->categoryTwig);
476: }
477: if ($row['カテゴリID'] == $row['親カテゴリID']) {
478: $this->addErrors(($data->key() + 1) . '行目のカテゴリIDと親カテゴリIDが同じです。');
479: return $this->render($app, $form, $headers, $this->categoryTwig);
480: }
481:
482: }
483:
484: if (Str::isBlank($row['カテゴリ名'])) {
485: $this->addErrors(($data->key() + 1) . '行目のカテゴリ名が設定されていません。');
486: return $this->render($app, $form, $headers, $this->categoryTwig);
487: } else {
488: $Category->setName(Str::trimAll($row['カテゴリ名']));
489: }
490:
491: if ($row['親カテゴリID'] != '') {
492:
493: if (!preg_match('/^\d+$/', $row['親カテゴリID'])) {
494: $this->addErrors(($data->key() + 1) . '行目の親カテゴリIDが存在しません。');
495: return $this->render($app, $form, $headers, $this->categoryTwig);
496: }
497:
498: $ParentCategory = $app['eccube.repository.category']->find($row['親カテゴリID']);
499: if (!$ParentCategory) {
500: $this->addErrors(($data->key() + 1) . '行目の親カテゴリIDが存在しません。');
501: return $this->render($app, $form, $headers, $this->categoryTwig);
502: }
503:
504: } else {
505: $ParentCategory = null;
506: }
507:
508: $Category->setParent($ParentCategory);
509: if ($ParentCategory) {
510: $Category->setLevel($ParentCategory->getLevel() + 1);
511: } else {
512: $Category->setLevel(1);
513: }
514:
515: if ($app['config']['category_nest_level'] < $Category->getLevel()) {
516: $this->addErrors(($data->key() + 1) . '行目のカテゴリが最大レベルを超えているため設定できません。');
517: return $this->render($app, $form, $headers, $this->categoryTwig);
518: }
519:
520: $status = $app['eccube.repository.category']->save($Category);
521:
522: if (!$status) {
523: $this->addErrors(($data->key() + 1) . '行目のカテゴリが設定できません。');
524: }
525:
526: if ($this->hasErrors()) {
527: return $this->render($app, $form, $headers, $this->categoryTwig);
528: }
529:
530: $this->em->persist($Category);
531:
532: }
533:
534: $this->em->flush();
535: $this->em->getConnection()->commit();
536:
537: log_info('カテゴリCSV登録完了');
538:
539: $app->addSuccess('admin.category.csv_import.save.complete', 'admin');
540: }
541:
542: }
543: }
544:
545: return $this->render($app, $form, $headers, $this->categoryTwig);
546: }
|
|
|
|
統計情報
総メンバー数は88,853名です
総投稿数は109,989件です
|