Magento 2: ¿Cómo obtener el valor de las opciones de atributo de cada entidad?

18

¿Cómo puedo obtener los valores de opciones de atributo de cada entidad?
Encontré una solución solo para magento 1.x pero M2 no lo sé.
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();

Alguien sabe, muéstrame paso a paso, por favor! Gracias!

MrTo-Kane
fuente

Respuestas:

55

puedes agregar al constructor de tu clase una instancia \Magento\Eav\Model\Configcomo esta:

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

entonces puedes usar eso en tu clase

$attribute = $this->eavConfig->getAttribute('catalog_product', 'attribute_code_here');
$options = $attribute->getSource()->getAllOptions();
Marius
fuente
¿Cómo obtener "valor" y "etiqueta"?
MrTo-Kane
1
ver cómo se ve el resultado. Var lo tira o algo así.
Marius
array (2) {[0] => array (2) {["value"] => int (1) ["label"] => object (Magento \ Framework \ Phrase) # 1504 (2) {["text ":" Magento \ Framework \ Phrase ": privado] => string (7)" Habilitado "[" argumentos ":" Magento \ Framework \ Phrase ": privado] => array (0) {}}} [1] = > array (2) {["value"] => int (2) ["label"] => object (Magento \ Framework \ Phrase) # 1494 (2) {["text": "Magento \ Framework \ Phrase" : privado] => cadena (8) "Desactivado" ["argumentos": "Magento \ Framework \ Phrase": privado] => array (0) {}}}}
MrTo-Kane
12
Comentario pequeño pero importante: si está disponible, es mejor usar la capa de servicio del módulo. Para cada atributo es \Magento\Eav\Api\Attribute RepositoryInterface. Todo lo que no esté marcado como @api se trata como privado y se puede eliminar en versiones menores.
KAndy
55
@KAndy Buen comentario. Puedes escribir eso como respuesta. Creo que es mucho mejor que el mío.
Marius
5

Puede hacerlo simplemente llamando el siguiente código dentro de su archivo Block.

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

Llame dentro de su archivo phtml,

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

Gracias.

Rakesh Jesadiya
fuente
Esto no devuelve las opciones para los atributos configurados para usar swatchentradas, como color. El getOptions()método está codificado para ciertos tipos de entrada, como "menús desplegables", por lo que omite las opciones de entrada de muestra. Solo un aviso si alguien más se topa con eso.
thaddeusmt
Hola @Rakesh, Cómo logro esto mismo pero para Admin. Necesito este valor de opción para el filtro de columna de cuadrícula. Puede usted por favor decirme.
Ravi Soni
5

Use el siguiente código para obtener todas las opciones de atributos.

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;

 }

¿Puede hacer clic aquí para obtener una explicación más detallada? http://www.pearlbells.co.uk/code-snippets/get-magento-attribute-options-programmatic/

Liz Eipe C
fuente
4

Utilizo la capa de servicio Api Magento\Eav\Api\AttributeRepositoryInterfacesugerida por @kandy en los comentarios sobre la respuesta de @marius.

Inyecte el miembro de datos de servicio en su constructor de la siguiente manera.

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

Y puedes obtener el atributo usando esto.

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

Para obtener la matriz de valores de opciones de atributo, use esto.

$options = $attribute->getSource()->getAllOptions();
dicho
fuente
2

Inyecte una instancia de \Magento\Catalog\Model\Product\Attribute\Repositoryen su constructor (en un bloque, clase auxiliar o donde sea):

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

Luego cree un método en su clase para obtener el atributo por código:

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

Luego puede llamar a este método así, por ejemplo, dentro de un archivo .phtml

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

Luego puede realizar llamadas en el objeto de atributo, por ejemplo

  1. Obtén opciones: $attribute->getOptions()
  2. Obtenga la etiqueta de la interfaz para cada tienda: $attrTest->getFrontendLabels()
  3. Depure la matriz de datos: 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] => Etiqueta de descarga del manual del producto [is_required] => 0 [ is_user_defined] => 1 [default_value] => Descarga del manual del producto [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]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 [1)

ajmedway
fuente
1
Esta es una respuesta muy bien explicada
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
fuente