バージョン選択

フォーラム

メニュー

オンライン状況

64 人のユーザが現在オンラインです。 (49 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 63
NSX-R もっと...

サイト内検索

質問 > 管理機能 > カテゴリーCSV(category.csv)の登録について

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yamasan
投稿日時: 2018/10/6 7:47
対応状況: −−−
常連
登録日: 2017/9/7
居住地:
投稿: 45
Re: カテゴリーCSV(category.csv)の登録について
返信ありがとうございます。
本日中にcsvファイルをテキストエディタで開いた情報を
アップさせていただきます。

せっかくすばやい返信を頂いているのに、
申し訳ございません。
yamasan
投稿日時: 2018/10/8 13:54
対応状況: −−−
常連
登録日: 2017/9/7
居住地:
投稿: 45
Re: カテゴリーCSV(category.csv)の登録について




「CsvImportController.php」の「カテゴリ登録CSVアップロード」箇所は画像の通りです。

「category.csv」をテキストエディタで開いた中身ですが、



しかありません。
見方が間違っていたらすみません。
Ringo
投稿日時: 2018/10/9 12:33
対応状況: −−−
半人前
登録日: 2018/8/10
居住地:
投稿: 22
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:	    }
yamasan
投稿日時: 2018/10/9 13:13
対応状況: −−−
常連
登録日: 2017/9/7
居住地:
投稿: 45
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 19:58
対応状況: −−−
半人前
登録日: 2018/8/10
居住地:
投稿: 22
Re: カテゴリーCSV(category.csv)の登録について
「諸々」ご購入先のitobenさんにご確認ください。
Ringo
投稿日時: 2018/10/11 11:13
対応状況: −−−
半人前
登録日: 2018/8/10
居住地:
投稿: 22
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/11 11:45
対応状況: −−−
半人前
登録日: 2018/8/10
居住地:
投稿: 22
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 12:53
対応状況: −−−
半人前
登録日: 2018/8/10
居住地:
投稿: 22
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);
                        }
yamasan
投稿日時: 2018/10/11 13:21
対応状況: −−−
常連
登録日: 2017/9/7
居住地:
投稿: 45
Re: カテゴリーCSV(category.csv)の登録について
インストール前といいましょうか、
itobenさんのほうの「ゼロインストールパッケージ(3.0.15)」の物でして
それのインストール前のCsvImportController.phpです。

ややこしくて申し訳ございません。

itobenさんのほうに問い合わせてみます。
« 1 (2)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

統計情報

総メンバー数は33,204名です
総投稿数は87,771件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1790
4
yuh
1515
5
468
1271
6
red
1178
7
umebius
1007
8
fukap
907
9
shutta
827
10
tsuji
815
11 ramrun 789
12
tao_s
664
13 karin 656
14 sumida 641
15
homan
633
16 DELIGHT 571
17
h_tanaka
571
18
patapata
502
19
flealog
483
20 tonton 436


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© LOCKON CO.,LTD. All Rights Reserved.