Magento 2 - วิธีการรับค่าตัวเลือกคุณลักษณะของเอนทิตี eav?


18

ฉันจะรับค่าตัวเลือกคุณลักษณะของเอนทิตี eav ได้อย่างไร
ฉันพบวิธีแก้ปัญหาเฉพาะสำหรับ magento 1.x แต่ M2 ฉันไม่รู้
M1:

$attr = Mage::getResourceModel('eav/entity_attribute_collection')->setCodeFilter('specialty')->getData()[0];
$attributeModel = Mage::getModel('eav/entity_attribute')->load($attr['attribute_id']);
$src =  $attributeModel->getSource()->getAllOptions();

ใครรู้แสดงทีละขั้นตอนขอบคุณ!

คำตอบ:


55

คุณสามารถเพิ่มอินสแตนซ์ของคลาสของคุณในคลาส\Magento\Eav\Model\Configนี้ได้:

protected $eavConfig;
public function __construct(
    ...
    \Magento\Eav\Model\Config $eavConfig,
    ...
){
    ...
    $this->eavConfig = $eavConfig;
    ...
}

จากนั้นคุณสามารถใช้สิ่งนั้นในชั้นเรียนของคุณ

$attribute = $this->eavConfig->getAttribute('catalog_product', 'attribute_code_here');
$options = $attribute->getSource()->getAllOptions();

จะรับ "value" และ "label" ได้อย่างไร?
MrTo-Kane

1
ดูว่าผลลัพธ์มีลักษณะอย่างไร Var ทิ้งมันหรืออะไรซักอย่าง
Marius

array (2) {[0] => array (2) {["value"] => int (1) ["label"] => วัตถุ (Magento \ Framework \ Phrase) # 1504 (2) {["ข้อความ ":" Magento \ Framework \ Phrase ": private] => string (7)" Enabled "[" อาร์กิวเมนต์ ":" Magento \ Framework \ Phrase ": ส่วนตัว] => อาร์เรย์ (0) {}}} [1] = > array (2) {["value"] => int (2) ["label"] => object (Magento \ Framework \ Phrase) # 1494 (2) {["text": "Magento \ Framework \ Phrase" : private] => string (8) "Disabled" ["arguments": "Magento \ Framework \ Phrase": private] => array (0) {}}}}
MrTo-Kane

12
หมายเหตุเล็ก แต่สำคัญ: ถ้ามีควรใช้ Module Service Layer สำหรับ eav \Magento\Eav\Api\Attribute RepositoryInterfaceแอตทริบิวต์ของมัน สิ่งใดที่ไม่ได้ทำเครื่องหมายเป็น @api ถือว่าเป็นส่วนตัวและสามารถลบออกได้ในรุ่นย่อย
KAndy

5
@ KAndy คำพูดที่ดี คุณสามารถเขียนเป็นคำตอบ ฉันคิดว่ามันดีกว่าของฉันมาก
Marius

5

คุณสามารถทำได้ง่ายๆเพียงโทรไปที่โค้ดด้านล่างในไฟล์บล็อกของคุณ

<?php
namespace Vendor\Package\Block;

class Blockname extends \Magento\Framework\View\Element\Template
{
    protected $_productAttributeRepository;

    public function __construct(        
        \Magento\Framework\View\Element\Template\Context $context,   
        \Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository,
        array $data = [] 
    ){        
        parent::__construct($context,$data);
        $this->_productAttributeRepository = $productAttributeRepository;
    } 

    public function getAllBrand(){
        $manufacturerOptions = $this->_productAttributeRepository->get('manufacturer')->getOptions();       
        $values = array();
        foreach ($manufacturerOptions as $manufacturerOption) { 
           //$manufacturerOption->getValue();  // Value
            $values[] = $manufacturerOption->getLabel();  // Label
        }
        return $values;
    }  
}

โทรภายในไฟล์ phtml ของคุณ

<div class="manufacturer-name">
      <?php $getOptionValue = $this->getAllBrand();?>
      <?php foreach($getOptionValue as $value){ ?>
           <span><?php echo $value;?></span>
      <?php } ?>
</div>

ขอบคุณ


นี้ไม่ได้กลับตัวเลือกสำหรับแอตทริบิวต์การกำหนดค่าการใช้ปัจจัยการผลิตเช่นswatch วิธีการที่เขียนยากประเภทการป้อนข้อมูลบางอย่างเช่น "เมนูแบบเลื่อนลง" ดังนั้นจึงข้ามตัวเลือกอินพุตแถบ แค่หัวขึ้นถ้าใครวิ่งเข้าไปในนั้น colorgetOptions()
thaddeusmt

สวัสดี @Rakesh ฉันจะประสบความสำเร็จเช่นนี้ได้อย่างไร แต่สำหรับผู้ดูแลระบบ ฉันต้องการค่าตัวเลือกเหล่านี้สำหรับตัวกรองคอลัมน์กริด คุณกรุณาบอกฉันที
Ravi Soni

5

ใช้รหัสต่อไปนี้เพื่อรับตัวเลือกคุณลักษณะทั้งหมด

function getExistingOptions( $object_Manager ) {

$eavConfig = $object_Manager->get('\Magento\Eav\Model\Config');
$attribute = $eavConfig->getAttribute('catalog_product', 'color');
$options = $attribute->getSource()->getAllOptions();

$optionsExists = array();

foreach($options as $option) {
    $optionsExists[] = $option['label'];
}

return $optionsExists;

 }

กรุณาคลิกที่นี่เพื่อดูคำอธิบายอย่างละเอียด http://www.pearlbells.co.uk/code-snippets/get-magento-attribute-options-programmatically/


4

ฉันใช้ Api Service Layer Magento\Eav\Api\AttributeRepositoryInterfaceแนะนำโดย @kandy ในความคิดเห็นที่ @marius คำตอบ

ฉีดสมาชิกบริการข้อมูลในตัวสร้างของคุณดังนี้

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

และคุณสามารถรับคุณลักษณะนี้ได้

$attribute = $this->eavAttributeRepository->get(
    \Magento\Catalog\Model\Product::ENTITY,
    'attribute_code_here'
);
// var_dump($attribute->getData()); 

เพื่อให้ได้รับอาร์เรย์ค่าตัวเลือกคุณลักษณะใช้สิ่งนี้

$options = $attribute->getSource()->getAllOptions();

2

ฉีดอินสแตนซ์\Magento\Catalog\Model\Product\Attribute\Repositoryในคอนสตรัคเตอร์ของคุณ (ในบล็อกคลาสผู้ช่วยหรือที่ใดก็ได้):

/**
 * @var \Magento\Catalog\Model\Product\Attribute\Repository $_productAttributeRepository
 */
protected $_productAttributeRepository;

/**
 * ...
 * @param \Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository
 * ...
 */
public function __construct(
    ...
    \Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository,
    ...
) {
    ...
    $this->_productAttributeRepository = $productAttributeRepository;
    ...
}

จากนั้นสร้างวิธีการในชั้นเรียนของคุณเพื่อรับแอตทริบิวต์ด้วยรหัส:

/**
 * Get single product attribute data 
 *
 * @return Magento\Catalog\Api\Data\ProductAttributeInterface
 */
public function getProductAttributeByCode($code)
{
    $attribute = $this->_productAttributeRepository->get($code);
    return $attribute;
}

จากนั้นคุณสามารถเรียกวิธีนี้ได้เช่นในไฟล์. phtml

$attrTest = $block->getProductAttributeByCode('test');

จากนั้นคุณสามารถโทรไปที่วัตถุคุณลักษณะเช่น

  1. รับตัวเลือก: $attribute->getOptions()
  2. รับส่วนหน้าฉลากสำหรับแต่ละร้านค้า: $attrTest->getFrontendLabels()
  3. ดีบักอาร์เรย์ข้อมูล: echo '> ' . print_r($attrTest->debug(), true);

debug: Array ([attribute_id] => 274 [entity_type_id] => 4 [attribute_code] => product_manual_download_label [backend_type] => varchar [frontend_inabel] => ข้อความ [frontend_label] => ฉลากดาวน์โหลดคู่มือผลิตภัณฑ์ [is_required] => 0 is_user_defined] => 1 [default_value] => ดาวน์โหลดคู่มือผลิตภัณฑ์ [is_unique] => 0 [is_global] => 0 [is_visible] => 1 [is_searchable] => 0 [is_comilable] => 0 [is_comparable] => 0 [is_comilable] => 0 [is_unique] is_visible_on_front] => 0 [is_html_allowed_on_front] => 1 [is_used_for_price_rules] => 0 [is_filterable_in_search] => 0 [used_in_product_listing] => 0 [used_for_ort_by_info]> => 0 [used_for_ort_by_features_on_front_choice] => 0 [ใช้แล้ว0 [is_wysiwyg_enabled] => 0 [is_used_for_promo_rules] => 0 [is_required_in_admin_store] => 0 [is_used_in_grid] => 1 [is_visible_in_grid] 1> is_visible_in_grid = 1


1
นี่เป็นคำตอบที่อธิบายได้ดีมาก
domdambrogia

0
   <?php
      /* to load the Product */
  $_product = $block->getProduct();
  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
  $attributeSet = $objectManager- 
   >create('Magento\Eav\Api\AttributeSetRepositoryInterface');
  $attributeSetRepository = $attributeSet->get($_product->getAttributeSetId());
  $_attributeValue  = $attributeSetRepository->getAttributeSetName();  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.