마 젠토 2-장바구니에 담긴 모든 품목을 얻는 방법?


23

결제 페이지 ( chekout/cart)에서 장바구니 항목 ( link.phtml)을 기준으로 결제 버튼 URL 대상을 수정하고 싶습니다 .

장바구니에있는 모든 품목을 어떻게 구할 수 있습니까? API를 사용하지 않고이 작업을 수행하고 싶습니다. 감사.

답변:


26

나는 두 부분으로 질문에 대답 할 것이다 :

I. 결제 URL을 어디에서 변경해야합니까?

의 목적지는 link.phtml입니다 $block->getCheckoutUrl(). 기능을 변경하기 위해 템플릿을 변경 Magento\Checkout\Block\Onepage\Link하지 말고 대신 블록을 변경하십시오 . 그렇게하려면 리턴 값을 변경 하는 메소드 를 사용하여 플러그인 을 작성하십시오 afterGetCheckoutUrl().

II. 카트에있는 모든 품목을 얻는 방법?

현재 우리는 카트 모델을 사용하므로 Magento_Checkout 및 Magento_Quote의 서비스 계약이 필요한 방법을 제공 아직 없습니다. 플러그인에서 다음과 같이 삽입하십시오.

public function __construct(\Magento\Checkout\Model\Cart $cart)
{
    $this->cart = $cart;
}

카트에 액세스 할 수있게되었으므로 몇 가지 방법으로 항목을 검색 할 수 있습니다. 기본적으로 Magento 1과 동일합니다 .

  • $this->cart->getQuote()->getItemsCollection()

    현재 견적과 관련된 모든 항목이 있는 견적 품목 컬렉션을 반환합니다 .

  • $this->cart->getItems()

    위의 방법에 대한 바로 가기이지만 따옴표가 없으면 빈 배열을 반환하므로 컬렉션 인스턴스를 가져올 수 없습니다.

  • $this->cart->getQuote()->getAllItems()

    항목 컬렉션을로드 한 다음 삭제 된 것으로 표시되지 않은 (즉, 현재 요청에서 제거 된) 모든 항목 의 배열 을 반환합니다 .

  • $this->cart->getQuote()->getAllVisibleItems()

    항목 콜렉션을로드 한 다음 삭제 된 것으로 표시되지 않고 상위 항목 이없는 모든 항목 의 배열 을 리턴합니다 (즉, 번들 및 구성 가능한 제품에 대한 항목을 가져 오지만 연관된 하위 항목은 없음). 각 배열 항목은 장바구니 페이지의 표시된 행에 해당합니다.

가장 적합한 것을 선택하십시오. 대부분의 경우 마지막 방법이 필요합니다.


장바구니 모델 및 방법을 사용 하면 상점을 방문하는 모든 장바구니의 모든 품목을 모든 활성 견적 모델에서 가져 AllItems()오거나 getAllVisibleItems()반환합니까? 아니면 내 장바구니에서 하나만 (체크 아웃 세션 객체를 사용하고 qutoe 객체를 가져 오겠다) 내기? 블록 클래스에서 체크 아웃 세션을 사용하고 싶기 때문에 차이점이 중요하지만 실제로 블록 내부에 들어가면 qutoe가 비어 있습니다.
— Bartosz Kubicki

항상 현재 세션의 카트 일뿐입니다.
— Fabian Schmengler

그리고 상품 카테고리를 얻는 방법?
— Рома Лытарь

21

Magento \ Checkout \ Model \ Cart는 더 이상 사용되지 않습니다.

세션을 사용하여 견적 및 장바구니 항목을 가져와야합니다.

use Magento\Checkout\Model\Session;

public function __construct(
        ...
        Session $session
        ...
    ) {
        ...
        $this->_session = $session;
        ...
    }

public function yourFunction()
{
    $items = $this->_session->getQuote()->getAllVisibleItems();
}

Magento가 곧 세션을 위해 일종의 저장소를 추가 할 것이라고 확신합니다.

내가 알 수있는 한 Magento \ Quote \ Api \ CartRepositoryInterface 또는 Magento \ Quote \ Api \ CartManagementInterface 중 하나를 사용하여 현재 견적을 얻을 수는 없지만 고객 ID가 있으면 두 가지 중 하나를 사용할 수 있습니다 견적을로드하면 (Magento가 원하는 방식으로 상상할 수 있습니다) 거기에서 견적 / 장바구니 항목을 얻습니다.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)

4
올바른 방법은 지금 결제 세션을 사용하는 것 Magento\Checkout\Model\Session::getQuote()입니다.
— Giel Berkers

10
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
 $cart = $objectManager->get('\Magento\Checkout\Model\Cart'); 

// retrieve quote items collection
$itemsCollection = $cart->getQuote()->getItemsCollection();

// get array of all items what can be display directly
$itemsVisible = $cart->getQuote()->getAllVisibleItems();

// retrieve quote items array
 $items = $cart->getQuote()->getAllItems();

foreach($items as $item) {
     echo 'ID: '.$item->getProductId().'<br />';
      echo 'Name: '.$item->getName().'<br />';
       echo 'Sku: '.$item->getSku().'<br />';
       echo 'Quantity: '.$item->getQty().'<br />';
      echo 'Price: '.$item->getPrice().'<br />';
    echo "<br />";            
  }

그리고 상품 카테고리를 얻는 방법?
— Рома Лытарь

0

최신 버전에서는 API를 사용할 수 있습니다.

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.