이것은 Mage_Sales_Model_Quote_Item::compare()
Magento CE 1.9.2 / EE 1.14.2에서 소개 된 버그입니다 . 이 방법은 항목을 비교하여 항목이 동일한 제품인지 병합 할 수 있는지 (로그인 중 및 카트에 제품을 추가 할 때) 결정하는 데 사용됩니다.
모든 사용자 정의 옵션을 비교하면 (represantative하지 않는 옵션을 생략한다 _notRepresentOptions
), 즉 info_buyRequest의 옵션을 선택합니다.
이전 Magento 버전에서는 다음과 같습니다.
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)) {
continue;
}
제대로 작동했습니다. 이제 다음과 같이 보입니다 :
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)
&& !$item->getProduct()->hasCustomOptions()
) {
continue;
}
추가 검사 hasCustomOptions()
는 설명 된 버그 를 유발합니다. 왜? 사용자 지정 옵션이있는 제품을 항상 별도로 유지하기 위해 검사가 추가 된 것 같습니다. 적어도 그것이 구현 된 방식으로는 의미가 없다고 생각하지만, 내가 알지 못하는 몇 가지 이유가 있습니다.
그러나 $item->getProduct()->hasCustomOptions()
견적 품목의 경우 항상 true를 반환합니다.
이것이 방법입니다.
public function hasCustomOptions()
{
if (count($this->_customOptions)) {
return true;
} else {
return false;
}
}
그러나 $this->_customOptions
또한 포함 info_buyRequest
견적 항목에서 옵션을 선택합니다.
눈에 거슬리지 않는 솔루션의 info_buyRequest
경우에 관찰자에있는 모든 제품에서 옵션 을 제거하려고 시도했지만 sales_quote_merge_before
성공하지 못했습니다.
의 이유는 거짓말 Mage_Sales_Model_Quote_Item_Abstract::getProduct()
옵션이 인용 항목 자체에서 다시 복사된다 :
public function getProduct()
{
$product = $this->_getData('product');
[...]
if (is_array($this->_optionsByCode)) {
$product->setCustomOptions($this->_optionsByCode);
}
return $product;
}
해결책
이 시점에서 옵션을 포함하지 않기 Mage_Sales_Model_Quote_Item
위해 재정의 로 다시 쓰기를 작성했습니다 .getProduct()
info_buyRequest
public function getProduct()
{
$product = parent::getProduct();
$options = $product->getCustomOptions();
if (isset($options['info_buyRequest'])) {
unset($options['info_buyRequest']);
$product->setCustomOptions($options);
}
return $product;
}
번들 제품에 문제가 발생했습니다. 아래 대안 또는 @ AnnaVölkl에서 설명한 공식 패치가 더 나은 솔루션입니다.
대안
어쨌든 항목 모델을 다시 작성하는 경우 메소드 의 문제 && !$item->getProduct()->hasCustomOptions()
를 제거 할 수도 있습니다 compare()
. 어떤 문제를 해결하려고했는지 모르겠지만 더 많이 생성되었습니다 ...
2016 년 1 월 29 일 업데이트
나는 이것을 Magento에보고하고 그들이 문제를 재현 할 수 없다는 응답을 얻었으므로 패치는 그것을 커뮤니티 에디션 (제출 APPSEC-1321)으로 만들지 않을 것이다.
즉, 문제가있는 경우 업데이트 할 때마다 엔터프라이즈 패치 SUPEE-6190을 적용 하거나 클래스 재 작성을 사용해야합니다.