Pertanyaan Magento - Ambil produk dengan nilai atribut tertentu


Dalam kode blok saya, saya mencoba mengambil daftar produk yang memiliki atribut dengan nilai tertentu secara terprogram.

Bergantian jika itu tidak mungkin bagaimana seseorang akan mengambil semua produk kemudian menyaring mereka hanya daftar produk dengan atribut tertentu?

Bagaimana saya melakukan pencarian menggunakan filter boolean standar AND atau OR untuk mencocokkan subkumpulan produk saya?


76
2017-08-26 06:41


asal


Jawaban:


Hampir semua Model Magento memiliki objek Koleksi yang sesuai yang dapat digunakan untuk mengambil beberapa contoh Model.

Untuk memberi contoh koleksi Produk, lakukan hal berikut

$collection = Mage::getModel('catalog/product')->getCollection();

Produk adalah model Gaya Magento EAV, jadi Anda harus menambahkan atribut tambahan apa pun yang ingin Anda kembalikan.

$collection = Mage::getModel('catalog/product')->getCollection();

//fetch name and orig_price into data
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

Ada beberapa sintaks untuk pengaturan filter pada koleksi. Saya selalu menggunakan verbose satu di bawah ini, tetapi Anda mungkin ingin memeriksa sumber Magento untuk cara-cara tambahan metode penyaringan dapat digunakan.

Berikut ini menunjukkan cara memfilter berdasarkan rentang nilai (lebih besar dari DAN kurang dari)

$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'),
));

Sementara ini akan menyaring dengan nama yang sama dengan satu hal ATAU lainnya.

$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'),        
));

Daftar lengkap dari conditional short yang didukung (eq, lt, dll.) Dapat ditemukan di _getConditionSql metode dalam lib/Varien/Data/Collection/Db.php

Akhirnya, semua koleksi Magento dapat diulangi (kelas koleksi dasar mengimplementasikan pada antarmuka iterator). Ini adalah bagaimana Anda akan mengambil produk Anda setelah filter ditetapkan.

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

160
2017-08-27 04:01



Ini adalah tindak lanjut dari pertanyaan awal saya untuk membantu orang lain dengan masalah yang sama. Jika Anda perlu memfilter berdasarkan atribut, daripada mencari id secara manual, Anda dapat menggunakan kode berikut untuk mengambil semua id, pasangan nilai untuk atribut. Data dikembalikan sebagai larik dengan nama atribut sebagai kuncinya.

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

Berikut ini adalah fungsi yang dapat Anda gunakan untuk mendapatkan produk berdasarkan atribut set id-nya. Diperoleh menggunakan fungsi sebelumnya.

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

7
2018-01-27 22:34



$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>";
}

5
2017-09-05 17:36



Mendapatkan TEXT atribut yang ditambahkan dari admin ke ujung depan pada halaman daftar produk.

Terima kasih Anita Mourya

Saya telah menemukan ada dua metode. Katakan atribut produk yang disebut "na_author" ditambahkan dari backend sebagai bidang teks.

METODE 1

di list.phtml

<?php $i=0; foreach ($_productCollection as $_product): ?>

UNTUK SETIAP BEBAN PRODUK OLEH SKU DAN DAPATKAN ATTRIBUT DI DALAM 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 "";}
?>

METODE 2

Mage/Catalog/Block/Product/List.phtml LEBIH JAUH dan diset dalam 'folder lokal'

yaitu Salin Dari

Mage/Catalog/Block/Product/List.phtml

dan PASTE TO

app/code/local/Mage/Catalog/Block/Product/List.phtml

ubah fungsi dengan menambahkan 2 baris yang ditampilkan dalam huruf tebal di bawah ini.

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;

}

dan Anda akan senang melihatnya .... !!


3
2017-09-06 10:41



buat nama atribut adalah "price_screen_tab_name". dan akses menggunakan rumus sederhana ini.

<?php $_product = $this->getProduct(); ?>
<?php echo $_product->getData('price_screen_tab_name');?>

2
2018-06-09 09:09



Saya telah menambahkan baris

$this->_productCollection->addAttributeToSelect('releasedate');

di

app / code / core / Mage / Catalog / Block / Product / List.php on line 95

dalam fungsi _getProductCollection() 

dan kemudian memanggilnya

app / design / frontend / default / hellopress / template / katalog / produk / list.phtml

Dengan menulis kode

<div><?php echo $this->__('Release Date: %s', $this->dateFormat($_product->getReleasedate())) ?>
</div>

Sekarang bekerja di Magento 1.4.x


0
2018-06-04 22:20