Magento 2 - Wie bekomme ich den Wert der Attributoptionen einer jeden Entität?

18

Wie kann ich die Attributoptionswerte von eav entity abrufen?
Ich habe nur für Magento 1.x eine Lösung gefunden, aber M2 kenne ich nicht.
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();

Wer weiß, zeig es mir Schritt für Schritt, bitte! Danke!

MrTo-Kane
quelle

Antworten:

55

Sie können dem Konstruktor Ihrer Klasse eine Instanz \Magento\Eav\Model\Configwie die folgende hinzufügen :

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

dann kannst du das in deiner Klasse benutzen

$attribute = $this->eavConfig->getAttribute('catalog_product', 'attribute_code_here');
$options = $attribute->getSource()->getAllOptions();
Marius
quelle
Wie bekomme ich "value" und "label"?
MrTo-Kane
1
Sehen Sie, wie das Ergebnis aussieht. Var lass es fallen oder so.
Marius
Array (2) {[0] => Array (2) {["value"] => int (1) ["label"] => Objekt (Magento \ Framework \ Phrase) # 1504 (2) {["text ":" Magento \ Framework \ Phrase ": privat] => string (7)" Aktiviert "[" Argumente ":" Magento \ Framework \ Phrase ": privat] => array (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
Kleine aber wichtige Bemerkung: Wenn vorhanden, besser Modul Service Layer verwenden. Für jedes Attribut ist es \Magento\Eav\Api\Attribute RepositoryInterface. Alles, was nicht als @api markiert ist, wird als privat behandelt und kann in kleineren Releases entfernt werden.
KAndy
5
@ KAndy Gute Bemerkung. Sie können das als Antwort schreiben. Ich denke, es ist viel besser als meins.
Marius
5

Rufen Sie dazu einfach den folgenden Code in Ihrer Block-Datei auf.

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

Rufen Sie in Ihrer HTML-Datei,

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

Vielen Dank.

Rakesh Jesadiya
quelle
Dies gibt nicht die Optionen für Attribute zurück, die für die Verwendung von swatchEingaben wie konfiguriert sind color. Die getOptions()Methode ist für bestimmte Eingabetypen, wie z. B. "Dropdowns", fest programmiert, sodass die Farbfelderingabeoptionen übersprungen werden. Nur ein Köpfchen, wenn sich jemand anders darum kümmert.
Thaddeusmt
Hallo @Rakesh, wie ich das gleich aber für Admin erreiche. Ich benötige diesen Optionswert für den Grid-Spaltenfilter. Kannst du mir bitte sagen.
Ravi Soni
5

Verwenden Sie den folgenden Code, um alle Attributoptionen abzurufen.

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;

 }

Bitte können Sie hier für eine genauere Erklärung klicken. http://www.pearlbells.co.uk/code-snippets/get-magento-attribute-options-programmatically/

Liz Eipe C
quelle
4

Ich verwende den Magento\Eav\Api\AttributeRepositoryInterfacevon @kandy vorgeschlagenen Api-Service-Layer in Kommentaren zur @marius-Antwort.

Fügen Sie das Servicedatenelement in Ihren Konstruktor wie folgt ein.

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

Und das können Sie das Attribut mit diesem bekommen.

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

Verwenden Sie diese Option, um ein Array mit Attributoptionswerten abzurufen.

$options = $attribute->getSource()->getAllOptions();
sagte
quelle
2

Injizieren Sie eine Instanz von \Magento\Catalog\Model\Product\Attribute\Repositoryin Ihrem Konstruktor (in einem Block, einer Hilfsklasse oder wo auch immer):

/**
 * @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;
    ...
}

Erstellen Sie dann eine Methode in Ihrer Klasse, um das Attribut per Code abzurufen:

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

Sie können diese Methode dann wie folgt aufrufen, z. B. in einer .phtml-Datei

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

Anschließend können Sie das Attributobjekt aufrufen, z

  1. Optionen abrufen: $attribute->getOptions()
  2. Holen Sie sich Frontend-Label für jedes Geschäft: $attrTest->getFrontendLabels()
  3. Debuggen Sie das Datenarray: 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_input] => text [frontend_label] => Produkthandbuch Download Label [is_required] => 0 [ is_user_defined] => 1 [default_value] => Produkthandbuch Download [is_unique] => 0 [is_global] => 0 [is_visible] => 1 [is_searchable] => 0 [is_filterable] => 0 [is_comparable] => 0 [ 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_sort_by] => 0 [is_visible_in_advanced]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_filterable_in_grid] => 1 [search_weight]

ajmedway
quelle
1
Dies ist eine sehr gut erklärte Antwort
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();  
Divya
quelle