2009-08-26 16 views
76

मेरे ब्लॉक कोड में मैं प्रोग्राम की एक सूची को पुनर्प्राप्त करने की कोशिश कर रहा हूं जिसमें विशिष्ट मान के साथ विशेषता है।Magento - एक विशिष्ट विशेषता मान के साथ उत्पादों को पुनर्प्राप्त करें

वैकल्पिक रूप से यदि यह संभव नहीं है तो कोई भी सभी उत्पादों को पुनर्प्राप्त कैसे करेगा, फिर उन्हें एक विशिष्ट विशेषता वाले उत्पादों को सूचीबद्ध करने के लिए फ़िल्टर करें?

मैं अपने उत्पादों के सबसेट से मेल खाने के लिए मानक बूलियन फ़िल्टर 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,) lib/Varien/Data/Collection/Db.php

(आधार संग्रह वर्ग अंत में, सभी Magento संग्रह से अधिक दोहराया जा सकता है में _getConditionSql विधि में पाया जा सकता इटरेटर इंटरफेस पर लागू)। फ़िल्टर सेट होने के बाद आप अपने उत्पादों को कैसे पकड़ लेंगे।

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

बहुत विस्तृत उत्तर। धन्यवाद! –

+0

विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। आपने मुझे सही रास्ते के साथ सेट किया है। मैंने आपके उदाहरण कोड से परिणामों का var_dump किया था। क्योंकि जिस विशेषता के साथ मैं काम कर रहा हूं वह एक बहुत ही चुनिंदा आइटम है, मुझे परिणामों में एक संख्यात्मक आईडी मिल रही है, इसलिए टेक्स्ट तुलना काम नहीं कर रही है। E.G.$ this-> संग्रह-> addFieldToFilter (सरणी ( सरणी ('विशेषता' => 'cw_category', 'eq' => 'एरो'), सरणी ('विशेषता' => 'cw_category', 'eq' => 'ट्रैक'), सरणी ('विशेषता' => 'cw_category', 'eq' => 'टूरिंग') ); 'cw_category' => स्ट्रिंग ', 536,535,534' (लंबाई = 12) – Christian

+0

बहुत खुदाई के बिना विशेष रूप से आपकी सहायता नहीं कर सकता है (StackOverflow प्रतिनिधि अच्छा है, लेकिन यह बिल का भुगतान नहीं करता है)। आपके लिए आगे बढ़ने के लिए दो रास्ते। सबसे पहले, जैसा कि बताया गया है, सभी संभावित तुलना ऑपरेटर की सूची के लिए चेकआउट _getConditionSql। आप एक समान खंड या शायद एक इनके साथ प्राप्त करने में सक्षम हो सकते हैं। दूसरा, यदि आप mage_Eav_Model_Entity_Collection_Abstract पर addAttributeToFilter विधि के लिए PHPDoc चेकआउट करते हैं, तो आप देखेंगे कि पहले पैरामीटर के अपेक्षित मानों में से एक Mage_Eav_Model_Entity_Attribute_Interface है। इससे आपको सही रास्ते पर ले जाया जा सकता है। –

7

यह एक ही समस्या के साथ दूसरों की मदद करने के लिए मेरे मूल प्रश्न का पालन करता है। यदि आपको आईडी को मैन्युअल रूप से देखने के बजाय किसी विशेषता द्वारा फ़िल्टर करने की आवश्यकता है, तो आप सभी आईडी पुनर्प्राप्त करने के लिए निम्न कोड का उपयोग कर सकते हैं, एक विशेषता के लिए मूल्य जोड़े। डेटा को कुंजी के रूप में विशेषता नाम के साथ एक सरणी के रूप में वापस किया जाता है।

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

यहां एक ऐसा फ़ंक्शन है जिसका उपयोग आप अपने गुण सेट आईडी द्वारा उत्पादों को प्राप्त करने के लिए कर सकते हैं। पिछले फ़ंक्शन का उपयोग करके पुनर्प्राप्त।

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

मैं में

एप्लिकेशन/कोड/कोर/दाना/सूची/ब्लॉक/उत्पाद/सूची लाइन

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

जोड़ लिया है।समारोह में लाइन 95

पर php _getProductCollection()

और फिर

अनुप्रयोग में इसे कहते/डिजाइन/दृश्यपटल/डिफ़ॉल्ट/hellopress/टेम्पलेट/सूची/उत्पाद/list.phtml

कोड लिखकर

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

अब यह Magento 1.4.x

3

TEXT प्राप्त करने के लिए व्यवस्थापक सूची पृष्ठ पर व्यवस्थापक से आगे के अंत में जोड़ा गया है।

धन्यवाद अनीता मौर्य

मैं पाया है वहाँ दो तरीकों है। मान लें कि "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 से अधिक सवारी मिल और में सेट ' स्थानीय फ़ोल्डर '

अर्थात से

Mage/Catalog/Block/Product/List.phtml 

कॉपी और 2 लाइनों के नीचे बोल्ड अक्षरों में दर्शाए जोड़कर समारोह

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; 

} 

और आपको इसे देखकर खुशी होगी .... !!

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

विशेषता का नाम बनाएं "price_screen_tab_name"। और इस सरल सूत्र का उपयोग कर उपयोग करें।

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