Câu hỏi Magento - Lấy các sản phẩm có giá trị thuộc tính cụ thể


Trong mã khối của tôi, tôi đang cố truy xuất một danh sách các sản phẩm có thuộc tính với một giá trị cụ thể.

Cách khác, nếu đó là không thể làm thế nào một trong những sẽ lấy tất cả các sản phẩm sau đó lọc chúng để chỉ danh sách các sản phẩm với một thuộc tính cụ thể?

Làm cách nào tôi thực hiện tìm kiếm bằng bộ lọc boolean tiêu chuẩn AND hoặc là OR để phù hợp với một tập hợp con các sản phẩm của tôi?


76
2017-08-26 06:41


gốc




Các câu trả lời:


Hầu như tất cả các Mô hình Magento đều có một đối tượng Bộ sưu tập tương ứng có thể được sử dụng để tìm nạp nhiều phiên bản của một Mô hình.

Để khởi tạo bộ sưu tập Sản phẩm, hãy làm như sau

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

Sản phẩm là kiểu mẫu Magento EAV, vì vậy bạn sẽ cần phải thêm vào bất kỳ thuộc tính bổ sung nào mà bạn muốn trả lại.

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

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

Có nhiều cú pháp để đặt bộ lọc trên bộ sưu tập. Tôi luôn luôn sử dụng một trong những tiết dưới đây, nhưng bạn có thể muốn kiểm tra nguồn Magento cho những cách bổ sung các phương pháp lọc có thể được sử dụng.

Phần sau đây cho thấy cách lọc theo phạm vi giá trị (lớn hơn AND nhỏ hơn)

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

Mặc dù điều này sẽ lọc theo tên bằng một thứ HOẶC một tên khác.

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

Danh sách đầy đủ các điều kiện ngắn được hỗ trợ (eq, lt, v.v.) có thể được tìm thấy trong _getConditionSql phương pháp trong lib/Varien/Data/Collection/Db.php

Cuối cùng, tất cả các bộ sưu tập Magento có thể được lặp lại (lớp cơ sở thu thập thực hiện trên các giao diện của trình lặp). Đây là cách bạn sẽ lấy sản phẩm của mình khi bộ lọc được đặt.

$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



câu trả lời rất chi tiết. cảm ơn! - Rick J
Cảm ơn bạn rất nhiều vì câu trả lời chi tiết. Bạn đã đặt tôi dọc theo con đường bên phải. Tôi đã thực hiện một var_dump kết quả từ mã ví dụ của bạn. Bởi vì thuộc tính tôi đang làm việc với một mục chọn nhiều, tôi nhận được một số id trong các kết quả nên so sánh văn bản không hoạt động. VÍ DỤ. $ this-> collection-> addFieldToFilter (mảng (mảng ('thuộc tính' => 'cw_category', 'eq' => 'Aero'), mảng ('thuộc tính' => 'cw_category', 'eq' => 'Theo dõi '), mảng (' thuộc tính '=>' cw_category ',' eq '=>' Tham quan '))); Đang trả về 'cw_category' => string ', 536,535,534' (length = 12) - Christian
Không thể giúp bạn một cách cụ thể mà không cần đào nhiều (StackOverflow rep là tốt, nhưng nó không trả tiền hóa đơn). Hai con đường để bạn theo đuổi. Đầu tiên, như đã đề cập, checkout _getConditionSql cho một danh sách tất cả các toán tử so sánh có thể. Thứ hai, nếu bạn kiểm tra PHPDoc cho phương thức addAttributeToFilter trên Mage_Eav_Model_Entity_Collection_Abstract, bạn sẽ thấy rằng một trong các giá trị kỳ vọng của tham số đầu tiên là một Mage_Eav_Model_Entity_Attribute_Interface. Điều đó có thể dẫn bạn vào con đường chính xác. - Alan Storm
Alan, cảm ơn những lời khuyên bổ sung. Tôi đã đi qua các mã trong nhiều giờ và không có may mắn. Tôi đã học được rất nhiều về Magento trong quá trình mặc dù vậy tôi đoán nó không phải là tất cả xấu. Tôi quản lý để có được trình gỡ lỗi sql làm việc. Có vẻ như bây giờ tôi sẽ chỉ sử dụng ID thuộc tính trong tiêu chí lọc của mình. ví dụ. ...-> addAttributeToFilter ('cw_category', '536') thay vì -> addAttributeToFilter ('cw_category', 'Aero') chẳng hạn. - Christian
Tôi đã thấy đó là một cách phổ biến để xử lý nó. Tôi nghĩ cách bạn đang "giả định" để làm điều này là khởi tạo và thuộc tính của đối tượng thuộc loại bạn muốn, và truyền cho một trong các phương thức lọc. - Alan Storm


Đây là một câu hỏi ban đầu của tôi để giúp đỡ những người khác với cùng một vấn đề. Nếu bạn cần lọc theo thuộc tính, thay vì tìm kiếm id theo cách thủ công, bạn có thể sử dụng mã sau để truy xuất tất cả các cặp id, giá trị cho một thuộc tính. Dữ liệu được trả về dưới dạng một mảng với tên thuộc tính làm khóa.

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

Đây là một hàm bạn có thể sử dụng để lấy sản phẩm theo id thuộc tính của họ. Lấy bằng cách sử dụng chức năng trước đó.

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





Để Nhận TEXT các thuộc tính được thêm từ quản trị viên vào giao diện người dùng trên trang danh sách sản phẩm.

Cảm ơn Anita Mourya

Tôi đã tìm thấy có hai phương pháp. Giả sử thuộc tính sản phẩm được gọi là "na_author" được thêm từ chương trình phụ trợ dưới dạng trường văn bản.

PHƯƠNG PHÁP 1

trên list.phtml

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

ĐỂ TẤT CẢ SẢN PHẨM LOAD BỞI SKU VÀ NHẬN ĐƯỢC ĐẤU THẾ

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

PHƯƠNG PHÁP 2

Mage/Catalog/Block/Product/List.phtml TRÊN RIDE và đặt trong 'thư mục cục bộ'

I E. Sao chép từ

Mage/Catalog/Block/Product/List.phtml

và PHỤC HỒI ĐẾN

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

thay đổi hàm bằng cách thêm 2 dòng được in đậm dưới đây.

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;

}

và bạn sẽ rất vui khi thấy nó .... !!


3
2017-09-06 10:41





tạo tên thuộc tính là "price_screen_tab_namevà truy cập bằng cách sử dụng công thức đơn giản này.

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

2
2018-06-09 09:09





Tôi đã thêm dòng

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

trong

app / code / core / Mage / Danh mục / Chặn / Sản phẩm / List.php trên dòng 95

trong chức năng _getProductCollection() 

và sau đó gọi nó vào

app / design / frontend / default / hellopress / template / catalogue / sản phẩm / list.phtml

Bằng cách viết mã

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

Bây giờ nó đang làm việc trong Magento 1.4.x


0
2018-06-04 22:20