app/Customize/Service/CommonService.php line 571

Open in your IDE?
  1. <?php
  2. /**
  3.  * @version EC=CUBE4
  4.  * @copyright 株式会社 翔 kakeru.co.jp
  5.  * @author
  6.  * 2021年11月16日作成
  7.  *
  8.  * app\Customize\Service\CommonService.php
  9.  *
  10.  *
  11.  * 共通サービス
  12.  *
  13.  * YAML・EC-CUBE CONFIG の読み込み・サービス
  14.  *
  15.  *                               C= C= C= ┌(;・_・)┘トコトコ
  16.  ******************************************************/
  17. namespace Customize\Service;
  18. use Doctrine\ORM\EntityManager;
  19. use Eccube\Entity\Cart;
  20. use Eccube\Entity\Master\DeviceType;
  21. use Eccube\Entity\Order;
  22. use Eccube\Entity\Page;
  23. use Eccube\Entity\PageLayout;
  24. use Eccube\Repository\BaseInfoRepository;
  25. use Lm\Engine\EC\Entity\GoodsWithRelated;
  26. use Detection\MobileDetect as MobileDetector;
  27. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  28. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  29. use Symfony\Component\HttpFoundation\RequestStack;
  30. use Symfony\Component\DependencyInjection\ContainerInterface;
  31. use Symfony\Component\HttpFoundation\RedirectResponse;
  32. use Eccube\Common\EccubeConfig;
  33. use Symfony\Component\Yaml\Yaml;
  34. use Twig\Environment as Twig;
  35. use Eccube\Entity\Layout;
  36. use Eccube\Entity\Payment;
  37. use Eccube\Repository\DeliveryFeeRepository;
  38. use Lm\Entity\OrderHeader;
  39. use Lm\Engine\NoukiKeisan\NoukiKeisan as NoukiEngine;
  40. class CommonService
  41. {
  42.     const RouteingFilename 'Routeing.yaml';
  43.     const OliginalToken 'OliginalToken';
  44.     const Session_Junction_Mode 'Session_Junction_Mode';
  45.     const Lm_Order_Option_Session 'Lm_Order_Option_Session';
  46.     const Lm_Order_Option 'LmOrderOption';
  47.     const Lm_Option_Survey 'survey';
  48.     const Lm_Option_Survey_Data 'survey_data';
  49.     const Lm_Option_Coupon 'coupon';
  50.     const Lm_Option_OrderId 'order_id';
  51.     const Lm_Option_Catalog 'catalog';
  52.     const Lm_Option_Receipt 'receipt';
  53.     const RemoveCartItme    'RemoveCartItme';
  54.     const Matrix_Token      'matrix';
  55.     const MetaTagData 'MetaTag.yaml';
  56.     const TOP_DIR 'front-public/files/top/';
  57.     protected $Config;
  58.     protected $Container;
  59.     protected $Twig;
  60.     protected $PageRepository;
  61.     protected $RouteingYamlPath;
  62.     protected $LmPayments = [];
  63.     protected $BaseInfo;
  64.     protected $BaseInfoRepository;
  65.     protected $Session;
  66.     protected $Request;
  67.     protected $TokenStorage;
  68.     protected $LmHelper;
  69.     protected $MobileDetector;
  70.     protected $DeliveryFeeRepository;
  71.     /**
  72.      * @var OrderOptionsService
  73.      */
  74.     protected $OrderOptionsService;
  75.     /**
  76.      * @var YamlService
  77.      */
  78.     protected $YamlService;
  79.     public function __construct(
  80.         ContainerInterface    $Container,
  81.         EccubeConfig          $eccubeConfig,
  82.         BaseInfoRepository    $BaseInfoRepository,
  83.         Twig                  $Twig,
  84.         SessionInterface      $Session,
  85.         RequestStack          $RequestStack,
  86.         TokenStorageInterface $TokenStorage,
  87.         LmHelper              $LmHelper,
  88.         MobileDetector        $mobileDetector,
  89.         DeliveryFeeRepository $DeliveryFeeRepository,
  90.         OrderOptionsService   $OrderOptionsService,
  91.         YamlService           $YamlService
  92.     )
  93.     {
  94.         $this->Container $Container;
  95.         $this->Config $eccubeConfig;
  96.         $this->RouteingYamlPath $this->GetConfig('eccube_config_routes_dir');
  97.         $this->SetTwig($Twig);
  98.         $this->BaseInfoRepository $BaseInfoRepository;
  99.         $this->Session $Session;
  100.         $this->Request $RequestStack->getCurrentRequest();
  101.         $this->TokenStorage $TokenStorage;
  102.         $this->Router $Container->get('router');
  103.         $this->LmHelper $LmHelper;
  104.         $this->MobileDetector $mobileDetector;
  105.         $this->DeliveryFeeRepository $DeliveryFeeRepository;
  106.         $this->OrderOptionsService $OrderOptionsService;
  107.         $this->YamlService $YamlService;
  108.     }
  109.     /**
  110.      * コンフィグ取得する
  111.      * @param str コンフィグ名 null 全ての配列を返す
  112.      * @return {string,int,array} $Config
  113.      */
  114.     public function GetConfig($Str null)
  115.     {
  116.         if (!$Str) {
  117.             return $this->Config;
  118.         } else {
  119.             return $this->Config[$Str] ?? $Str;
  120.         }
  121.     }
  122.     /**
  123.      * Ymlファイルを配列で取得する
  124.      * @param $Yml str YMLファイル名
  125.      * @param %flg boolean true form 逆
  126.      * @param $Path str パス
  127.      * @return Array
  128.      */
  129.     public function GetYaml($Yaml$Flg false$Path null)
  130.     {
  131.         return $this->YamlService->GetYaml($Yaml$Flg$Path);
  132.     }
  133.     /**
  134.      * Ymlファイルを書き込む
  135.      * @param $Add array 書き込む配列
  136.      * @param $Yml str YMLファイル名
  137.      * @param $Path str パス
  138.      * @return Array
  139.      */
  140.     public function MergeYaml(array $Adds$Yaml$Path null)
  141.     {
  142.         return $this->YamlService->MergeYaml($Adds$Yaml$Path);
  143.     }
  144.     /**
  145.      * Ymlファイルを書き込む
  146.      * @param $Data array 書き込む配列
  147.      * @param $Yml str YMLファイル名
  148.      * @param $Path str パス
  149.      */
  150.     public function WriteYml(array $Data$Yaml$Path null)
  151.     {
  152.         return $this->YamlService->WriteYml($Data$Yaml$Path);
  153.     }
  154.     /**
  155.      * BaseINfo
  156.      */
  157.     public function GetBaseInfo($Param null)
  158.     {
  159.         if (!is_array($this->BaseInfo)) {
  160.             #連想配列で格納
  161.             $BaseInfos $this->BaseInfoRepository->get();
  162.             $SetName = function ($Keys) {
  163.                 $Re '';
  164.                 foreach (explode('_'$Keys) as $Key) {
  165.                     $Re .= ucfirst($Key);
  166.                 }
  167.                 return $Re;
  168.             };
  169.             foreach ($BaseInfos->ToNormalizedArray() as $Key => $BaseInfo) {
  170.                 $Name $SetName($Key);
  171.                 switch ($Key) {
  172.                     case 'postal_code':
  173.                         $this->BaseInfo[$Name] = substr_replace($BaseInfo'-'30);
  174.                         break;
  175.                     case 'Pref':
  176.                         $Pref $BaseInfos->getPref();
  177.                         $this->BaseInfo[$Name] = $Pref->getName() ;
  178.                         break;
  179.                     case 'phone_number';
  180.                         $this->BaseInfo[$Name] = $this->GetPhoneNumber($BaseInfo,false) ;
  181.                         $this->BaseInfo['Tel'] = $BaseInfo;
  182.                         break;
  183.                     case 'fax_number';
  184.                         $this->BaseInfo[$Name] = $this->GetPhoneNumber($BaseInfo,false) ;
  185.                         $this->BaseInfo['Fax'] = $BaseInfo;
  186.                         break;
  187.                     case 'delivery_free_amount':
  188.                         $this->BaseInfo['delivery_free_amounte'] = number_format((int)$BaseInfo);
  189.                         $this->BaseInfo[$Name] = number_format((int)$BaseInfo);
  190.                         break;
  191.                     default:
  192.                         $this->BaseInfo[$Name] = $BaseInfo;
  193.                         break;
  194.                 }
  195.             }
  196.         }
  197.         if (!$Param) {
  198.             return $this->BaseInfo;
  199.         }
  200.         return $this->BaseInfo[$Param] ?? '' ;
  201.     }
  202.     /**
  203.      * ルーティンファイルを書き込む
  204.      * @param $Yml str YMLファイル名
  205.      * @param $Add array 書き込む配列
  206.      * @param $flg boolean true 追加 false 上書き
  207.      * @param $Path str パス
  208.      * @return Array
  209.      */
  210.     public function RouteYml(array $Data$Yaml self::RouteingFilename)
  211.     {
  212.         $Path $this->RouteingYamlPath;
  213.         $Path .= $Yaml;
  214.         $Yml '#' date('Ymd') . ' ' $Yaml ' RouteYml ' PHP_EOL;
  215.         $Yml .= Yaml::dump($Data);
  216.         $fp fopen($Path'w');
  217.         fwrite($fp$Yml);
  218.         fclose($fp);
  219.     }
  220.     /**
  221.      * Twig\Environment のセット
  222.      * @param Twig $Twig
  223.      */
  224.     public function SetTwig(Twig $Twig)
  225.     {
  226.         $this->Twig $Twig;
  227.         return $this;
  228.     }
  229.     /**
  230.      * Twig\Environment のゲット
  231.      *
  232.      * @return Twig
  233.      */
  234.     public function GetTwig()
  235.     {
  236.         return $this->Twig;
  237.     }
  238.     /**
  239.      * ページレイアウトの設定
  240.      * @param $Nmae string URL の設定
  241.      * @param $isMobile
  242.      * @param $MetaTags メタタグ array() Author Description Keyword Robots MetaTags
  243.      * @param $LayoutId int レイアウトIDの変更
  244.      *
  245.      */
  246.     public function SetPageLayout($Name$isMobile false$MetaTags = [], $LayoutId null)
  247.     {
  248.         $Globals $this->Twig->getGlobals();
  249.         if (empty($Globals['Page']) || is_null($Globals['Page']->getId())) {
  250.             $Page $this->GetPageByRoute($Name);
  251.         } else {
  252.             $Page $Globals['Page'];
  253.         }
  254.         if (count($MetaTags) > 0) {
  255.             #メタタグの設定
  256.             //Author
  257.             if ($Author $MetaTags['Author'] ?? null) {
  258.                 $Page->setAuthor($Author);
  259.             }
  260.             //Description
  261.             if ($Description $MetaTags['Description'] ?? null) {
  262.                 $Page->setDescription($Description);
  263.             }
  264.             //Keyword
  265.             if ($Keyword $MetaTags['Keyword'] ?? null) {
  266.                 $Page->setKeyword($Keyword);
  267.             }
  268.             //Robots
  269.             if ($Robots $MetaTags['Robots'] ?? null) {
  270.                 $Page->setMetaRobots($Robots);
  271.             }
  272.             #MetaTags
  273.             if ($MetaTagss $MetaTags['MetaTags'] ?? null) {
  274.                 $Page->setMetaTags($MetaTagss);
  275.             }
  276.         }
  277.         #ページレイアウト
  278.         /**
  279.          * @var PageLayout[] $Layouts
  280.          */
  281.         $Layouts $Page->getPageLayouts();
  282.         if (empty($LayoutId)) {
  283.             //
  284.             $LayoutId $Layouts[0]->getLayoutId() ?? Layout::DEFAULT_LAYOUT_UNDERLAYER_PAGE;
  285.             //
  286.             if ($isMobile) {
  287.                 //
  288.                 foreach ($Layouts as $pageLayout) {
  289.                     //
  290.                     if ($pageLayout->getDeviceTypeId() === DeviceType::DEVICE_TYPE_MB) {
  291.                         //
  292.                         $LayoutId $pageLayout->getLayoutId();
  293.                     }
  294.                 }
  295.             }
  296.         }
  297.         $em $this->Container->get('doctrine.orm.entity_manager');
  298.         $Layout $em->getRepository(Layout::class)->find($LayoutId);
  299.         $this->Twig->addGlobal('Layout'$Layout);
  300.         $this->Twig->addGlobal('Page'$Page);
  301.     }
  302.     /**
  303.      * ページレイアウトの設定
  304.      * Eccube\Repository\PageRepository
  305.      * GetPageByRoute のコピー
  306.      *
  307.      * @param $Nmae string URL の設定
  308.      * @return Page
  309.      */
  310.     protected function GetPageByRoute($Name)
  311.     {
  312.         /**
  313.          * @var EntityManager $em
  314.          */
  315.         $em $this->Container->get('doctrine.orm.entity_manager');
  316.         $Qb $em->createQueryBuilder();
  317.         $Page $Qb
  318.             ->select(['p''pl''l'])
  319.             ->from("Eccube\\Entity\\page"'p')
  320.             ->leftJoin('p.PageLayouts''pl')
  321.             ->leftJoin('pl.Layout''l')
  322.             ->where('p.url = :url')
  323.             ->setParameter('url'$Name)
  324.             ->getQuery()
  325.             ->useResultCache(true3600)
  326.             ->getSingleResult();
  327.         return $Page;
  328.     }
  329.     /**
  330.      * EC-CUBEの時間をセットする 通常EC-Cubeの時間はUTC
  331.      * 9時間引いたUTC
  332.      *
  333.      * @param $DataTime string 2016-10-18 16:19:02
  334.      * @param Flg boolean
  335.      *
  336.      * @return Flg=true UTC object
  337.      */
  338.     public function SetEcTime($DataTime null$Flg false)
  339.     {
  340.         $Data = new \DateTime($DataTime);
  341.         return $Flg $Data->modify('-9 hours') : $Data;
  342.     }
  343.     /**
  344.      * EC-CUBE URLのリダイレクト
  345.      *
  346.      *
  347.      * @param URL string
  348.      * @param param array()
  349.      *
  350.      */
  351.     public function Redirect($Url$Param = [])
  352.     {
  353.         $Router $this->Container->get('router');
  354.         $Rout $Router->generate($Url$Param);
  355.         return new RedirectResponse($Rout);
  356.         exit;
  357.     }
  358.     /**
  359.      * EC-CUBE URLのリダイレクト
  360.      *  shimfony のRedirectResponse ではリダイレクトしない場合がある
  361.      *
  362.      * @param URL string
  363.      * @param param array()
  364.      *
  365.      */
  366.     public function Redirect2($Url$Param = [])
  367.     {
  368.         $Router $this->Container->get('router');
  369.         $Rout $Router->generate($Url$Param);
  370.         header('Location: ' $Rout);
  371.         exit;
  372.     }
  373.     public function GetPhoneNumber($PhoneNumber$Flg=true)
  374.     {
  375.         $PhoneNumber str_replace(['-'], ''$PhoneNumber);
  376.         if (!$PhoneNumber) {
  377.             return  $Flg ? [null,null,null] : null;
  378.         }
  379.         $RePhon[2] = substr($PhoneNumber, -4);
  380.         $AreaCodes $this->GetYaml('PhoneNumber.yaml');
  381.         for ($i 5$i >= 2$i--) {
  382.             $Code substr($PhoneNumber0$i);
  383.             if (isset($AreaCodes[$Code])) {
  384.                 $RePhon[0] = $Code;
  385.                 break;
  386.             }
  387.         }
  388.         $Len1 strlen($PhoneNumber);
  389.         if (isset($RePhon[0])) {
  390.             $len2 strlen($RePhon[0]);
  391.             $RePhon[1] = substr($PhoneNumber$len2$Len1 $len2 4);
  392.         } else {
  393.             $RePhon[0] = substr($PhoneNumber0$Len1 8);
  394.             $RePhon[1] = substr($PhoneNumber$Len1 8,  4);
  395.         }
  396.         for ($i 0$i <= 2$i++) {
  397.             if (!isset($RePhon[$i])) {
  398.                 $RePhon[$i] = null;
  399.             }
  400.         }
  401.         return $Flg $RePhon $RePhon[0] .'-' .$RePhon[1] .'-' $RePhon[2];
  402.     }
  403.     /**
  404.      * 乱数を取得する
  405.      *
  406.      * @param int 桁数
  407.      * @return string  乱数
  408.      */
  409.     public static function GetRand($Num)
  410.     {
  411.         $ReRand '';
  412.         $Arr array_merge(range('a''z'), range('A''Z'), range(09));
  413.         for ($i 0$i $Num$i++) {
  414.             $ReRand .= $Arr[rand(0count($Arr) - 1)];
  415.         }
  416.         return $ReRand;
  417.     }
  418.     public function GetLayout($LayoutId$Page)
  419.     {
  420.         $em $this->Container->get('doctrine.orm.entity_manager');
  421.         $Layout $em->getRepository(Layout::class)->find($LayoutId);
  422.         $this->Container;
  423.         $T $Page->getPageLayouts();
  424.         //foreach ($Page->getPageLayouts() as $key =>$d){
  425.         //echo $ke;
  426.         //}
  427.         return $Layout;
  428.     }
  429.     /**
  430.      * LM の支払いIDで EC-Cubuno支払い先をGETする
  431.      *
  432.      * @param inr LN paymentId
  433.      *
  434.      * @return ID`が  NULLの場合 全ての配列を返す  array()
  435.      * @return ID が ある場合 名前を返す
  436.      */
  437.     public function GetLmPayment($Id null)
  438.     {
  439.         if (count($this->LmPayments) < 1) {
  440.             $em $this->Container->get('doctrine.orm.entity_manager');
  441.             $Payments $em->getRepository(Payment::class)->findAll();
  442.             $Map $this->GetYaml('PaymentMapping.yaml');
  443.             foreach ($Payments as $Payment) {
  444.                 if (!$LmId = ($Map[$Payment->getId()] ?? 0)) {
  445.                     continue;
  446.                 }
  447.                 $this->LmPayments[$LmId] = $Payment->getMethod();
  448.             }
  449.         }
  450.         return $Id $this->LmPayments[$Id] ?? NULL $this->LmPayments;
  451.     }
  452.     /**
  453.      *  オリジナルトークンを作成
  454.      *
  455.      * @param string $Cd トークン名
  456.      * @param string $name
  457.      * @param string $Value メッセージなど
  458.      *
  459.      * @param this
  460.      */
  461.     public function SetToken($Cd$Name 'token'$Value null)
  462.     {
  463.         $Token $this->Session->get(self::OliginalToken) ?? [];
  464.         $Token[$Cd][$Name] = $Value ?? md5($this->GetRand(8));
  465.         $this->Session->set(self::OliginalToken$Token);
  466.         return $this;
  467.     }
  468.     public function ResetToken($Cd$Name 'token'$Value null){
  469.         return $this->RemoveToken($Cd)
  470.                     ->SetToken($Cd,$Name,$Value)
  471.                     ->GetToken($Cd,$Name);
  472.     }
  473.     /**
  474.      *  オリジナルトークントークンを返す
  475.      *
  476.      * @param string $Cd
  477.      * @param string $Token
  478.      *
  479.      * @param string
  480.      */
  481.     public function GetToken($Cd$Name 'token')
  482.     {
  483.         $Data $this->Session->get(self::OliginalToken);
  484.         return $Data[$Cd][$Name] ?? null;
  485.     }
  486.     /**
  487.      *   オリジナルトークントークンをリセット
  488.      * @param string $Cd
  489.      *
  490.      * @param string
  491.      */
  492.     public function RemoveToken($Cd)
  493.     {
  494.         $Token $this->Session->get(self::OliginalToken);
  495.         Unset($Token[$Cd]);
  496.         $this->Session->set(self::OliginalToken,$Token);
  497.         return $this;
  498.     }
  499.     /**
  500.      * YAML からアンケートを作成する
  501.      * @param string $YAML
  502.      * @param string $Param
  503.      */
  504.     public function SetSurvey($Yaml 'survey.yaml'$Param self::Lm_Order_Option$Option null)
  505.     {
  506.         if (!$Option) {
  507.             $Option $this->GetLmOrderOption(self::Lm_Option_Survey);
  508.             #1 初期化
  509.             $this->InitializeLmOrderOption(self::Lm_Option_Survey);
  510.         }
  511.         $Html = function ($flg$Type$Title$Val$Parameter$Sub '') use ($Param$Option) {
  512.             if (!= $flg) {
  513.                 $Name "name=\"{$Param}[" self::Lm_Option_Survey "][{$Title}][{$Val['name']}]\"";
  514.             } else {
  515.                 $Name "name=\"{$Param}[" self::Lm_Option_Survey "][$Title]\"";
  516.             }
  517.             switch ($Type) {
  518.                 case 'select':
  519.                     $Re "<select {$Name} >";
  520.                     $Datas $Val['data'] ?? [];
  521.                     foreach ($Datas as $Data) {
  522.                         $Selected '';
  523.                         if ($Option) {
  524.                             $Selected $Data == ($Option[$Title][$Val['name']] ?? '') ? 'selected' '';
  525.                         }
  526.                         $Re .= "<option value=\"{$Data}\" {$Selected}>{$Data}</oprion>";
  527.                     }
  528.                     $Re .= '</select>';
  529.                     break;
  530.                 case 'for':
  531.                     $Name rtrim($Name'"') . '[]"';
  532.                     $Re '';
  533.                     $Unit $Parameter[$Val['name']]['unit'] ?? '';
  534.                     foreach ($Val['data'] as $Key => $Data) {
  535.                         $Da explode('-'$Data);
  536.                         $Re .= "<select {$Name}><option value=\"\"></oprion>";
  537.                         for ($i $Da[0]; $i <= $Da[1]; $i++) {
  538.                             $Selected '';
  539.                             if ($Option) {
  540.                                 $Selected $i == ($Option[$Title][$Val['name']][$Key] ?? '999') ? 'selected' '';
  541.                             }
  542.                             $Re .= "<option value=\"{$i}\" $Selected>{$i}</oprion>";
  543.                         }
  544.                         $Re .= "</select>" $Unit[$Key] ?? '';
  545.                     }
  546.                     break;
  547.                 case 'text':
  548.                     $Unit $Parameter[$Val['name']]['unit'] ?? '';
  549.                     $Value $Option[$Title][$Val['name']] ?? $Val['data'];
  550.                     $Re "<input type=\"text\" {$Name} value=\"{$Value}\">" $Unit;
  551.                     break;
  552.                 case 'radio';
  553.                     deffault:
  554.                     $Name rtrim($Name'"') . '[0]"';
  555.                     $Checked '';
  556.                     if ($Option) {
  557.                         $Checked $Val == ($Option[$Title][0] ?? '') ? 'checked="chekced"' '';
  558.                     }
  559.                     $Re "<label><input type=\"radio\" {$Name} value=\"{$Val}\" {$Checked}>{$Val}</label>";
  560.             }
  561.             if (== $flg) {
  562.                 $Re "<p>{$Re}{$Sub}</p>";
  563.             }
  564.             return $Re;
  565.         };
  566.         $Re '';
  567.         foreach ($this->GetYaml($Yaml) as $key => $Value) {
  568.             $Re .= "<div class=\"{$key}\"><p class =\"title\">{$Value['title']}</p>" PHP_EOL;
  569.             foreach ($Value['data'] as $Data) {
  570.                 $Sub '';
  571.                 if (is_array($Data)) {
  572.                     $Val key($Data);
  573.                     $Arr $Data[$Val];
  574.                     $Type $Arr['type'] ?? 'select';
  575.                     $Parameter $Value['parameter'] ?? '';
  576.                     $Sub $Html(1$Arr['type'], $key$Arr$Parameter);
  577.                 } else {
  578.                     $Val $Data;
  579.                 }
  580.                 $Type $Data['type'] ?? 'radio';
  581.                 $Parameter '';
  582.                 $Re .= $Html(0$Type$key$Val$Parameter$Sub);
  583.             }
  584.             foreach ($Value['span'] ?? [] as $span) {
  585.                 $Re .= "<span>{$span}</span>";
  586.             }
  587.             $Re .= '</div>' PHP_EOL;
  588.         }
  589.         return $Re;
  590.     }
  591.     /**
  592.      * 2022/03/15
  593.      * LM orede option を初期化する
  594.      * アマゾンぺがあるために コントローラーではなくここでセット
  595.      *         
  596.      */
  597.     public function InitializeLmOrderOption($Name null)
  598.     {
  599.         #1 初期化
  600.         if (is_null($Name)) {
  601.             $this->Session->set(self::Lm_Order_Option_Sessionnull);
  602.             return;
  603.         }
  604.         #2 $Name のみ
  605.         $Option $this->Session->Get(self::Lm_Order_Option_Session);
  606.         unset($Option[$Name]);
  607.         $this->Session->set(self::Lm_Order_Option_Session$Option);
  608.         return;
  609.     }
  610.     /**
  611.      * 2022/03/18
  612.      * LM orede option を初期化する
  613.      * アマゾンぺイがあるために コントローラーではなくここでセット
  614.      *         
  615.      */
  616.     public function SetInitiarizeLmOrederOption($OrderId)
  617.     {
  618.         $OptionOrderid $this->GetLmOrderOption(self::Lm_Option_OrderId);
  619.         switch (true) {
  620.             case is_null($OptionOrderid):
  621.             case $OptionOrderid != $OrderId:
  622.                 $Catalog $this->GetLmOrderOption(self::Lm_Option_Catalog);
  623.                 $this->InitializeLmOrderOption();
  624.                 $this->AddLmOrderOption(self::Lm_Option_Catalog$Catalog);
  625.                 $this->AddLmOrderOption(self::Lm_Option_OrderId$OrderId);
  626.             case $OptionOrderid == $OrderId:
  627.             default:
  628.                 ##
  629.                 break;
  630.         }
  631.         return;
  632.     }
  633.     /**
  634.      * 2022/03/15
  635.      * LM orede option トする
  636.      * Shopping でできたDATAをconfirmでせっと
  637.      * 貸出サンプルのカタログ同梱 sample_catalog
  638.      * アンケート
  639.      *
  640.      *
  641.      * アマゾンぺイがあるために コントローラーではなくここでセット
  642.      *         
  643.      */
  644.     public function RequestLmOrderOption()
  645.     {
  646.         #2022/03/15 kakeru Order OPtion の取得
  647.         if ($Datas $this->Request->get(self::Lm_Order_Option)) {
  648.             foreach ($Datas as $Name => $Data) {
  649.                 $this->AddLmOrderOption($Name$Data);
  650.             }
  651.         }
  652.     }
  653.     /**
  654.      * 2022/03/17
  655.      * LM orede option をセットする
  656.      * アマゾンぺイがあるために コントローラーではなくここでセット
  657.      *         
  658.      */
  659.     public function AddLmOrderOption($Name$Data)
  660.     {
  661.         #2022/03/15 kakeru Order OPtion の取得
  662.         #1 Dataの取得
  663.         $Option $this->Session->get(self::Lm_Order_Option_Session);
  664.         #2 設定
  665.         $Option[$Name] = $Data;
  666.         $this->Session->set(self::Lm_Order_Option_Session$Option);
  667.         //
  668.         $this->OrderOptionsService->addOrderOptions($Name$Data);
  669.     }
  670.     /**
  671.      * 2022/03/15
  672.      * LM orede option をセットする
  673.      * アマゾンぺイイがあるために コントローラーではなくここでセット
  674.      *         
  675.      */
  676.     public function GetLmOrderOption($Name null)
  677.     {
  678.         return $this->OrderOptionsService->getOrderOptions($Name) ?: $this->_GetLmOrderOption($Name);
  679.     }
  680.     protected function _GetLmOrderOption($Name null)
  681.     {
  682.         return $this->OrderOptionsService->_GetLmOrderOption($Name);
  683.     }
  684.     /**
  685.      * 確認画面にアンケートを表示する
  686.      * アンケートのDATaはバラバラなので ここで保存する
  687.      *
  688.      */
  689.     public function SetSurveyData()
  690.     {
  691.         $Servey $this->GetLmOrderOption(self::Lm_Option_Survey);
  692.         $Re = [];
  693.         foreach ($this->GetYaml('survey.yaml') as $key => $Value) {
  694.             $Text '';
  695.             if (isset($Servey[$key][0])) {
  696.                 $Re[] = $Value['title'];
  697.                 foreach ($Servey[$key] as $Name => $Data) {
  698.                     $Parameter $Value['parameter'][$Name] ?? '';
  699.                     $Unit $Parameter['unit'] ?? '';
  700.                     switch (true) {
  701.                         case is_array($Data):
  702.                             foreach ($Data as $i => $Da) {
  703.                                 $Text .= $Da . ($Unit[$i] ?? '') . ' ';
  704.                             }
  705.                             break;
  706.                         default:
  707.                             $Text .= $Data $Unit ' ';
  708.                             break;
  709.                     }
  710.                 }
  711.                 $Re[] = $Text;
  712.             }
  713.         }
  714.         $this->AddLmOrderOption(self::Lm_Option_Survey_Data$Re);
  715.         return $Re;
  716.     }
  717.     /**
  718.      * デバイスの判定
  719.      *
  720.      * @param $strict
  721.      * @return string
  722.      *  SP ・・・ スマホ
  723.      *  PC ・・・ パソコン
  724.      *  TB ・・・ タブレット ※パラメータ $strict = true 時のみ
  725.      */
  726.     public function GetDevice($strict falseMobileDetector $mobileDetector null)
  727.     {
  728.         //
  729.         if ($mobileDetector === null) {
  730.             $mobileDetector $this->MobileDetector;
  731.         }
  732.         //
  733.         if ($strict && $mobileDetector->isTablet()) {
  734.             // タブレット
  735.             return 'TB';
  736.         } else if ($mobileDetector->isMobile()) {
  737.             // スマホ
  738.             // $strict = false のとき、タブレットも含む。
  739.             return 'SP';
  740.         } else {
  741.             // PC
  742.             return 'PC';
  743.         }
  744.     }
  745.     /**
  746.      * 会員を取得する
  747.      *
  748.      */
  749.     public function getUser()
  750.     {
  751.         if (null === $token $this->TokenStorage->getToken()) {
  752.             return;
  753.         }
  754.         if (!is_object($user $token->getUser())) {
  755.             // e.g. anonymous authentication
  756.             return;
  757.         }
  758.         return $user;
  759.     }
  760.     /**
  761.      * メッセージのbaseinfo config Messegeを 変換する
  762.      * 例 
  763.      *  {{BaseInfo.shop_name}}
  764.      *  {{Config.Payment_Charge_free}}
  765.      *  {{message.common.ResetPassward_messeg02}} or {{trans.common.ResetPassward_messeg02}}
  766.      */
  767.     public function BaseInfo($Text){
  768.         if (preg_match('/^[A-Za-z0-9_]+$/',$Text)){
  769.             return $this->GetBaseInfo($Text);
  770.         }
  771.         while(preg_match("/\{\{(.+?)\}\}/",$Text,$Param)){
  772.             $Pa =explode('.',$Param[1]);
  773.             $Parameter trim($Pa[1]);
  774.             $Value='';
  775.             switch (true) {
  776.                 case preg_match('/BaseInfo\./i',$Param[1]):
  777.                     $Value $this->GetBaseInfo($Parameter);
  778.                     break;
  779.                 case preg_match('/Config\./i'$Param[1]):
  780.                     $Value $this->GetConfig($Parameter);
  781.                     break;
  782.                 case preg_match('/Message\.|trans\./i'$Param[1]):
  783.                     $Parameter preg_replace('/message\.|trans\./i','',$Param[1]);
  784.                     $Value trans($Parameter) ?? '' ;
  785.                     break;
  786.                 case preg_match('/url\./i'$Param[1]):
  787.                     $Value $this->Router->generate($Parameter);
  788.                     break;
  789.                 case preg_match('/Other\./i'$Param[1]):
  790.                     switch ($Parameter){
  791.                         case 'LargeDiscount':
  792.                             $Value $this->BaseInfoLageDiscount();
  793.                         break;
  794.                         case 'DeliveryFree';
  795.                             $Value $this->BaseInfoDeliveryFree();
  796.                         break;
  797.                         case 'Charge':
  798.                             $Value $this->BaseInfoCharge();
  799.                         break;
  800.                     }
  801.                     break;
  802.                  default:
  803.                     $Value $Parameter;
  804.                     break;
  805.             }
  806.             if (!$Value){$Value=$Parameter;}
  807.             $Text str_replace($Param[0],$Value,$Text);
  808.         }
  809.         return $Text;
  810.     }
  811.     /**
  812.      * 大口割引のDATAをもとに文字化する
  813.      *  
  814.      * @return string
  815.      */
  816.     protected function BaseInfoLageDiscount(){
  817.         $Re= [];
  818.         $LargeDiscount $this->GetConfig('LargeDiscount');
  819.         foreach ($LargeDiscount as $Discount){
  820.             $Re[] =$Discount['more']/10000 .'万円以上で'.$Discount['discount'].'%';
  821.         }
  822.         return implode('、',$Re);
  823.     }
  824.     /**
  825.      * 全国一律 東京の運賃を算出
  826.      *
  827.      */
  828.     protected function BaseInfoDeliveryFree(){
  829.         $DeliveryFee $this->DeliveryFeeRepository->find(13);
  830.         return number_format($DeliveryFee->getFee());
  831.     }
  832.     protected function BaseInfoCharge(){
  833.         $em $this->Container->get('doctrine.orm.entity_manager');
  834.         $Payment $em->getRepository(Payment::class)->find(4);
  835.         return number_format($Payment->getCharge());
  836.     }
  837.     public function getSpOtherCategoryPulldownMap()
  838.     {
  839.         return array(
  840.             'item' => array(
  841.                 'group_label' => '商品で探す',
  842.                 'map' => array(
  843.                     "/polo/"                => 'ポロシャツ',
  844.                     "/shirt/"            => 'シャツ',
  845.                     "/tshirt/"            => 'Tシャツ',
  846.                     "/staff/"            => 'ジャンパー',
  847.                     "/vest/"                => 'ベスト',
  848.                     "/warm/"                => '防寒服',
  849.                     "/sweat/"            => 'トレーナー',
  850.                     "/pants/"            => 'パンツ',
  851.                     "/food-uniform/cook-coat/"            => 'コックコート',
  852.                     "/apron/"            => 'エプロン',
  853.                     "/shirt/aloha/"        => 'アロハシャツ',
  854.                     "/happi/"            => 'はっぴ',
  855.                     "/cap/"                => 'キャップ',
  856.                     "/overall/"            => 'つなぎ',
  857.                     "/anzengutsu/"        => '安全靴',
  858.                     "/towel/"            => 'タオル',
  859.                     "/scrub/"            => 'スクラブ',
  860.                     "/bag/"                => 'バッグ'
  861.                 )
  862.             ),
  863.             'use' => array(
  864.                 'group_label' => '目的・用途で探す',
  865.                 'map' => array(
  866.                     "/kucho-fuku/"            => '空調服®・エアークラフト',
  867.                     "/work/"                => '作業服',
  868.                     "/jimufuku/"            => '事務服',
  869.                     "/hakui/"                => '医療白衣',
  870.                     "/food-uniform/"        => '飲食店',
  871.                     "/esthe-uniform/"    => 'エステ',
  872.                     "/election-item/"    => '選挙用品',
  873.                     "/care-wear/"        => '介護服',
  874.                     "/patrol/"            => '防犯パトロール',
  875.                     "/food-uniform/formal-vest/"    => 'フォーマル',
  876.                 )
  877.             )
  878.         );
  879.     }
  880.     /**
  881.      * @param $src
  882.      * @param $attrname
  883.      * @param array $dst
  884.      * @return string
  885.      */
  886.     public static function addAttrRegexp($src$attrname, array $dst)
  887.     {
  888.         $attrs preg_replace_callback("/{$attrname}=\"([^\"]+)\"/", function ($matches) {
  889.             return $matches[1];
  890.         }, $src);
  891.         $attrs explode(' '$attrs);
  892.         $attrs $dst $attrs;
  893.         $attrs implode(' '$attrs);
  894.         return $attrs;
  895.     }
  896.     public function GetJunctionMode(){
  897.         return $this->Session->get(self::Session_Junction_Mode);
  898.     }
  899.     public function GetExclusionControl($Type$Message null)
  900.     {
  901.         $Message $Message ?? $this->SetExclusionControl($Type1);
  902.         return ['errid' => 'message' => $Message ,'class_id'=>,'add_lines' => null];
  903.     }
  904.     /**
  905.      * カート排他制御
  906.      *
  907.      */
  908.     public function SetExclusionControl($Type ,$Flg)
  909.     {
  910.         $TypeName01 $this->SetTypeName($this->LmHelper->GetCartType());
  911.         $TypeName02 $this->SetTypeName($Type);
  912.         //$Url = $this->Router->generate('cart');
  913.         $Message trans('front.ExclusionControl.message0' $Flg);
  914.         $Message str_replace('@TypeName01'$TypeName01$Message);
  915.         $Message str_replace('@TypeName02'$TypeName02$Message);
  916.         //$Message = str_replace('@URL', $Url, $Message);
  917.         return $Message;
  918.     }
  919.     protected function SetTypeName($Type)
  920.     {
  921.         switch ($Type) {
  922.             case 3#CartService::CartTypeSample:
  923.                 $TypeName trans('front.cart_Sample');
  924.                 break;
  925.             case 4:  #CartService::CartTypeCatalog:
  926.                 $TypeName trans('front.cart_catalog');
  927.                 break;
  928.             case 101:
  929.                 $TypeName trans('front.Cart.Repeat');
  930.                 break;
  931.             default:
  932.                 $TypeName trans('front.ExclusionControl.message03');
  933.                 break;
  934.         }
  935.         return $TypeName;
  936.     }
  937.     /**
  938.      * 配列に一個でもNULLか空有白 がある
  939.      * @param array
  940.      *
  941.      * @return boolean ある true ない false
  942.      */
  943.     public function IsNull($Data){
  944.        if(in_array(null$Data,true)){return true;};
  945.        return  in_array(''$Data,true);
  946.     }
  947.     /**
  948.      * app/Customize/Twig/Extension/ServiceExtension.php から移動
  949.      *
  950.      */
  951.     public function GetPagename($UrlName)
  952.     {
  953.        $MetaTags $this->GetYaml(self::MetaTagData);
  954.        return  $MetaTags[$UrlName]['PageName'];
  955.     }
  956.     public function generateSetSiteTypeValueForCriteoReturn()
  957.     {
  958.         if ($this->MobileDetector->isTablet()) {
  959.             return 't';
  960.         } else if ($this->MobileDetector->isMobile()) {
  961.             return 'm';
  962.         } else {
  963.             return 'd';
  964.         }
  965.     }
  966.     public function get_page_type ($route null) {
  967.         //
  968.         if (empty($route)) {
  969.             $route $this->Request->get('_route');
  970.         }
  971.         $yahoo_retargeting_page_type '';
  972.         // PC
  973.         switch (true) {
  974.             case $route === 'homepage':
  975.                 // トップページ
  976.                 $yahoo_retargeting_page_type 'home';
  977.                 break;
  978.             case $route === 'page/main-category':
  979.             case $route === 'page/sub-category':
  980.                 // 商品一覧ページ - 親カテ・子カテ・コラム
  981.                 $yahoo_retargeting_page_type 'category';
  982.                 break;
  983.             case $route === 'item_searchlist':
  984.                 // 検索結果ページ
  985.                 $yahoo_retargeting_page_type 'search';
  986.                 break;
  987.             case $route === 'item/detail':
  988.                 // 商品詳細ページ
  989.                 $yahoo_retargeting_page_type 'detail';
  990.                 break;
  991.             case $route === 'cart':
  992.             case $route === 'shopping_login':
  993.             case $route === 'shopping':
  994.             case $route === 'amazon_pay_shopping':
  995.                 // 購入
  996.                 // カートページ
  997.                 $yahoo_retargeting_page_type 'cart';
  998.                 break;
  999.             case $route === 'shopping_confirm':
  1000.             case $route === 'amazon_pay_shopping_confirm':
  1001.                 // 購入
  1002.                 // 購入、申込ページ(コンバージョン直前)
  1003.                 $yahoo_retargeting_page_type 'conversionintent';
  1004.                 break;
  1005.             case $route === 'shopping_complete':
  1006.                 // 購入
  1007.                 // コンバージョンページ
  1008.                 $yahoo_retargeting_page_type 'conversion';
  1009.                 break;
  1010.         }
  1011.         return $yahoo_retargeting_page_type;
  1012.     }
  1013.     public function get_yahoo_retargeting_page_type ($route null) {
  1014.         //
  1015.         return $this->get_page_type($route);
  1016.     }
  1017.     public function get_google_retargeting_item($goodsId$google_business_vertical 'retail')
  1018.     {
  1019.         try {
  1020.             return GoodsWithRelated::getFeedGoodsByIdForGDN($goodsId$google_business_vertical);
  1021.         } catch (\Exception $e) {
  1022.             return null;
  1023.         }
  1024.     }
  1025.     public function get_yahoo_retargeting_item($goodsId$quantity 1)
  1026.     {
  1027.         try {
  1028.             return GoodsWithRelated::getFeedGoodsByIdForYDN($goodsId$quantity);
  1029.         } catch (\Exception $e) {
  1030.             return null;
  1031.         }
  1032.     }
  1033.     public function EigyoubiCalendar()
  1034.     {
  1035.         $cal="";
  1036.         // Google PSI対応
  1037.         // ファイル・キャッシュ化
  1038.         // / $s3 = new FileStoreService(env('S3_LM_DOC'), self::TOP_DIR);
  1039.         // / $Filename = "1day4cal.inc";
  1040.         // / $cal = $s3->getObject($Filename);
  1041.         if (file_exists($filename 'files/top/1day4cal.inc')) {
  1042.             //
  1043.             $cal file_get_contents($filename);
  1044.         }
  1045.         //
  1046.         return $cal;
  1047.     }
  1048.     /**
  1049.      * @param Cart[] $carts
  1050.      * @return int
  1051.      */
  1052.     public function calculateTotalQuantityForCarts(array $carts = [])
  1053.     {
  1054.         //
  1055.         $totalQuantity 0;
  1056.         //
  1057.         foreach ($carts as $cart) {
  1058.             //
  1059.             $totalQuantity += $cart->getQuantity();
  1060.         }
  1061.         //
  1062.         return $totalQuantity;
  1063.     }
  1064.     /**
  1065.      * @param Order $order
  1066.      * @return int
  1067.      */
  1068.     public function calculateTotalQuantityForOrder(Order $order)
  1069.     {
  1070.         //
  1071.         $totalQuantity 0;
  1072.         //
  1073.         foreach ($order->getProductOrderItems() as $orderItem) {
  1074.             //
  1075.             $totalQuantity += $orderItem->getQuantity();
  1076.         }
  1077.         //
  1078.         return $totalQuantity;
  1079.     }
  1080.     public function getSendScheduleDate($orderHeader, &$message null)
  1081.     {
  1082.         if ($oh OrderHeader::factory($orderHeader)) {
  1083.             return (new NoukiEngine())->calculate($ohnull$message);
  1084.         }
  1085.         return null;
  1086.     }
  1087. }