마 젠토 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.