tomoya kitatani
portfolio site

EC-CUBE3系でフロント側の並び順をソートする

EC-CUBE3系のカスタマイズ中に、フロント側で規格(サイズやカラー)の並び順が変更されないことが判明。

調べてたところデフォルトでは不可能らしく、下記のソースで対応しました。

変更するテンプレート : src>Eccube>Entity>Product.phpの56行目から変更

public function _calc()
{
if (!$this->_calc) {
$i = 0;
foreach ($this->getProductClasses() as $ProductClass) {
/* @var $ProductClass \Eccube\Entity\ProductClass */
// del_flg
if ($ProductClass->getDelFlg() === 1) {
continue;
}

// stock_find
$this->stockFinds[] = $ProductClass->getStockFind();

// stock
$this->stocks[] = $ProductClass->getStock();

// stock_unlimited
$this->stockUnlimiteds[] = $ProductClass->getStockUnlimited();

// price01
if (!is_null($ProductClass->getPrice01())) {
$this->price01[] = $ProductClass->getPrice01();
// price01IncTax
$this->price01IncTaxs[] = $ProductClass->getPrice01IncTax();
}

// price02
$this->price02[] = $ProductClass->getPrice02();

// price02IncTax
$this->price02IncTaxs[] = $ProductClass->getPrice02IncTax();

// product_code
$this->codes[] = $ProductClass->getCode();

if ($i === 0) {
if ($ProductClass->getClassCategory1() && $ProductClass->getClassCategory1()->getId()) {
$this->className1 = $ProductClass->getClassCategory1()->getClassName()->getName();
}
if ($ProductClass->getClassCategory2() && $ProductClass->getClassCategory2()->getId()) {
$this->className2 = $ProductClass->getClassCategory2()->getClassName()->getName();
}
}
if ($ProductClass->getClassCategory1()) {
$classCategoryId1 = $ProductClass->getClassCategory1()->getId();
if (!empty($classCategoryId1)) {

//規格1ランク用の配列を取得
$cc_rank_1[$ProductClass->getClassCategory1()->getName()] = $ProductClass->getClassCategory1()->getRank();

$this->classCategories1[$ProductClass->getClassCategory1()->getId()] = $ProductClass->getClassCategory1()->getName();
if ($ProductClass->getClassCategory2()) {

//規格2ランク用の配列を取得
$cc_rank_2[$ProductClass->getClassCategory2()->getName()] = $ProductClass->getClassCategory2()->getRank();

$this->classCategories2[$ProductClass->getClassCategory1()->getId()][$ProductClass->getClassCategory2()->getId()] = $ProductClass->getClassCategory2()->getName();
}
}
}
$i++;
// 規格1のソート
uasort($this->classCategories1,function($a, $b) use($cc_rank_1){
if($cc_rank_1[$a] == $cc_rank_1[$b]) return 0;
return $cc_rank_1[$b] < $cc_rank_1[$a];
});

// 規格2のソート
if ($ProductClass->getClassCategory2()) {
uasort($this->classCategories2,function($a, $b) use($cc_rank_2){
if($cc_rank_2[$a] == $cc_rank_2[$b]) return 0;
return $cc_rank_2[$b] < $cc_rank_2[$a];
});
}
}
$this->_calc = true;

}
}