Magento-특정 속성 값이있는 제품 검색


78

내 블록 코드에서 특정 값을 가진 속성이있는 제품 목록을 프로그래밍 방식으로 검색하려고합니다.

또는 가능하지 않은 경우 모든 제품을 검색 한 다음 필터링하여 특정 속성이있는 제품 만 나열 할 수 있습니까?

표준 부울 필터를 사용 AND하거나 OR내 제품의 하위 집합을 일치시키기 위해 검색을 수행하려면 어떻게해야 합니까?

답변:


160

거의 모든 Magento 모델에는 모델의 여러 인스턴스를 가져 오는 데 사용할 수있는 해당 컬렉션 개체가 있습니다.

제품 컬렉션을 인스턴스화하려면 다음을 수행하십시오.

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

제품은 Magento EAV 스타일 모델이므로 반환하려는 추가 속성을 추가해야합니다.

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

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

컬렉션에 필터를 설정하기위한 여러 구문이 있습니다. 저는 항상 아래의 자세한 정보를 사용하지만 필터링 방법을 사용할 수있는 추가 방법에 대해 Magento 소스를 검사 할 수 있습니다.

다음은 값 범위 (보다 큼 및보다 작음)를 기준으로 필터링하는 방법을 보여줍니다.

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

이것은 하나 또는 다른 것과 동일한 이름으로 필터링됩니다.

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

지원되는 짧은 조건 (eq, lt 등)의 전체 목록은 다음 _getConditionSql방법에서 찾을 수 있습니다 .lib/Varien/Data/Collection/Db.php

마지막으로 모든 Magento 컬렉션을 반복 할 수 있습니다 (기본 컬렉션 클래스는 반복기 인터페이스에서 구현 됨). 이것이 필터가 설정되면 제품을 잡는 방법입니다.

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

foreach ($collection as $product) {
    //var_dump($product);
    var_dump($product->getData());
}

자세한 답변 감사합니다. 당신은 나를 올바른 길로 인도했습니다. 예제 코드의 결과를 var_dump로 만들었습니다. 작업중인 속성이 다중 선택 항목이기 때문에 결과에 숫자 ID가 표시되어 텍스트 비교가 작동하지 않습니다. EG $ this-> collection-> addFieldToFilter (array (array ( 'attribute'=> 'cw_category', 'eq'=> 'Aero'), array ( 'attribute'=> 'cw_category', 'eq'=> ') Track '), array ('attribute '=>'cw_category ','eq '=>'투어링 '))); 'cw_category'=> string ', 536,535,534'(길이 = 12)를 반환합니다
Christian

많은 파기 없이는 특별히 도울 수 없습니다 (StackOverflow 담당자는 좋지만 청구서를 지불하지 않습니다). 당신이 추구해야 할 두 가지 길. 먼저 언급했듯이 _getConditionSql에서 가능한 모든 비교 연산자 목록을 확인합니다. like 절이나 in으로 얻을 수 있습니다. 둘째, Mage_Eav_Model_Entity_Collection_Abstract에서 addAttributeToFilter 메소드에 대한 PHPDoc을 체크 아웃하면 첫 번째 매개 변수의 예상 값 중 하나가 Mage_Eav_Model_Entity_Attribute_Interface임을 알 수 있습니다. 그것은 당신을 올바른 길로 인도 할 수 있습니다.
Alan Storm

1
최종 코드 샘플에서 배열 'name' => 'orig_price'은 다음으로 시작 합니다. 이것이 맞습니까? 안 'attribute' => 'name'그래?
Andy

1
@johnsnails 그것은 매우 가능합니다.이 게시물은 9 살입니다. 내 대답에 부정확 한 정보가 포함되어 있거나 API가 그 아래에서 변경되었을 수 있습니다. 요즘은 확실히 알기에 충분한 마 젠토 작업을하지 않습니다.
Alan Storm

1
@AlanStorm 귀하의 답변에있는 다른 코드 샘플의 복사 / 붙여 넣기 실수 인 것 같습니다. 답을 수정하고 수정하겠습니다.
Andy

7

이것은 같은 문제를 가진 다른 사람들을 돕기 위해 내 원래 질문에 대한 후속 조치입니다. 수동으로 ID를 조회하는 대신 속성별로 필터링해야하는 경우 다음 코드를 사용하여 속성에 대한 모든 ID, 값 쌍을 검색 할 수 있습니다. 데이터는 속성 이름을 키로 사용하여 배열로 반환됩니다.

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

다음은 속성 세트 ID로 상품을 가져 오는 데 사용할 수있는 기능입니다. 이전 기능을 사용하여 검색했습니다.

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

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

3

얻는 TEXT제품 목록 페이지에서 프런트 엔드에 관리자에서 추가 속성을.

감사합니다 Anita Mourya

두 가지 방법이 있습니다. "na_author"라는 제품 속성이 백엔드에서 텍스트 필드로 추가되었다고 가정 해 보겠습니다.

방법 1

의 위에 list.phtml

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

SKU 별 각 제품로드에 대해 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 "";}
?>

방법 2

Mage/Catalog/Block/Product/List.phtml OVER RIDE 및 '로컬 폴더'에 설정

즉 복사 원본

Mage/Catalog/Block/Product/List.phtml

및 붙여 넣기

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

아래 굵게 표시된 두 줄을 추가하여 기능을 변경하십시오.

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;

}

그리고 당신은 그것을보고 기뻐할 것입니다 .... !!


2

생성 속성 이름은 " price_screen_tab_name"입니다. 이 간단한 공식을 사용하여 액세스합니다.

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

0

나는 줄을 추가했습니다

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

95 행의 app / code / core / Mage / Catalog / Block / Product / List.php

기능상 _getProductCollection()

그리고 그것을 불러

app / design / frontend / default / hellopress / template / catalog / product / list.phtml

코드 작성

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

이제 Magento 1.4.x에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.