Câu trả lời:
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
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ư brand
bạn làm một cái gì đó như thế này catalog_product_view.xml
chẳ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.
Đã làm cho tôi
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
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');
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
$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();
}
getResource()
phương thức trong mô hình này: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/
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 đó.
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\AttributeRepositoryInterface
và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]');
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);
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.