Magento2에서 장바구니의 제품 속성 가져 오기


21

장바구니 템플릿에서 제품 속성을 가져 오려고합니다. 하지만 난 그냥 작동하지 않습니다! 상점 첫 화면 = 예의 카탈로그 페이지에서 속성이 표시됨으로 설정되고 제품 목록에서 사용됨 = 예

사용자 지정 모듈을 사용하여 다음 템플릿을 재정의합니다.

/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml

나는 제품이있다 :

$_item = $block->getItem();
$product = $_item->getProduct();

일반적으로 속성 코드가 'sample_attr'인 사용자 지정 속성 (이 경우 텍스트 영역 유형)을 다음 중 하나와 함께 사용할 수 있습니다.

$product->getData('sample_attr');

또는

$product->getSampleAttr();

이 속성 (sku, weight, price ..)을 사용하여 일부 속성을 사용할 수 있지만 사용자 정의 속성에 대해서는 작동하지 않습니다. 포함 된 도우미 (\ Magento \ Msrp \ Helper \ Data)에도 특성 메서드가 없습니다.

다음을 사용하여 모든 속성 코드를 얻을 수 있습니다.

   $attributes = $product->getAttributes();
   foreach($attributes as $a)
   {
     var_dump($a->getName());
   }

나는 또한 시도했다 :

    $attribute = $product->getResource()->getAttribute('sample_attr');
    var_dump($attribute->getFrontend()->getValue($product));

그러나 이것은 null을 반환합니다.

그렇다면 속성 값을 어떻게 얻습니까?

나는 이것을 시도했다 : 카탈로그 페이지에서 각 제품에 대한 특정 속성 가져 오기

카탈로그 list.phtml (Magento 2)의 사용자 정의 텍스트 속성 출력

답변:


51

이를 위해 PHP 코드를 변경할 필요는 없습니다.

다음 {MODULE_NAME}/etc/catalog_attributes.xml과 같은 내용 으로 만들면 됩니다.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="sample_attr"/>
    </group>
</config>

흥미 롭군 나는 그것을 생각하지 않았다. 나중에 다시 시도하겠습니다.
tecjam

천만에요 :
Igor Sydorenko

2
환상적인! 나를 위해 작동합니다. 이 magento setup:di:compile작업 을 수행 하기 위해 실행 해야하는 것처럼 보였지만 의미가 있습니다. 여기에서 종속성 트리를 변경하고 있습니다.
psyklopz

이것은 정답 IMHO이어야합니다. 다른 답변은 각 카트 품목에 대해 제품 모델을로드하는 것이 좋습니다. 이는 특히 사용자 카트가 큰 경우 성능상의 이유로 좋지 않습니다.
Andrew Kett

난 모듈 tenx / checkoutex 등 전에서이 코드 위에 배치하지만이 작동하지 않은 당신이 도움이 될 수를 만들 수있는 저
Sarvesh Tiwari 보낸

8

그래서 나는 정보를 얻는 방법을 찾았습니다. ProductRepository에서 전체 제품을로드해야합니다! 당신이 그것을 시도하고 그것을로드하면 \Magento\Catalog\Model\Product싱글 톤처럼 행동 할 것입니다. 각 루프마다 항상 동일한 제품을 제공합니다.

내 모듈 헬퍼 클래스를 사용하여 productId에서 제품을로드하기 위해 다음 메소드를 정의했습니다.

public function __construct(
  \Magento\Framework\App\Helper\Context $context,
  \Magento\Catalog\Model\ProductRepository $productRepo
) {
  $this->_productRepo = $productRepo;
  parent::__construct($context);
  }


/**
 * Load product from productId
 *
 * @param $id
 * @return $this
 */
public function getProductById($id)
{
    return $this->_productRepo
        ->getById($id);
}

템플릿에 도우미를 포함 시켰습니다.

$customHelper = $this->helper('MyCompany\MyModule\Helper\Data');

전체 제품을로드합니다.

$custProd = $customHelper->getProductById($product->getId());

그리고 지금 사용할 수 있습니다 :

$custProd->getSampleAttr();

$custProd->getData('sample_attr');

데이터를 얻을 수 있습니다.


2

간단한 해결책을 찾는 여기에 착륙 한 사람들에게는 그것이 저에게 효과적이었습니다.

나는 이것을 default.phtml(에 module-checkout/view/frontend/templates/cart/item) 추가했다 .

<?php
    $product_id = $product->getId();
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $customProduct = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
 ?>

그때 $customProduct->getData('your_attribute');처럼 항상 전화 할 수 있습니다


2
템플릿에서 Magento는 ObjectManager를 직접 사용하지 않도록 권장합니다. 블록을 추가해야합니다.
Khoa TruongDinh

2
템플릿이나 블록에없는 ObjectManager를 직접 사용해서는 안됩니다.
ocornu 2016 년

당신이 단순히 어떻게 신경 쓰지 않는다면,이 100 %가 효과가 있습니다.
A. Lal

1

올바른 관리자 설정을 사용하면 eav_attributesql 테이블 의 소스 모델 이로 설정된 경우 체크 아웃 페이지의 제품 오브젝트에 사용자 정의 속성이로드 됩니다 NULL. 따라서 $product->getSampleAttr()결제 페이지에서 직접 액세스 할 수 있습니다 .

그러나 속성에로 소스 모델이있는 Magento\Eav\Model\Entity\Attribute\Source\Table경우 저장소에서 제품을로드해야합니다.

새 헬퍼를 작성하고 생성자에 제품 저장소를 추가하십시오. 2.2.6에서 계속 작동합니다 (tecjam 솔루션).

항목 렌더러 (체크 아웃 페이지에서 호출)를 대체하고 여기에 제품 저장소를 추가하려고하면 문제가 동일합니다.

여기에 이미지 설명을 입력하십시오


0

사용자 정의 속성은 Quote / Cart에있는 제품 오브젝트에 포함되지 않으므로 getData ( 'custom_attribute') 함수를 통해 가져올 수 없습니다. 제품을 견적 제품 객체에서 반환하고 제품 리포지토리를 사용하여 제품을로드하는 것이 필요합니다. 나중에 getData ( 'custom_attribute') funciton을 사용하여 얻을 수 있습니다.

이해가 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.