Magento 2: Nhận id tùy chọn chọn thuộc tính sản phẩm, nhãn cho sản phẩm có thể định cấu hình


19

Làm cách nào để có được giá trị tùy chọn dựa trên id tùy chọn trong Magento hoặc nhận id tùy chọn dựa trên mã tùy chọn?

Ví dụ: làm thế nào để có được tùy chọn màu thuộc tính id 10 từ nhãn "Red" và nhận giá trị "Red" nếu id tùy chọn là 10?

Câu trả lời:


46

bạn có thể làm điều đó giống như magento 1,

Thêm thông tin chi tiết, Truy cập, Nhận tùy chọn id và Nhãn từ sản phẩm có thể định cấu hình

// lấy nhãn tùy chọn dựa trên id tùy chọn từ đối tượng sản phẩm

$optionId = 10;

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

// lấy id tùy chọn dựa trên nhãn tùy chọn

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

//get option id ex. 10

Bạn có thể cho tôi biết việc sử dụng $ attr-> usedSource () trong khi nhận các tùy chọn thuộc tính là gì
Jaisa

Tôi có các tùy chọn mà không cần điều kiện nếu những gì bạn đã đề cập trong mã của mình
Jaisa

Bạn có thể giải thích, nếu tôi sai
Jaisa

1
hoàn hảo rakesh bhai mlishu kyarek avad ma :)! làm cho ngày của tôi !!! +1 :)
SagarPPanchal

Cảm ơn, tôi đã sử dụng đoạn mã này nhưng tôi đang gặp vấn đề. Xem magento.stackexchange.com/questions/256510/ . Có maybee một phương pháp thay thế để đạt được kết quả tương tự?
Akif

12

Thực hành tốt nhất trong magento là làm điều đó qua xml.

Để có được một thuộc tính tiêu chuẩn như brandbạn làm một cái gì đó như thế này catalog_product_view.xmlchẳng hạn:

<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>

Điều này sẽ nhận được giá trị của một thuộc tính đầu vào hoặc textarea. Nếu bạn có danh sách thả xuống, bạn nên sử dụng loại văn bản, vì vậy hãy thêm dòng này vào danh sách các đối số:

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

Không cần phải tạo tệp hoặc viết bất kỳ mã php nào để có được một thuộc tính. Bằng cách này, bạn sẽ có tính nhất quán và sử dụng cùng một tệp thuộc tính.phtml cho tất cả các thuộc tính. Nếu một cái gì đó thay đổi, bạn chỉ cần thay đổi nó ở một nơi duy nhất.


Bạn vừa lưu lại ngày của tôi, tôi không thể nhận được văn bản 'thả xuống' và tôi đã tìm thấy điều này. cảm ơn
Arun Karnaw

11

Đã làm cho tôi

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

6

Sử dụng phương pháp nhà máy

   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);
         }
    }

trong tập tin phtml

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

xin chào @Qaisar, chúng tôi có thể tạo thuộc tính theo chương trình mà không cần trình cài đặt không
jafar pinjar

@jafarpinjar vâng bạn có thể làm điều đó. sử dụng cùng mã.
Qaisar Satti

6

tôi nhận được một giải pháp đơn giản. điều này sẽ chỉ hiển thị giá trị thuộc tính với mã thuộc tính cho sản phẩm. tôi đã kiểm tra trong danh mục và trang chi tiết.

mã là

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

kích thước ở đây là tên thuộc tính.

tham khảo: nhà cung cấp / magento / mô-đun danh mục / xem / frontend / samples / sản phẩm / view / property.phtml dòng: 35


2

$product->getResource()có một lưu ý về DocBlock về việc không được chấp nhận ít nhất trong v2.2.2 và vì vậy tôi đã do dự khi sử dụng mã này. Đến với giải pháp này thay vì lấy cảm hứng từ những người đã có trên trang này:

$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
}

Để tham khảo, đây là phương thức trong 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();
}

Bạn thấy mã này ở đâu trong Magento gốc? Tôi thậm chí không thể tìm thấy getResource()phương thức trong mô hình này: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/
phỏng

getResource()là một phương pháp mà trước đây đã tồn tại. Trong v2.2.2 như tôi đã đề cập, nó đã được dự kiến ​​sẽ khấu hao. Trong nhánh phát triển 2.3 tôi nghi ngờ nó đã được hoàn thành. Vì vậy, ví dụ của tôi không yêu cầu chức năng đó.
Joshua Fricke

1

Cho mọi người đến đây.

Nếu bạn không có bất kỳ thực thể sản phẩm nào, bạn có thể truy xuất giá trị tùy chọn với các bước này.

Tiêm \Magento\Eav\Api\AttributeRepositoryInterfacevào lớp của bạn

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

Sử dụng repo để lấy ví dụ thuộc tính

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

Sử dụng $attributeđể lấy id tùy chọn từ giá trị tùy chọn

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

1

bạn có thể sử dụng để lấy nhãn thuộc tính

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

bạn có thể sử dụng trình quản lý đối tượng:

$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

Vui lòng thử mã này

Bước 1) Trước tiên, bạn phải tải sản phẩm

$_productCollection = $block->getLoadedProductCollection();

Bước 2) Trong trang danh sách sản phẩm, sẽ có một vòng lặp foreach để liệt kê các sản phẩm như thế này

foreach ($_productCollection as $_product)

Bước 3) Mã của bạn sẽ nằm trong vòng lặp này. Đặt mã bên dưới vào nơi bạn muốn hiển thị nhãn thuộc tính.

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

Chỉ cần thay your_attribution_code bằng bất cứ thứ gì thuộc tính của bạn được đặt tên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.