Magento2 올바른 주문 방법


11

M2 결제 확장을 위해 노력하고 있습니다. 판매자는 주문과 함께 상품 세부 정보를 보내야합니다.

모든 것이 잘 작동하지만 $order->getAllItems();$order->getAllVisibleItems();돌아 간단하고 있으므로 구성 상위 상품을

장바구니에 2 개의 제품이 있다면

  • 1 간단한 제품
  • 1 구성 가능한 제품 관련

따라서 두 개의 제품을 얻는 대신 세 개의 제품을 얻습니다. 하나의 간단한 관련 제품 및 해당 상위 제품;

올바른 제품을 추출하려고 시도 할 수 있지만 다른 제품이어야합니다

    /** @var \Magento\Sales\Model\Order $order */
    $order = $payment->getOrder();
    /**
     * Get All Items of Products
     */
    $productItems = $order->getAllItems() // returning 3 products where I have 2 in cart 
    $productItemsTest = $order->getAllVisibleItems(); // returning 3 products where I have 2 in cart 

답변:


13

주문에서 항목을 가져 오는 다른 방법은 다음과 같습니다.

  • getItems():로드 된 주문 항목 콜렉션에서 항목 배열을 리턴합니다.
  • getAllItems(): 삭제 된 것으로 표시되지 않은 모든 항목의 배열을 반환합니다.
  • getAllVisibleItems(): 삭제 된 것으로 표시되지 않고 상위 항목이없는 모든 항목의 배열을 리턴합니다.

따라서 관련 제품이 아닌 구성 가능한 제품 만 얻으려면 getAllVisibleItems()올바른 방법입니다.

  • 단일 단순 항목에는 부모가 없습니다 => 표시
  • 구성 가능한 항목에는 부모가 없습니다 => 표시
  • 연결된 간단한 항목에는 부모 => 표시되지 않음

불행히도 현재 getItems()서비스 계약의 일부 일뿐Magento\Sales\Api\Data\OrderInterface


감사합니다 남자하지만 다음 이미지가 도울 수 있다면 그것의 의미 난을하지 않도록 함께 간단하고 구성 제품을 반환 getAllVisibleitems () imgur.com/8ADtnUQ imgur.com/LnMMuOM
사지 드 Unar

이미지가 올바르게 보입니다. 아니면 이것이 당신이 원하는 것이 아닌 당신이 원하는 것입니까?
Fabian Schmengler

장바구니에서 상품을 반품해야하므로 하나는 구성과 다른 두 개의 단순한 제품입니다. ($ productItem-> getProductType () == "simple"&& ($ productItem-> getParentItem ())) {계속하면이 논리를 수행했습니다. } 구성의 단순 제품이 가격을 반환하지 않았기 때문에
Sajid Unar

1
Magento 1과 Magento 2의 getAllVisibleItems 구현에는 큰 차이가 있습니다. M1 하위 제품 (구성 가능, 번들 등)은 M2에 표시되지 않지만 M2에는 있습니다. 구현은 동일하지만 $ item-> getParentItemId ()는 하위 항목에 대해 M2에서 null을 반환합니다. 버그인지 여부에 따라 사용중인 Magento 버전에 따라 동작이 달라집니다.
Ricardo Martins

3

주문 항목을 얻는 가장 좋은 방법은 $order->getAllVisibleItems()

위의 fschmengler가 설명했듯이

getAllItems(): 이 함수는 구성 단순 제품과 함께 장바구니의 모든 항목의 배열도 반환합니다.

사용이 때문에 세 가지 제품을 받고 $order->getAllItems() 사용해야 $order->getAllVisibleItems()원래의 제품을 얻을 방법을.

파일에서 더 많은 참조를 확인할 수 있습니다 vendor/magento/module-quote/Model/Quote.php

/**
     * Retrieve quote items array
     *
     * @return array
     */
    public function getAllItems()
    {
        $items = [];
        foreach ($this->getItemsCollection() as $item) {
            /** @var \Magento\Quote\Model\ResourceModel\Quote\Item $item */
            if (!$item->isDeleted()) {
                $items[] = $item;
            }
        }
        return $items;
    }

    /**
     * Get array of all items what can be display directly
     *
     * @return \Magento\Quote\Model\Quote\Item[]
     */
    public function getAllVisibleItems()
    {
        $items = [];
        foreach ($this->getItemsCollection() as $item) {
            //echo $item->getId()."<br>";
            if (!$item->isDeleted() && !$item->getParentItemId()) {
                $items[] = $item;
            }
        }
        return $items;
    }

회신하지만 예상대로 그 작동하지 설명 다음 이미지가 이미지 장바구니로 감사 imgur.com/8ADtnUQ 및 디버깅 이미지 imgur.com/LnMMuOM을
사지 드 Unar

0

다음 코드를 사용하여 Item 루프를 사용하고 하위 항목을 제외 할 수 있습니다.

/** @var \Magento\Sales\Model\Order $order */
$order = $payment->getOrder();

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.