마 젠토 2 : 구성 가능한 제품에 대한 제품 속성의 선택 옵션 ID, 레이블 가져 오기


19

Magento의 옵션 ID를 기반으로 옵션 값을 얻거나 옵션 코드를 기반으로 옵션 ID를 얻는 방법은 무엇입니까?

예 : 레이블 "Red"에서 색상 속성 옵션 id 10을 가져오고 옵션 id가 10 인 경우 "Red"값을 얻는 방법은 무엇입니까?

답변:


46

마 젠토 1과 동일하게 할 수 있습니다.

자세한 내용은 방문, 구성 가능한 제품의 옵션 ID 및 레이블 가져 오기 를 참조하십시오.

// 제품 객체에서 옵션 ID를 기반으로 옵션 레이블 가져 오기

$optionId = 10;

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $optionText = $attr->getSource()->getOptionText($optionId);
 }
//get option text ex. Red

// 옵션 레이블을 기반으로 옵션 ID를 얻습니다.

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $option_id = $attr->getSource()->getOptionId("Red");
 }

//get option id ex. 10

속성 옵션을받는 동안 $ attr-> usesSource ()의 사용법을 알려줄 수 있습니까
Jaisa

코드에서 언급 한 if 조건이없는 옵션이 있습니다.
Jaisa

내가 틀렸다면 설명해 주실 수 있습니까
Jaisa

1
완벽한 rakesh bhai mlishu kyarek avad ma :)! 나의 하루를 만들었다! !! +1 :)
SagarPPanchal

감사합니다.이 코드를 사용했지만 지금 문제에 직면하고 있습니다. magento.stackexchange.com/questions/256510/…을 참조하십시오 . 같은 결과를 얻을 수있는 대체 방법이 있습니까?
Akif

12

magento의 모범 사례는 xml을 통해 수행하는 것입니다.

예를 들어 brand다음과 같은 표준 속성을 얻으려면 다음과 같이하십시오 catalog_product_view.xml.

<referenceBlock name="product.info.main">
    <block class="Magento\Catalog\Block\Product\View\Description" name="product.info.brand" template="product/view/attribute.phtml" before="-">
        <arguments>
            <argument name="at_call" xsi:type="string">getBrand</argument>
            <argument name="at_code" xsi:type="string">brand</argument>
            <argument name="css_class" xsi:type="string">brand</argument>
            <argument name="at_label" xsi:type="string">none</argument>
            <argument name="add_attribute" xsi:type="string">itemprop="brand"</argument>
        </arguments>
    </block>
</referenceBlock>

입력 속성 또는 텍스트 영역의 값을 가져옵니다. 드롭 다운이있는 경우 텍스트 유형을 사용해야하므로 인수 목록에이 행을 추가하십시오.

<argument name="at_type" xsi:type="string">text</argument>

속성을 얻기 위해 파일을 만들거나 PHP 코드를 작성할 필요가 없습니다. 이런 식으로 일관성을 유지하고 모든 속성에 대해 동일한 attribute.phtml 파일을 사용합니다. 무언가가 바뀌면 한곳에서만 바꾸어야합니다.


당신은 내 하루를 저장, 나는 '드롭 다운'텍스트를 얻을 수 없었는데, 나는 이것을 발견했다. 감사합니다.
Arun Karnawat

11

나를 위해 일했다

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);

6

공장 방법 사용

   protected $_attributeLoading;

   public function __construct( 
        .....
          \Magento\Catalog\Model\ResourceModel\ProductFactory   $attributeLoading,  
          ....
                                ) {
            parent::__construct($context);

            ....
            $this->_attributeLoading = $attributeLoading;
            ....

    }


   public function getAttributeOptionId($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_id = $attr->getSource()->getOptionId($label);
         }
    }
   public function getAttributeOptionText($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_Text = $attr->getSource()->getOptionText($label);
         }
    }

phtml 파일에서

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');

안녕 @ Qaisar, 우리는 설치 프로그램없이 프로그래밍 방식으로 속성을 만들 수 있습니다
jafar pinjar

@jafarpinjar 그렇습니다. 동일한 코드를 사용합니다.
Qaisar Satti

6

간단한 해결책을 얻습니다. 제품의 속성 코드와 함께 속성 값만 표시됩니다. 카탈로그 및 세부 사항 페이지를 체크인했습니다.

코드는

<?php echo $_product->getAttributeText('size'); ?>

여기 size는 속성 이름입니다.

참조 : vendor / magento / module-catalog / view / frontend / templates / product / view / attribute.phtml 줄 : 35


2

$product->getResource()v2.2.2 이상에서 더 이상 사용되지 않는 DocBlock 메모가 있으므로이를 사용하여 코드를 작성하는 것을 주저했습니다. 이미이 페이지에있는 솔루션에서 영감을 얻은이 솔루션을 생각해 냈습니다.

$optionId = $product->getDataByKey('attribute_code');
$optionText = null;
$attributes = $product->getAttributes();
if ($optionId && array_key_exists('attribute_code', $attributes)) {
    $attr = $attributes['attribute_code'];
    if ($attr->usesSource()) {
        $optionText = $attr->getSource()->getOptionText($optionId);
    }
}
if ($optionText) {
    //do something with $optionText
}

참고로 이것은 AbstractModel.php의 메소드입니다.

/**
 * Retrieve model resource
 *
 * @return \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 * @deprecated 101.0.0 because resource models should be used directly
 */
public function getResource()
{
    return $this->_getResource();
}

오리지널 마 젠토에서이 코드는 어디에 있습니까? getResource()이 모델에서는 방법을 찾을 수 없습니다 : github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix

getResource()이전에 존재했던 방법이었습니다. 내가 언급 한 v2.2.2에서는 이미 사용 중단 예정입니다. 2.3 개발 브랜치에서 나는 그것이 완료되었다고 생각합니다. 따라서 그 기능을 필요로하지 않는 나의 예.
Joshua Fricke

1

모두가 여기에 온다.

제품 엔터티가없는 경우이 단계를 통해 옵션 값을 검색 할 수 있습니다.

\Magento\Eav\Api\AttributeRepositoryInterface수업에 주입

public function __construct(
    ...
    \Magento\Eav\Api\AttributeRepositoryInterface $attributeRepository,
    ...
) {
    ...
    $this->attributeRepository = $attributeRepository;
    ...
}

저장소를 사용하여 속성 인스턴스 가져 오기

// 4 is the default entity_type_id for product
$attribute = $this->attributeRepository->get('4', '[attribute_code]');

$attribute옵션 값에서 옵션 ID를 가져 오는 데 사용

$optionId = $attribute->getSource()->getOptionId('[option_value]');

1

속성 레이블을 얻는 데 사용할 수 있습니다

$product->getResource()->getAttribute($key)->getFrontend()->getLabel($product);

객체 관리자를 사용할 수 있습니다 :

$pid = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$pdata = $objectManager->create('Magento\Catalog\Model\Product')->load($pid);

$getlable = $pdata->getResource()->getAttribute($key)->getFrontend()->getLabel($pdata);

0

이 코드를 시도하십시오

1 단계) 먼저 제품을로드해야합니다

$_productCollection = $block->getLoadedProductCollection();

2 단계) 제품 목록 페이지에서 다음과 같은 제품을 나열하기위한 foreach 루프가 있습니다.

foreach ($_productCollection as $_product)

3) 코드는이 루프 안에 있습니다. 속성 레이블을 표시하려는 위치에 아래 코드를 배치하십시오.

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);

your_attribute_code 를 속성 이름으로 바꾸 십시오 .

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