vendor/lm/engine-ec/src/Entity/CategoryWithRelated.php line 417

Open in your IDE?
  1. <?php
  2. namespace Lm\Engine\EC\Entity;
  3. use Lm\Service\Cache\CacheService;
  4. use Lm\Service\Db\SqlService;
  5. class CategoryWithRelated extends CategoryExtended
  6. {
  7.     const ITEMS_PER_PAGE 50;
  8.     const no_display_db_category_list = [
  9.         'work',
  10.         // 'hakui',
  11.         // 'food-uniform',
  12.         // 'esthe-uniform',
  13.         // 'care-wear'
  14.     ];
  15.     /**
  16.      * @var string[]
  17.      */
  18.     protected $metaTags;
  19.     /**
  20.      * @var string
  21.      */
  22.     protected $title;
  23.     /**
  24.      * @var string
  25.      */
  26.     protected $titleForItemList;
  27.     /**
  28.      * @var string
  29.      */
  30.     protected $titleContent;
  31.     /**
  32.      * @var string
  33.      */
  34.     protected $h1Content;
  35.     /**
  36.      * @var string
  37.      */
  38.     protected $mainH1Content;
  39.     /**
  40.      * @var string
  41.      */
  42.     protected $categoryH1Content;
  43.     /**
  44.      * @var string
  45.      */
  46.     protected $h2Content;
  47.     /**
  48.      * @var string
  49.      */
  50.     protected $mainH2Content;
  51.     /**
  52.      * @var string
  53.      */
  54.     protected $categoryH2Content;
  55.     /**
  56.      * @var string[]
  57.      */
  58.     protected $contentsBlockMap;
  59.     /**
  60.      * @var string[]
  61.      */
  62.     protected $topContentsList;
  63.     /**
  64.      * @var string[]
  65.      */
  66.     protected $bottomContentsList;
  67.     /**
  68.      * @var array
  69.      */
  70.     protected $breadcrumbs;
  71.     /**
  72.      * @var array
  73.      */
  74.     protected $columnList;
  75.     /**
  76.      * @var string
  77.      */
  78.     protected $upperColumn;
  79.     /**
  80.      * @var string
  81.      */
  82.     protected $comment;
  83.     /**
  84.      * @var string
  85.      */
  86.     protected $smallFooterContent;
  87.     /**
  88.      * @var string
  89.      */
  90.     protected $largeFooterContent;
  91.     /**
  92.      * @var array
  93.      */
  94.     protected $categoryTopInfo;
  95.     /**
  96.      * @var array
  97.      */
  98.     protected $itemList;
  99.     /**
  100.      * @var int
  101.      */
  102.     protected $itemListCount;
  103.     /**
  104.      * @var CategoryWithRelated
  105.      */
  106.     protected $canonicalMainCategory;
  107.     /**
  108.      * @var array
  109.      */
  110.     protected $canonicalSubCategoryList;
  111.     /**
  112.      * @var array
  113.      */
  114.     protected $subCategoryList;
  115.     public function getMetaTags()
  116.     {
  117.         return self::compute($this->metaTags, function () {
  118.             //
  119.             return [
  120.                 'title' => $this->getTitleTag(),
  121.                 'description' => $this->getMetaDescription(),
  122.                 'keywords' => $this->getMetaKeywords(),
  123.             ];
  124.         });
  125.     }
  126.     public function getTitleTag()
  127.     {
  128.         $title "";
  129.         if ($this->isMainCategory()) {
  130.             if ($title $this->getMainTitleTag()) {
  131.                 return $title;
  132.             } else if ($title $this->getMainCategoryName()) {
  133.                 return "{$title}の通販|ユニフォームタウン";
  134.             }
  135.         } else if ($this->isSubCategory()) {
  136.             if ($title $this->getCategoryTitleTag()) {
  137.                 return $title;
  138.             } else if (($title $this->getCategoryName()) === '全商品') {
  139.                 return "{$this->getMainCategoryname()}{$title})の通販|ユニフォームタウン";
  140.             } else if ($title $this->getCategoryname()) {
  141.                 return "{$title}の通販|ユニフォームタウン";
  142.             }
  143.         }
  144.         return $title;
  145.     }
  146.     public function getMetaDescription()
  147.     {
  148.         $description "";
  149.         if ($this->isMainCategory()) {
  150.             if ($description $this->getMainDescriptionTag()) {
  151.                 return $description;
  152.             } else if ($description $this->getMainCategoryName()) {
  153.                 // TODO: マジックナンバー: 9900
  154.                 return "{$description}について。ユニフォームタウン【公式サイト】は、1ヶ月貸出サンプルや自動見積りが可能な総合ユニフォームの通販専門ショップです。商品代金9900円(税込)以上で送料・代引手数料0円キャンペーン実施中!";
  155.             }
  156.         } else if ($this->isSubCategory()) {
  157.             if ($description $this->getCategoryDescriptionTag()) {
  158.                 return $description;
  159.             } else if ($description $this->getMainCategoryname()) {
  160.                 return "{$description}の商品一覧。ユニフォームタウン【公式サイト】は、1ヶ月貸出サンプルや自動見積りが可能な総合ユニフォームの通販専門ショップです。商品代金9900円(税込)以上で送料・代引手数料0円キャンペーン実施中!";
  161.             }
  162.         }
  163.         return $description;
  164.     }
  165.     public function getMetaKeywords()
  166.     {
  167.         $keywords "";
  168.         if ($this->isMainCategory()) {
  169.             if ($keywords $this->getMainKeywordTag()) {
  170.                 return $keywords;
  171.             }
  172.         } else if ($this->isSubCategory()) {
  173.             if ($keywords $this->getCategoryKeywordTag()) {
  174.                 return $keywords;
  175.             }
  176.         }
  177.         return $keywords;
  178.     }
  179.     public function getTitle()
  180.     {
  181.         return self::compute($this->title, function () {
  182.             //
  183.             return $this->isMainCategory() ? $this->getMainCategoryName() : $this->getCategoryName();
  184.         });
  185.     }
  186.     public function getTitleForItemList()
  187.     {
  188.         return self::compute($this->titleForItemList, function () {
  189.             //
  190.             return $this->getH2Content();
  191.         });
  192.     }
  193.     public function getTitleContent()
  194.     {
  195.         return self::compute($this->titleContent, function () {
  196.             //
  197.             if ($this->isMainCategory()) {
  198.                 if ($this->isMobile()) {
  199.                     $content $this->getMainTitleSpText();
  200.                 }
  201.                 if (empty($content)) {
  202.                     $content $this->getMainTitleText();
  203.                 }
  204.             } else {
  205.                 if ($this->isMobile()) {
  206.                     $content $this->getCategoryTitleSpText();
  207.                 }
  208.                 if (empty($content)) {
  209.                     $content $this->getCategoryTitleText();
  210.                 }
  211.             }
  212.             //
  213.             return $content;
  214.         });
  215.     }
  216.     public function getH1Content()
  217.     {
  218.         return self::compute($this->h1Content, function () {
  219.             //
  220.             return $this->isMainCategory() ? $this->getmainH1Content() : $this->getCategoryH1Content();
  221.         });
  222.     }
  223.     public function getMainH1Content()
  224.     {
  225.         return self::compute($this->mainH1Content, function () {
  226.             //
  227.             return $this->getMainH2Tag() ?: $this->getMainCategoryName();
  228.         });
  229.     }
  230.     public function getCategoryH1Content()
  231.     {
  232.         return self::compute($this->categoryH1Content, function () {
  233.             //
  234.             return $this->getCategoryH2Tag() ?: $this->getCategoryName();
  235.         });
  236.     }
  237.     public function getH2Content()
  238.     {
  239.         return self::compute($this->h2Content, function () {
  240.             //
  241.             return $this->isMainCategory() ? $this->getmainH2Content() : $this->getCategoryH2Content();
  242.         });
  243.     }
  244.     public function getMainH2Content()
  245.     {
  246.         return self::compute($this->mainH2Content, function () {
  247.             //
  248.             return $this->getMainH3Tag() ?: $this->getMainCategoryName();
  249.         });
  250.     }
  251.     public function getCategoryH2Content()
  252.     {
  253.         return self::compute($this->categoryH2Content, function () {
  254.             //
  255.             return $this->getCategoryH3Tag() ?: $this->getCategoryName();
  256.         });
  257.     }
  258.     public function getTopContentsList()
  259.     {
  260.         return self::compute($this->topContentsList, function () {
  261.             //
  262.             $indexList = [
  263.                 '' => 1,
  264.                 => 2,
  265.                 => 3,
  266.                 => 4,
  267.                 => 5,
  268.                 => 6,
  269.                 => 7,
  270.                 => 8,
  271.                 => 9,
  272.                 10 => 10,
  273.                 11 => 11,
  274.                 12 => 12
  275.             ];
  276.             $number 2;
  277.             //
  278.             return $this->_getContentsList($number$indexList);
  279.         });
  280.     }
  281.     /**
  282.      * @var string
  283.      */
  284.     public function getBottomContentsList()
  285.     {
  286.         return self::compute($this->bottomContentsList, function () {
  287.             //
  288.             $indexList = [''];
  289.             $number 3;
  290.             //
  291.             return $this->_getContentsList($number$indexList);
  292.         });
  293.     }
  294.     public function getUrl2Content($number)
  295.     {
  296.         return $this->getCached(function () use ($number) {
  297.             //
  298.             $content null;
  299.             //
  300.             $indexList = [
  301.                 => '',
  302.                 => 2,
  303.                 => 3,
  304.                 => 4,
  305.                 => 5,
  306.                 => 6,
  307.                 => 7,
  308.                 => 8,
  309.                 => 9,
  310.                 10 => 10,
  311.                 11 => 11,
  312.                 12 => 12,
  313.             ];
  314.             //
  315.             $prefix $this->isMainCategory() ? 'main_category' 'category';
  316.             $index $indexList[$number];
  317.             //
  318.             if ($this->isMobile()) {
  319.                 $content $this->data["{$prefix}_url2_sp_content{$index}"];
  320.             }
  321.             //
  322.             if (empty($content)) {
  323.                 $content $this->data["{$prefix}_url2_content{$index}"];
  324.             }
  325.             //
  326.             return $content;
  327.         }, nullCacheService::CACHE_INSTANCE);
  328.     }
  329.     protected function _getContentsList($number$indexList$withContentBlock true)
  330.     {
  331.         //
  332.         $contentsList = [];
  333.         $prefix $this->isMainCategory() ? 'main_category' 'category';
  334.         $device $this->isMobile() ? '_sp' '';
  335.         // $number: 2 = 上部差込
  336.         if ($number === && $withContentBlock) {
  337.             //
  338.             $contentsBlockMap $this->getContentsBlockMap();
  339.         }
  340.         //
  341.         foreach ($indexList as $key => $index) {
  342.             // コンテンツブロック
  343.             if ((isset($contentsBlockMap[$key]) && $contents =  $contentsBlockMap[$key])
  344.              || (isset($contentsBlockMap[$index]) && $contents =  $contentsBlockMap[$index])) {
  345.                 //
  346.                 $contentsList array_merge($contentsList$contents);
  347.             }
  348.             // 差込
  349.             if ((isset($this->data["{$prefix}_url{$number}{$device}_content{$key}"]) && $contents $this->data["{$prefix}_url{$number}{$device}_content{$key}"])
  350.              || (isset($this->data["{$prefix}_url{$number}{$device}_content{$index}"]) && $contents $this->data["{$prefix}_url{$number}{$device}_content{$index}"])) {
  351.                 $contentsList[] = $contents;
  352.             }
  353.         }
  354.         //
  355.         return $contentsList;
  356.     }
  357.     public function getContentsBlockMap()
  358.     {
  359.         return self::compute($this->contentsBlockMap, function () {
  360.             //
  361.             return $this->getContentsBlockMapById($this->getMainCategoryId(), $this->getCategoryId());
  362.         });
  363.     }
  364.     public static function getContentsBlockMapById($main_category_id$category_id null)
  365.     {
  366.         return (new CategoryContentsBlockMapModel())
  367.             ->getContentsBlockMapById($main_category_id$category_id)
  368.         ;
  369.     }
  370.     /**
  371.      * @return CategoryWithRelated
  372.      * @throws \Exception
  373.      */
  374.     public function getCanonicalMainCategory()
  375.     {
  376.         //
  377.         return self::compute($this->canonicalMainCategory, function () {
  378.             //
  379.             if ($this->hasMainCategoryMainCategory()) {
  380.                 //
  381.                 return new CategoryWithRelated($this->getMainCategorymainCategoryWebname());
  382.             } else {
  383.                 //
  384.                 return $this;
  385.             }
  386.         });
  387.     }
  388.     public function getCanonicalMainCategoryWebname()
  389.     {
  390.         //
  391.         return $this->getCached(function () {
  392.             //
  393.             $webnames = [];
  394.             //
  395.             if ($webname $this->getMainCategoryMainCategoryWebname()) {
  396.                 $webnames[] = $webname;
  397.             }
  398.             //
  399.             if ($webname $this->getMainCategoryWebname()) {
  400.                 $webnames[] = $webname;
  401.             }
  402.             //
  403.             $result $webnames;
  404.             $result implode('/'$result);
  405.             //
  406.             return $result;
  407.         }, nullCacheService::CACHE_INSTANCE);
  408.     }
  409.     public function getCanonicalWebname()
  410.     {
  411.         //
  412.         return $this->getCached(function () {
  413.             //
  414.             $webnames = [];
  415.             //
  416.             if ($webname $this->getCanonicalMainCategoryWebname()) {
  417.                 $webnames[] = $webname;
  418.             }
  419.             //
  420.             if ($this->isSubCategory() && $webname $this->getCategoryWebname()) {
  421.                     $webnames[] = $webname;
  422.             }
  423.             //
  424.             $result $webnames;
  425.             $result implode('/'$result);
  426.             //
  427.             return $result;
  428.         });
  429.     }
  430.     public function getCanonicalSubCategoryList()
  431.     {
  432.         //
  433.         return self::compute($this->canonicalSubCategoryList, function () {
  434.             //
  435.             $mainCategoryId $this->getCanonicalMainCategory()->getMainCategoryId();
  436.             //
  437.             return self::getSubCategoryListByMainCategoryId($mainCategoryId);
  438.         });
  439.     }
  440.     public function getSubCategoryList()
  441.     {
  442.         //
  443.         return self::compute($this->subCategoryList, function () {
  444.             //
  445.             $mainCategoryId $this->getMainCategoryId();
  446.             //
  447.             return self::getSubCategoryListByMainCategoryId($mainCategoryId);
  448.         });
  449.     }
  450.     public static function getSubCategoryListByMainCategoryId($mainCategoryId)
  451.     {
  452.         $strSql "SELECT ct.*, ru.*
  453.                     FROM (
  454.                         SELECT category_id, category_name, category_display, category_main_category, category_status, 0 AS leftmenu_flg, category_cdate, category_udate, null AS leftmenu_category_id, null AS leftmenu_category_bgcolor,
  455.                         category_url, category_50on, category_50on_display, category_comment, category_url2, category_url2_content, category_url3_content, category_category, category_main,
  456.                         category_title_tag, category_description_tag, category_keyword_tag, category_h1_tag, category_webname, category_menuname, category_pagebottom, category_bottomlink,
  457.                         category_breadcrumb, category_footer_link_name, category_footer_link_url, category_header_text, category_title_text, category_pageviews, category_is_hinban_link, category_hinban_link_bgcolor,
  458.                         COUNT(DISTINCT goods_id) AS `cnt`
  459.                         FROM category_table
  460.                         LEFT JOIN goods_category_table ON category_id = gc_category
  461.                         LEFT JOIN goods_table ON goods_id = gc_goods AND goods_ddate IS NULL AND goods_status = 1
  462.                         WHERE category_main_category = :main_category_id AND category_status = 1
  463.                         GROUP BY category_id
  464.                         UNION SELECT null, leftmenu_category_name, leftmenu_category_display, leftmenu_category_main_category, leftmenu_category_status, 1 AS leftmenu_flg, leftmenu_category_cdate, leftmenu_category_udate, leftmenu_category_id, leftmenu_category_bgcolor,
  465.                         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
  466.                         null AS `cnt`
  467.                         FROM leftmenu_category_table
  468.                         WHERE leftmenu_category_main_category = :main_category_id AND leftmenu_category_status = 1
  469.                     ) AS ct
  470.                     INNER JOIN main_category_table AS mc ON main_category_id = category_main_category
  471.                     LEFT JOIN (
  472.                         SELECT ru_uri_before, ru_uri_after
  473.                         FROM redirect_url_table
  474.                         WHERE ru_type = '0'
  475.                         GROUP BY ru_uri_before
  476.                     ) AS ru ON ru_uri_before = CONCAT('/', main_category_webname, '/', category_webname, '/')
  477.                     order by isnull( category_display ), category_display, isnull( category_50on_display ), cast( category_50on as binary ), category_id desc";
  478.         $rs = (new SqlService())
  479.             ->Sql($strSql)
  480.             ->Param('main_category_id'$mainCategoryId)
  481.             ->FetchAll()
  482.         ;
  483.         $subCategoryList = array();
  484.         if (isset($rs)) {
  485.             foreach ($rs AS $row) {
  486.                 if ($row['category_id'] == '') {
  487.                     $subCategoryList['leftmenu' $row['leftmenu_category_id']] = $row;
  488.                 } else {
  489.                     $subCategoryList[$row['category_id']] = $row;
  490.                 }
  491.             }
  492.         }
  493.         return $subCategoryList;
  494.     }
  495.     /**
  496.      * @param $ct
  497.      * @param $mc
  498.      * @param $mcMc
  499.      * @return array
  500.      */
  501.     public function getBreadCrumbs()
  502.     {
  503.         return self::compute($this->breadcrumbs, function () {
  504.             //
  505.             $breadCrumbs = [];
  506.             //
  507.             $category $this->data;
  508.             //
  509.             $conf = [];
  510.             if ($webname $this->getCategoryWebname()) {
  511.                 $conf[] = [
  512.                     'f' => $webname,
  513.                     'fn' => $this->getCategoryBreadcrumb() ?: $this->getCategoryName(),
  514.                 ];
  515.             }
  516.             if ($webname $this->getMainCategoryWebname()) {
  517.                 $conf[] = [
  518.                     'f' => $webname,
  519.                     'fn' => $this->getMainBreadcrumb() ?: $this->getMainCategoryName(),
  520.                 ];
  521.             }
  522.             if ($webname $this->getMainCategoryMainCategoryWebname()) {
  523.                 $conf[] = [
  524.                     'f' => $webname,
  525.                     'fn' => $this->getCanonicalMainCategory()->getMainBreadcrumb() ?: $this->getCanonicalMainCategory()->getMainCategoryName(),
  526.                 ];
  527.             }
  528.             //
  529.             foreach ($conf as $i => $obj) {
  530.                 for ($j 0$j <= $i$j++) {
  531.                     if (!empty($obj['f'])) {
  532.                         if (!isset($breadCrumbs[$i]['label'])) {
  533.                             $breadCrumbs[$i]['label'] = $obj['fn'];
  534.                         }
  535.                         if (!isset($breadCrumbs[$j]['href'])) {
  536.                             $breadCrumbs[$j]['href'] = "/{$obj['f']}";
  537.                         } else {
  538.                             $breadCrumbs[$j]['href'] = "/{$obj['f']}{$breadCrumbs[$j]['href']}";
  539.                         }
  540.                     }
  541.                 }
  542.                 //
  543.                 if (!empty($breadCrumbs[$i]['href'])) {
  544.                     $breadCrumbs[$i]['href'] = "{$breadCrumbs[$i]['href']}/";
  545.                 }
  546.             }
  547.             //
  548.             $breadCrumbs array_reverse($breadCrumbs);
  549.             //
  550.             return $breadCrumbs;
  551.         });
  552.     }
  553.     public function getRelatedColumnList()
  554.     {
  555.         return self::compute($this->columnList, function () {
  556.             //
  557.             $mainCategoryId $this->getMainCategoryId();
  558.             $categoryId $this->getCategoryId();
  559.             //
  560.             return self::getColumnListById($mainCategoryId$categoryId);
  561.         });
  562.     }
  563.     /**
  564.      * @param int $mainCategoryId
  565.      * @param int|null $categoryId
  566.      * @return array|null
  567.      */
  568.     public static function getColumnListById($mainCategoryId$categoryId null)
  569.     {
  570.         $query = (new SqlService())
  571.             ->Select('T.main_category_webname, T2.category_webname, T1.*')
  572.             ->Table('main_category_table')
  573.             ->Join('column_table''T.main_category_id = T1.column_main_category''INNER')
  574.             ->Set('T.main_category_id'$mainCategoryId)
  575.             ->Where('T.main_category_status = 1')
  576.             ->Where('T1.column_status = 1')
  577.             ->Where("T1.column_related_image_filename != ''")
  578.             ->OrderBy('isnull(T1.column_display), T1.column_display, T1.column_id desc')
  579.         ;
  580.         //
  581.         if ($categoryId === null) {
  582.             // 親カテゴリの場合
  583.             $query
  584.                 ->Join('category_table''T2.category_id = :category_id''LEFT')    // 擬似的に空のカテゴリ一覧を結合
  585.                 ->Param('category_id'$categoryId)
  586.                 ->Where("T1.no_display_in_main_category = 0")
  587.             ;
  588.         } else {
  589.             // 子カテゴリの場合
  590.             $query
  591.                 ->Join('category_table''T.main_category_id = T2.category_main_category''LEFT')
  592.                 ->Join('category_relation_to_display_column_table''T1.column_id = T3.column_id AND T2.category_id = T3.category_id''LEFT')
  593.                 ->Set("T2.category_id"$categoryId)
  594.                 ->Where("T2.category_status = 1")
  595.             ;
  596.         }
  597.         //
  598.         $result = (array)$query->FindAll();
  599.         //
  600.         foreach($result as &$row){
  601.             // 管理画面上「URL」と表記のある入力
  602.             if( is_null($row['column_target_category']) ){
  603.                 $row['uri'] = '/'.$row['main_category_webname'].'/column/'.$row['column_webname'].'/';
  604.             }
  605.             else{
  606.                 $row['uri'] = '/'.$row['main_category_webname'].'/'.$row['category_webname'].'/column/'.$row['column_webname'].'/';
  607.             }
  608.         }
  609.         //
  610.         return $result;
  611.     }
  612.     public function getUpperColumn()
  613.     {
  614.         return self::compute($this->upperColumn, function () {
  615.             //
  616.             $query = (new SqlService())
  617.                 ->Select('upper_one_column_content')
  618.                 ->Table('upper_column_table')
  619.                 ->Join('main_category_table'"T.target_category_id = T1.main_category_id AND site_type = :site_type"'LEFT')
  620.                 ->Set('T1.main_category_id'$this->geTMainCategoryId())
  621.                 ->Param('site_type'$this->getSiteType())
  622.             ;
  623.             //
  624.             if ($result $query->Find()) {
  625.                 //
  626.                 $result $result['upper_one_column_content'];
  627.             }
  628.             //
  629.             return $result;
  630.         });
  631.     }
  632.     /**
  633.      * @return string
  634.      */
  635.     public function getComment()
  636.     {
  637.         return self::compute($this->comment, function () {
  638.             //
  639.             return $this->isMainCategory() ? $this->getMainCategoryComment() : $this->getCategoryComment();
  640.         });
  641.     }
  642.     /**
  643.      * @return string
  644.      */
  645.     public function getSmallFooterContent()
  646.     {
  647.         return self::compute($this->smallFooterContent, function () {
  648.             //
  649.             if ($this->isShowSmallFooter()) {
  650.                 return $this->getMainCategorySmallFooterContent();
  651.             } else {
  652.                 return null;
  653.             }
  654.         });
  655.     }
  656.     /**
  657.      * @return string
  658.      */
  659.     public function getLargeFooterContent()
  660.     {
  661.         return self::compute($this->largeFooterContent, function () {
  662.             //
  663.             return $this->getMainCategoryLargeFooterContent();
  664.         });
  665.     }
  666.     /**
  667.      * @return array
  668.      */
  669.     public function getCategoryTopInfo()
  670.     {
  671.         return self::compute($this->categoryTopInfo, function () {
  672.             //
  673.             $categoryTopInfo = [];
  674.             //
  675.             if ($this->hasMainCategoryMainCategory()) {
  676.                 // 配下親カテゴリ有り
  677.                 $categoryTopInfo['webname'] = $this->getMainCategoryMainCategoryWebname();
  678.                 $categoryTopInfo['name'] = $this->getMainCategoryMainCategoryName();
  679.             } else if ($this->hasMainCategories()) {
  680.                 // 配下親カテゴリ自身
  681.                 $categoryTopInfo['webname'] = $this->getMainCategoryWebname();
  682.                 $categoryTopInfo['name'] = $this->getMainCategoryName();
  683.             } else {
  684.                 // それ以外
  685.                 return null;
  686.             }
  687.             //
  688.             return $categoryTopInfo;
  689.         });
  690.     }
  691.     public function getItemList($page null$itemsPerPage null$params null)
  692.     {
  693.         //
  694.         return self::compute($this->itemList, function () use ($page$itemsPerPage$params) {
  695.             //
  696.             $mcId $this->getMainCategoryId();
  697.             $ctId $this->getCategoryId() ?: 'allitem';
  698.             //
  699.             return $this->_getItemList($mcId$ctId$page$itemsPerPage$params$this->itemListCount);
  700.         });
  701.     }
  702.     public function getItemListCount()
  703.     {
  704.         //
  705.         return self::compute($this->itemListCount, function () {
  706.             //
  707.             $this->getItemList();
  708.             //
  709.             return $this->itemListCount;
  710.         });
  711.     }
  712.     public function _getItemList($mcId$ctId$page$itemsPerPage$params, &$count null)
  713.     {
  714.         //
  715.         if (empty($page)) {
  716.             $page 1;
  717.         }
  718.         //
  719.         if (empty($itemsPerPage)) {
  720.             $itemsPerPage self::ITEMS_PER_PAGE;
  721.         }
  722.         //
  723.         if (empty($params)) {
  724.             $params = [];
  725.         }
  726.         //
  727.         $an_search_base_color_list = array();
  728.         if (!empty($params['search_base_color_list'])) {
  729.         }
  730.         // サイズで選ぶ
  731.         $an_search_size_list = array();
  732.         if (!empty($params['search_size_list'])) {
  733.         }
  734.         // 種類で選ぶ
  735.         $an_search_type_list = array();
  736.         if (!empty($params['search_type_list'])) {
  737.         }
  738.         $strSQLWhere '';
  739.         $search_goods_id array_unique($an_search_base_color_list $an_search_size_list $an_search_type_list);
  740.         if (is_array($search_goods_id) && $search_goods_id) {
  741.             $strSQLWhere .= ' AND goods_id in (' implode(','$search_goods_id) . ')';
  742.         }
  743.         $strSQLGroup " group by goods_id";
  744.         // 金額で選ぶ
  745.         $strSQLHaving '';
  746.         if (!empty($params['price_range_start']) || !empty($params['price_range_end'])) {
  747.             $price_range_start $params['price_range_start'];
  748.             $price_range_end $params['price_range_end'];
  749.             $strSQLHaving ' HAVING ';
  750.             // 「範囲」検索
  751.             if ($price_range_start != "" && $price_range_end != "") {
  752.                 $strSQLHaving .= ' price >= ' $price_range_start ' AND price <= ' $price_range_end;
  753.             } else if ($price_range_start != "") {
  754.                 $strSQLHaving .= ' price >= ' $price_range_start;
  755.             } else if ($price_range_end != "") {
  756.                 $strSQLHaving .= ' price <= ' $price_range_end;
  757.             }
  758.         }
  759.         if ($ctId != "allitem") {
  760.             $search_category $this->_getOriginalCategory($ctId);
  761.         } else {
  762.             $search_category $this->_getOriginalCategory_Main($mcId);
  763.         }
  764.         $mcConditions '';
  765.         $ctConditions '';
  766.         $sqlParams = [];
  767.         if (!empty($mcId)) {
  768.             $mcConditions " AND main_category_id = :main_category_id";
  769.             $sqlParams['main_category_id'] = $mcId;
  770.         }
  771.         if (!empty($search_category)) {
  772.             $placeholders = [];
  773.             foreach (explode(','$search_category) as $k => $v) {
  774.                 $key "category_id_{$k}";
  775.                 $placeholders[] = ":{$key}";
  776.                 $sqlParams[$key] = $v;
  777.             }
  778.             $ctConditions " AND category_id IN (".implode(','$placeholders).")";
  779.         }
  780.         // ユニフォームネクストの商品掲載順を使用(おすすめとして扱う)
  781.         $use_recommended_order $this->useUnItemOrder($mcId$ctId);
  782.         $join_item_recommended_order '';
  783.         if($use_recommended_order && !empty($params['order_type']) && $params['order_type'] == "6") {
  784.             $recommended_order_where_clause 'main_category_id = %d';
  785.             if( !empty($this->ctId) && strtolower($this->ctId) !== 'allitem' ){
  786.                 $recommended_order_where_clause .= ' AND category_id = %d';
  787.             }
  788.             else{
  789.                 $recommended_order_where_clause .= ' AND category_id IS NULL';
  790.             }
  791.             $join_item_recommended_order sprintf("
  792.                     LEFT JOIN(
  793.                         SELECT
  794.                             goods_id,
  795.                             is_un_order,
  796.                             display_order
  797.                         FROM
  798.                             goods_recommended_order_table
  799.                         WHERE
  800.                             {$recommended_order_where_clause}
  801.                     ) AS recommended_order
  802.                     USING(goods_id)
  803.                 ",
  804.                 $mcId,
  805.                 $ctId
  806.             );
  807.         }
  808.         /***** 商品情報取得(メイン) *****/
  809.         $strSQL "select SQL_CALC_FOUND_ROWS goods_id, goods_recommend, goods_name, goods_sub_name, goods_caption, goods_display, goods_cdate, goods_udate, price2_min as price, kataban, NULL AS category_id, COALESCE(cra_average_points, 0) AS average, cra_target_count as review_count, goods_target_gender, goods_category_list_icon_id
  810.             from (
  811.                 select goods_id, goods_recommend, goods_name, goods_sub_name, goods_caption, goods_display, goods_cdate, goods_udate, goods_target_gender, goods_category_list_icon_id,
  812.                 main_category_id, category_id
  813.                 from main_category_table
  814.                 inner join category_table on main_category_id = category_main_category
  815.                 inner join goods_category_table on category_id = gc_category
  816.                 inner join goods_table on goods_id = gc_goods
  817.                 where 1 = 1{$mcConditions}{$ctConditions} AND goods_ddate is null and goods_status = 1
  818.                 union
  819.                 select goods_id, goods_recommend, goods_name, goods_sub_name, goods_caption, goods_display, goods_cdate, goods_udate, goods_target_gender, goods_category_list_icon_id,
  820.                 main_category_id, null as category_id
  821.                 from main_category_table
  822.                 inner join goods_main_category_table on main_category_id = gmc_main_category
  823.                 inner join goods_table on goods_id = gmc_goods
  824.                 where 1 = 1{$mcConditions} AND goods_ddate is null and goods_status = 1
  825.             ) AS goods
  826.             inner join goods_price_summary USING( goods_id )
  827.             left join sales_volume_rank_table USING( goods_id )
  828.             left join customer_review_average_table on cra_goods_id = goods_id
  829.             {$join_item_recommended_order}
  830.             WHERE 1 = 1{$mcConditions}";
  831.         if( strtolower($ctId) !== 'allitem' $strSQL .= $ctConditions;
  832.         $strSQL .= $strSQLWhere $strSQLGroup $strSQLHaving;
  833.         if ( !empty($params['order_type']) and $params['order_type'] == "1" ) {
  834.             //安い順
  835.             $strSQL .= " order by price, goods_recommend desc ";
  836.         } elseif ( !empty($params['order_type']) and $params['order_type'] == "3" ) {
  837.             //高い順
  838.             $strSQL .= " order by price desc, goods_recommend desc ";
  839.         } elseif ( !empty($params['order_type']) and $params['order_type'] == "4" ) {
  840.             //品名順
  841.             // $strSQL .= " order by cast( goods_name as binary ), goods_recommend desc ";
  842.             $strSQL .= " order by goods_recommend desc ";
  843.         } elseif ( !empty($params['order_type']) and $params['order_type'] == "2" ) {
  844.             //品番順
  845.             $strSQL .= " order by kataban, goods_recommend desc ";
  846.         } elseif ( !empty($params['order_type']) and $params['order_type'] == "5" ) {
  847.             // 評価順
  848.             $strSQL .= " order by average desc, review_count desc,goods_recommend desc ";
  849.         } elseif ( !empty($params['order_type']) and $params['order_type'] == "6" and $use_recommended_order) {
  850.             // おすすめ順(ユニフォームネクストの商品掲載順)
  851.             // ユニフォームネクストと紐付きのない商品は、「ウェブスクレイピング画面で設定した順 > goods_id順’で表示
  852.             $strSQL .= " order by is_un_order DESC, display_order IS NULL ASC, display_order ASC, goods_id";
  853.         } else {
  854.             $strSQL .= " order by isnull( quantities ), quantities DESC, goods_recommend desc, price, isnull( goods_display ), goods_display, goods_udate desc, goods_cdate desc ";
  855.         }
  856.         $result = (array)((new SqlService())
  857.             ->Sql($strSQL)
  858.             ->Limit($itemsPerPage, ($page 1) * $itemsPerPage)
  859.             ->Params($sqlParams)
  860.             ->FetchAll())
  861.         ;
  862.         $count = (int)call_user_func(function ($result) {
  863.             return $result['count'];
  864.         }, (new SqlService())
  865.         ->Sql('SELECT FOUND_ROWS() AS `count`')
  866.         ->Fetch());
  867.         return $result;
  868.     }
  869.     public function _getOriginalCategory_Main($id)
  870.     {
  871.         $rs = (new SqlService())
  872.             ->Table('category_table')
  873.             ->Set('category_main_category'$id)
  874.             ->Select("category_id, category_category, category_main")
  875.             ->FindAll() ?: [];
  876.         $all_category "";
  877.         foreach ($rs as $row) {
  878.             if ( $all_category != "" $all_category .= ",";
  879.             $all_category .= $this->_getOriginalCategory($row['category_id'], $row);
  880.         }
  881.         return $all_category;
  882.     }
  883.     public function _getOriginalCategory($id$tmpRow null)
  884.     {
  885.         if($tmpRow === null) {
  886.             $row = (new SqlService())
  887.                 ->Table('category_table')
  888.                 ->Set('category_id'$id)
  889.                 ->Select("category_id, category_category, category_main")
  890.                 ->Find();
  891.         } else {
  892.             $row $tmpRow;
  893.         }
  894.         if ($row) {
  895.             //カテゴリが共有されている場合の処理
  896.             if ( $row['category_category'] != "" ) {
  897.                 $all_category $row['category_category'];
  898.             } elseif ( $row['category_main'] != "" ) {
  899.                 $strSQL "select coalesce( category_category, category_id ) as cid, category_main
  900.                     from category_table
  901.                     where category_main_category = " $row['category_main'] . " and category_main is null";
  902.                 $tempRow = (new SqlService())->Sql($strSQL)->FetchAll();
  903.                 foreach ($tempRow as $row) {
  904.                     if ( $all_category != "" $all_category .= ",";
  905.                     $all_category .= $row['cid'];
  906.                 }
  907.             } else {
  908.                 $all_category $id;
  909.             }
  910.         } else {
  911.             $all_category $id;
  912.         }
  913.         return $all_category;
  914.     }
  915.     public function useUnItemOrder($mcId null$ctId null)
  916.     {
  917.         if( empty($mcId) ) return false;
  918.         $category_id $mcId;
  919.         $is_parent 1;
  920.         // 子カテの指定がある場合
  921.         if( !empty($ctId) && strtolower($ctId) !== 'allitem' ){
  922.             $category_id $ctId;
  923.             $is_parent 0;
  924.         }
  925.         $rows = (new SqlService())
  926.             ->Table('uniform_next_category_map_table')
  927.             ->Set('lm_category_id'$category_id)
  928.             ->Set('is_parent'$is_parent)
  929.             ->Set('use_un_order'1)
  930.             ->FetchAll();
  931.         return !empty($rows);
  932.     }
  933.     public function getDataBySql($sql)
  934.     {
  935.         return (new SqlService())->Sql($sql)->FetchAll();
  936.     }
  937.     /**
  938.      * @return bool
  939.      */
  940.     public function isNoDisplayDbCategory(){
  941.         // SEO対策 特定の親カテは商品DBを表示しない
  942.         return in_array($this->getMainCategoryWebname(), self::no_display_db_category_list);
  943.     }
  944. }