php - Magento: recupera productos con un valor de atributo específico
e-commerce entity-attribute-value (6)
En mi código de bloque, estoy tratando de recuperar programáticamente una lista de productos que tienen un atributo con un valor específico.
Alternativamente, si eso no es posible, ¿cómo se recuperarían todos los productos y luego se filtrarían para enumerar simplemente los productos con un atributo específico?
¿Cómo realizaría una búsqueda utilizando los filtros booleanos estándar AND
o OR
para hacer coincidir un subconjunto de mis productos?
Casi todos los modelos de Magento tienen un objeto de colección correspondiente que se puede usar para buscar varias instancias de un modelo.
Para instanciar una colección de productos, haga lo siguiente
$collection = Mage::getModel(''catalog/product'')->getCollection();
Los productos son un modelo de estilo Magento EAV, por lo que deberá agregar cualquier atributo adicional que desee devolver.
$collection = Mage::getModel(''catalog/product'')->getCollection();
//fetch name and orig_price into data
$collection->addAttributeToSelect(''name'');
$collection->addAttributeToSelect(''orig_price'');
Hay varias sintaxis para configurar filtros en colecciones. Siempre uso la detallada a continuación, pero es posible que desee inspeccionar la fuente de Magento para conocer las formas adicionales en que se pueden usar los métodos de filtrado.
A continuación, se muestra cómo filtrar por un rango de valores (mayor que AND menor que)
$collection = Mage::getModel(''catalog/product'')->getCollection();
$collection->addAttributeToSelect(''name'');
$collection->addAttributeToSelect(''orig_price'');
//filter for products whose orig_price is greater than (gt) 100
$collection->addFieldToFilter(array(
array(''attribute''=>''orig_price'',''gt''=>''100''),
));
//AND filter for products whose orig_price is less than (lt) 130
$collection->addFieldToFilter(array(
array(''attribute''=>''orig_price'',''lt''=>''130''),
));
Si bien esto se filtrará por un nombre que equivale a una cosa u otra.
$collection = Mage::getModel(''catalog/product'')->getCollection();
$collection->addAttributeToSelect(''name'');
$collection->addAttributeToSelect(''orig_price'');
//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
array(''attribute''=>''name'',''eq''=>''Widget A''),
array(''attribute''=>''name'',''eq''=>''Widget B''),
));
Se puede encontrar una lista completa de los condicionales cortos soportados (eq, lt, etc.) en el método _getConditionSql
en lib/Varien/Data/Collection/Db.php
Finalmente, todas las colecciones de Magento pueden repetirse (la clase de colección base implementa una de las interfaces del iterador). Así es como agarrarás tus productos una vez que se establezcan los filtros.
$collection = Mage::getModel(''catalog/product'')->getCollection();
$collection->addAttributeToSelect(''name'');
$collection->addAttributeToSelect(''orig_price'');
//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
array(''name''=>''orig_price'',''eq''=>''Widget A''),
array(''name''=>''orig_price'',''eq''=>''Widget B''),
));
foreach ($collection as $product) {
//var_dump($product);
var_dump($product->getData());
}
Este es un seguimiento de mi pregunta original para ayudar a otros con el mismo problema. Si necesita filtrar por un atributo, en lugar de buscar manualmente el ID, puede usar el siguiente código para recuperar todos los pares de ID y valor para un atributo. Los datos se devuelven como una matriz con el nombre del atributo como la clave.
function getAttributeOptions($attributeName) {
$product = Mage::getModel(''catalog/product'');
$collection = Mage::getResourceModel(''eav/entity_attribute_collection'')
->setEntityTypeFilter($product->getResource()->getTypeId())
->addFieldToFilter(''attribute_code'', $attributeName);
$_attribute = $collection->getFirstItem()->setEntity($product->getResource());
$attribute_options = $_attribute->getSource()->getAllOptions(false);
foreach($attribute_options as $val) {
$attrList[$val[''label'']] = $val[''value''];
}
return $attrList;
}
Aquí hay una función que puede usar para obtener productos por su id. De conjunto de atributos. Obtenido usando la función anterior.
function getProductsByAttributeSetId($attributeSetId) {
$products = Mage::getModel(''catalog/product'')->getCollection();
$products->addAttributeToFilter(''attribute_set_id'',$attributeSetId);
$products->addAttributeToSelect(''*'');
$products->load();
foreach($products as $val) {
$productsArray[] = $val->getData();
}
return $productsArray;
}
He agregado línea
$this->_productCollection->addAttributeToSelect(''releasedate'');
en
app / code / core / Mage / Catalog / Block / Product / List.php en línea 95
en la función _getProductCollection()
y luego llamarlo
app / design / frontend / default / hellopress / template / catalog / product / list.phtml
Al escribir el código
<div><?php echo $this->__(''Release Date: %s'', $this->dateFormat($_product->getReleasedate())) ?>
</div>
Ahora está funcionando en Magento 1.4.x.
Obtener los atributos TEXT
agregados desde el administrador al front-end en la página de listado de productos.
Gracias Anita Mourya
He encontrado que hay dos métodos. Permita que el atributo de producto denominado "na_author" se agregue desde el back-end como campo de texto.
MÉTODO 1
en list.phtml
<?php $i=0; foreach ($_productCollection as $_product): ?>
PARA CADA PRODUCTO, CARGAR POR SKU Y OBTENER ATRIBUTO DENTRO DE FOREACH
<?php
$product = Mage::getModel(''catalog/product'')->loadByAttribute(''sku'',$_product->getSku());
$author = $product[''na_author''];
?>
<?php
if($author!=""){echo "<br /><span class=''home_book_author''>By ".$author ."</span>";} else{echo "";}
?>
MÉTODO 2
Mage/Catalog/Block/Product/List.phtml
OVER RIDE y establecido en ''carpeta local''
es decir, copia de
Mage/Catalog/Block/Product/List.phtml
y PEGAR A
app/code/local/Mage/Catalog/Block/Product/List.phtml
cambie la función agregando 2 líneas que se muestran en negrita a continuación.
protected function _getProductCollection()
{
if (is_null($this->_productCollection)) {
$layer = Mage::getSingleton(''catalog/layer'');
/* @var $layer Mage_Catalog_Model_Layer */
if ($this->getShowRootCategory()) {
$this->setCategoryId(Mage::app()->getStore()->getRootCategoryId());
}
// if this is a product view page
if (Mage::registry(''product'')) {
// get collection of categories this product is associated with
$categories = Mage::registry(''product'')->getCategoryCollection()
->setPage(1, 1)
->load();
// if the product is associated with any category
if ($categories->count()) {
// show products from this category
$this->setCategoryId(current($categories->getIterator()));
}
}
$origCategory = null;
if ($this->getCategoryId()) {
$category = Mage::getModel(''catalog/category'')->load($this->getCategoryId());
if ($category->getId()) {
$origCategory = $layer->getCurrentCategory();
$layer->setCurrentCategory($category);
}
}
$this->_productCollection = $layer->getProductCollection();
$this->prepareSortableFieldsByCategory($layer->getCurrentCategory());
if ($origCategory) {
$layer->setCurrentCategory($origCategory);
}
}
**//CMI-PK added na_author to filter on product listing page//
$this->_productCollection->addAttributeToSelect(''na_author'');**
return $this->_productCollection;
}
y estarás feliz de verlo ... !!
create attribute name es " price_screen_tab_name
". y accede usando esta simple fórmula.
<?php $_product = $this->getProduct(); ?>
<?php echo $_product->getData(''price_screen_tab_name'');?>
$attribute = Mage::getModel(''eav/entity_attribute'')
->loadByCode(''catalog_product'', ''manufacturer'');
$valuesCollection = Mage::getResourceModel(''eav/entity_attribute_option_collection'')
->setAttributeFilter($attribute->getData(''attribute_id''))
->setStoreFilter(0, false);
$preparedManufacturers = array();
foreach($valuesCollection as $value) {
$preparedManufacturers[$value->getOptionId()] = $value->getValue();
}
if (count($preparedManufacturers)) {
echo "<h2>Manufacturers</h2><ul>";
foreach($preparedManufacturers as $optionId => $value) {
$products = Mage::getModel(''catalog/product'')->getCollection();
$products->addAttributeToSelect(''manufacturer'');
$products->addFieldToFilter(array(
array(''attribute''=>''manufacturer'', ''eq''=> $optionId,
));
echo "<li>" . $value . " - (" . $optionId . ") - (Products: ".count($products).")</li>";
}
echo "</ul>";
}