Magento 2: รับ id ตัวเลือกคุณสมบัติของผลิตภัณฑ์ฉลากสำหรับผลิตภัณฑ์ที่กำหนดค่าได้


19

วิธีรับค่าตัวเลือกตามรหัสตัวเลือกใน Magento หรือรับรหัสตัวเลือกตามรหัสตัวเลือก

ตัวอย่าง:วิธีรับตัวเลือกแอตทริบิวต์สี id 10 จากป้ายกำกับ "สีแดง" และรับค่า "สีแดง" หากรหัสตัวเลือกคือ 10

คำตอบ:


46

คุณสามารถทำได้เช่นเดียวกับ magento 1

ข้อมูลเพิ่มเติมในรายละเอียดเยี่ยมชมรับรหัสตัวเลือกและฉลากจากผลิตภัณฑ์ที่กำหนดค่าได้

// รับเลเบลตัวเลือกโดยยึดตามรหัสตัวเลือกจากวัตถุผลิตภัณฑ์

$optionId = 10;

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

// รับรหัสตัวเลือกตามฉลากตัวเลือก

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

//get option id ex. 10

คุณช่วยบอกฉันได้ไหมว่าการใช้ $ attr-> usesSource () ในขณะที่รับตัวเลือกคุณลักษณะ
อะไร

ฉันมีตัวเลือกโดยไม่มีเงื่อนไขถ้าสิ่งที่คุณได้กล่าวถึงในรหัสของคุณ
Jaisa

คุณสามารถอธิบายถ้าฉันผิด
Jaisa

1
perfect rakesh bhai mlishu kyarek avad ma :)! ทำวันของฉัน !!! +1 :)
SagarPPanchal

ขอบคุณฉันใช้รหัสนี้ แต่ฉันประสบปัญหาในขณะนี้ ดูmagento.stackexchange.com/questions/256510/... อาจมีวิธีอื่นในการบรรลุผลลัพธ์เดียวกันหรือไม่?
Akif

12

แนวทางปฏิบัติที่ดีในวีโอไอพีคือการทำผ่าน 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>

สิ่งนี้จะได้รับค่าของคุณลักษณะการป้อนข้อมูลหรือ textarea หากคุณมีรายการแบบหล่นลงคุณควรใช้ประเภทข้อความดังนั้นเพิ่มบรรทัดนี้ในรายการอาร์กิวเมนต์:

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

ไม่จำเป็นต้องสร้างไฟล์หรือเขียนโค้ด php ใด ๆ เพื่อรับคุณสมบัติ วิธีนี้คุณจะมีความสอดคล้องและใช้ไฟล์ attribute.phtml เดียวกันสำหรับแอตทริบิวต์ทั้งหมด หากมีการเปลี่ยนแปลงบางอย่างคุณจำเป็นต้องเปลี่ยนแปลงในที่เดียวเท่านั้น


คุณเพิ่งบันทึกวันของฉันฉันไม่สามารถรับข้อความ 'แบบเลื่อนลง' และฉันพบสิ่งนี้ ขอบคุณมาก
อรุณกรรณวัฒน์


7

ฉันได้คำตอบง่ายๆ สิ่งนี้จะแสดงค่าคุณลักษณะพร้อมรหัสแอตทริบิวต์สำหรับผลิตภัณฑ์เท่านั้น ฉันตรวจสอบในหน้าแคตตาล็อกและรายละเอียดแล้ว

รหัสคือ

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

ขนาดที่นี่คือชื่อแอตทริบิวต์

การอ้างอิง: ผู้ขาย / magento / โมดูลแคตตาล็อก / ดู / ส่วนหน้า / แม่แบบ / ผลิตภัณฑ์ / ดู / attribute.phtml บรรทัด: 35


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

2

$product->getResource()มีโน้ต DocBlock เกี่ยวกับการคัดค้านอย่างน้อยใน v2.2.2 และฉันลังเลที่จะใช้รหัส มาด้วยวิธีนี้แทนแรงบันดาลใจจากคนที่มีอยู่แล้วในหน้านี้:

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

คุณเห็นรหัสนี้ที่ไหนใน Magento ดั้งเดิม? ฉันไม่สามารถหาgetResource()วิธีการในรุ่นนี้ได้: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/
......

getResource()เป็นวิธีการที่มีอยู่ก่อนหน้านี้ ใน v2.2.2 ตามที่ฉันกล่าวถึงมันถูกกำหนดไว้แล้วสำหรับการคัดค้าน ในสาขาพัฒนา 2.3 ฉันสงสัยว่ามันเสร็จสมบูรณ์แล้ว ดังนั้นตัวอย่างของฉันซึ่งไม่ต้องการฟังก์ชันนั้น
Joshua Fricke

1

สำหรับทุกคนมาที่นี่

หากคุณไม่มีเอนทิตีผลิตภัณฑ์ใด ๆ คุณสามารถเรียกคืนค่าตัวเลือกด้วยขั้นตอนนี้

ฉีด\Magento\Eav\Api\AttributeRepositoryInterfaceเข้าชั้นเรียนของคุณ

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

ใช้ repo เพื่อรับอินสแตนซ์ของแอตทริบิวต์

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

ใช้$attributeเพื่อรับรหัสตัวเลือกจากค่าตัวเลือก

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