Mage_Catalog_Model_Product_Type_Configurable Class Reference

Inheritance diagram for Mage_Catalog_Model_Product_Type_Configurable:

Mage_Catalog_Model_Product_Type_Abstract

List of all members.

Public Member Functions

 getRelationInfo ()
 getChildrenIds ($parentId, $required=true)
 getParentIdsByChild ($childId)
 getEditableAttributes ($product=null)
 canUseAttribute (Mage_Eav_Model_Entity_Attribute $attribute)
 setUsedProductAttributeIds ($ids, $product=null)
 getUsedProductAttributeIds ($product=null)
 getUsedProductAttributes ($product=null)
 getConfigurableAttributes ($product=null)
 getConfigurableAttributesAsArray ($product=null)
 getConfigurableAttributeCollection ($product=null)
 getUsedProductIds ($product=null)
 getUsedProducts ($requiredAttributeIds=null, $product=null)
 getUsedProductCollection ($product=null)
 beforeSave ($product=null)
 save ($product=null)
 isSalable ($product=null)
 getProductByAttributes ($attributesInfo, $product=null)
 getSelectedAttributesInfo ($product=null)
 prepareForCart (Varien_Object $buyRequest, $product=null)
 getSpecifyOptionMessage ()
 getOrderOptions ($product=null)
 isVirtual ($product=null)
 getWeight ($product=null)
 assignProductToOption ($optionProduct, $option, $product=null)

Public Attributes

const TYPE_CODE = 'configurable'

Protected Attributes

 $_usedProductAttributeIds = '_cache_instance_used_product_attribute_ids'
 $_usedProductAttributes = '_cache_instance_used_product_attributes'
 $_usedAttributes = '_cache_instance_used_attributes'
 $_configurableAttributes = '_cache_instance_configurable_attributes'
 $_usedProductIds = '_cache_instance_product_ids'
 $_usedProducts = '_cache_instance_products'
 $_isComposite = true


Detailed Description

Definition at line 36 of file Configurable.php.


Member Function Documentation

assignProductToOption ( optionProduct,
option,
product = null 
)

Implementation of product specify logic of which product needs to be assigned to option. For example if product which was added to option already removed from catalog.

Parameters:
Mage_Catalog_Model_Product $optionProduct
Mage_Sales_Model_Quote_Item_Option $option
Mage_Catalog_Model_Product $product
Returns:
Mage_Catalog_Model_Product_Type_Abstract

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 670 of file Configurable.php.

00671     {
00672         if ($optionProduct) {
00673             $option->setProduct($optionProduct);
00674         } else {
00675             $option->getItem()->setHasError('error');
00676             $option->getItem()->addMessage(Mage::helper('catalog')->__('Selected configuration is not available.', $this->getProduct($product)->getName()));
00677         }
00678 
00679         return $this;
00680     }

beforeSave ( product = null  ) 

Before save process

Parameters:
Mage_Catalog_Model_Product $product
Returns:
Mage_Catalog_Model_Product_Type_Configurable

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 370 of file Configurable.php.

00371     {
00372         parent::beforeSave($product);
00373 
00374         $this->getProduct($product)->canAffectOptions(false);
00375 
00376         if ($this->getProduct($product)->getCanSaveConfigurableAttributes()) {
00377             $this->getProduct($product)->canAffectOptions(true);
00378             if ($data = $this->getProduct($product)->getConfigurableAttributesData()) {
00379                 if (!empty($data)) {
00380                     foreach ($data as $attribute) {
00381                         if (!empty($attribute['values'])) {
00382                             $this->getProduct($product)->setTypeHasOptions(true);
00383                             $this->getProduct($product)->setTypeHasRequiredOptions(true);
00384                             break;
00385                         }
00386                     }
00387                 }
00388             }
00389         }
00390 
00391         return $this;
00392     }

canUseAttribute ( Mage_Eav_Model_Entity_Attribute attribute  ) 

Checkin attribute availability for create superproduct

Parameters:
Mage_Eav_Model_Entity_Attribute $attribute
Returns:
bool

Definition at line 157 of file Configurable.php.

00158     {
00159         $allow = $attribute->getIsGlobal() == Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL
00160             && $attribute->getIsVisible()
00161             && $attribute->getIsConfigurable()
00162             && $attribute->usesSource();
00163 
00164         return $allow;
00165     }

getChildrenIds ( parentId,
required = true 
)

Retrieve Required children ids Return grouped array, ex array( group => array(ids) )

Parameters:
int $parentId
bool $required
Returns:
array

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 113 of file Configurable.php.

00114     {
00115         return Mage::getResourceSingleton('catalog/product_type_configurable')
00116             ->getChildrenIds($parentId, $required);
00117     }

getConfigurableAttributeCollection ( product = null  ) 

Retrieve configurable atrribute collection

Parameters:
Mage_Catalog_Model_Product $product
Returns:
Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Type_Configurable_Attribute_Collection

Definition at line 280 of file Configurable.php.

00281     {
00282         return Mage::getResourceModel('catalog/product_type_configurable_attribute_collection')
00283             ->setProductFilter($this->getProduct($product));
00284     }

getConfigurableAttributes ( product = null  ) 

Retrieve configurable attrbutes data

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Definition at line 237 of file Configurable.php.

00238     {
00239         Varien_Profiler::start('CONFIGURABLE:'.__METHOD__);
00240         if (!$this->getProduct($product)->hasData($this->_configurableAttributes)) {
00241             $configurableAttributes = $this->getConfigurableAttributeCollection($product)
00242                 ->orderByPosition()
00243                 ->load();
00244             $this->getProduct($product)->setData($this->_configurableAttributes, $configurableAttributes);
00245         }
00246         Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
00247         return $this->getProduct($product)->getData($this->_configurableAttributes);
00248     }

getConfigurableAttributesAsArray ( product = null  ) 

Retrieve Configurable Attributes as array

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Definition at line 256 of file Configurable.php.

00257     {
00258         $res = array();
00259         foreach ($this->getConfigurableAttributes($product) as $attribute) {
00260             $label = $attribute->getLabel() ? $attribute->getLabel() : $attribute->getProductAttribute()->getFrontend()->getLabel();
00261             $res[] = array(
00262                'id'            => $attribute->getId(),
00263                'label'         => $label,
00264                'position'      => $attribute->getPosition(),
00265                'values'        => $attribute->getPrices() ? $attribute->getPrices() : array(),
00266                'attribute_id'  => $attribute->getProductAttribute()->getId(),
00267                'attribute_code'=> $attribute->getProductAttribute()->getAttributeCode(),
00268                'frontend_label'=> $attribute->getProductAttribute()->getFrontend()->getLabel(),
00269             );
00270         }
00271         return $res;
00272     }

getEditableAttributes ( product = null  ) 

Retrieve product type attributes

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 137 of file Configurable.php.

00138     {
00139         if (is_null($this->_editableAttributes)) {
00140             $this->_editableAttributes = parent::getEditableAttributes($product);
00141             foreach ($this->_editableAttributes as $index => $attribute) {
00142                 if ($this->getUsedProductAttributeIds($product)
00143                     && in_array($attribute->getAttributeId(), $this->getUsedProductAttributeIds($product))) {
00144                     unset($this->_editableAttributes[$index]);
00145                 }
00146             }
00147         }
00148         return $this->_editableAttributes;
00149     }

getOrderOptions ( product = null  ) 

Prepare additional options/information for order item which will be created from this product

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 586 of file Configurable.php.

00587     {
00588         $options = parent::getOrderOptions($product);
00589         $options['attributes_info'] = $this->getSelectedAttributesInfo($product);
00590         if ($simpleOption = $this->getProduct($product)->getCustomOption('simple_product')) {
00591             $options['simple_name'] = $simpleOption->getProduct($product)->getName();
00592             $options['simple_sku']  = $simpleOption->getProduct($product)->getSku();
00593         }
00594 
00595         $options['product_calculations'] = self::CALCULATE_PARENT;
00596         $options['shipment_type'] = self::SHIPMENT_TOGETHER;
00597 
00598         return $options;
00599     }

getParentIdsByChild ( childId  ) 

Retrieve parent ids array by requered child

Parameters:
int|array $childId
Returns:
array

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 125 of file Configurable.php.

00126     {
00127         return Mage::getResourceSingleton('catalog/product_type_configurable')
00128             ->getParentIdsByChild($childId);
00129     }

getProductByAttributes ( attributesInfo,
product = null 
)

Retrieve used product by attribute values $attrbutesInfo = array( $attributeId => $attributeValue )

Parameters:
array $attrbutesInfo
Mage_Catalog_Model_Product $product
Returns:

Definition at line 459 of file Configurable.php.

00460     {
00461         foreach ($this->getUsedProducts(null, $product) as $productObject) {
00462             $checkRes = true;
00463             foreach ($attributesInfo as $attributeId => $attributeValue) {
00464                 $code = $this->getAttributeById($attributeId, $product)->getAttributeCode();
00465                 if ($productObject->getData($code) != $attributeValue) {
00466                     $checkRes = false;
00467                 }
00468             }
00469             if ($checkRes) {
00470                 return $productObject;
00471             }
00472         }
00473         return null;
00474     }

getRelationInfo (  ) 

Return relation info about used products

Returns:
Varien_Object Object with information data

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 94 of file Configurable.php.

00095     {
00096         $info = new Varien_Object();
00097         $info->setTable('catalog/product_super_link')
00098             ->setParentFieldName('parent_id')
00099             ->setChildFieldName('product_id');
00100         return $info;
00101     }

getSelectedAttributesInfo ( product = null  ) 

Retrieve Selected Attributes info

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Definition at line 482 of file Configurable.php.

00483     {
00484         $attributes = array();
00485         Varien_Profiler::start('CONFIGURABLE:'.__METHOD__);
00486         if ($attributesOption = $this->getProduct($product)->getCustomOption('attributes')) {
00487             $data = unserialize($attributesOption->getValue());
00488             $this->getUsedProductAttributeIds($product);
00489 
00490             $usedAttributes = $this->getProduct($product)->getData($this->_usedAttributes);
00491 
00492             foreach ($data as $attributeId => $attributeValue) {
00493                 if (isset($usedAttributes[$attributeId])) {
00494                     $attribute = $usedAttributes[$attributeId];
00495                     $label = $attribute->getLabel();
00496                     $value = $attribute->getProductAttribute();
00497                     if ($value->getSourceModel()) {
00498                         $value = $value->getSource()->getOptionText($attributeValue);
00499                     }
00500                     else {
00501                         $value = '';
00502                     }
00503 
00504                     $attributes[] = array('label'=>$label, 'value'=>$value);
00505                 }
00506             }
00507         }
00508         Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
00509         return $attributes;
00510     }

getSpecifyOptionMessage (  ) 

Retrieve message for specify option(s)

Returns:
string

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 574 of file Configurable.php.

00575     {
00576         return Mage::helper('catalog')->__('Please specify the product option(s)');
00577     }

getUsedProductAttributeIds ( product = null  ) 

Retrieve identifiers of used product attributes

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Definition at line 197 of file Configurable.php.

00198     {
00199         if (!$this->getProduct($product)->hasData($this->_usedProductAttributeIds)) {
00200             $usedProductAttributeIds = array();
00201             foreach ($this->getUsedProductAttributes($product) as $attribute) {
00202                 $usedProductAttributeIds[] = $attribute->getId();
00203             }
00204             $this->getProduct($product)->setData($this->_usedProductAttributeIds, $usedProductAttributeIds);
00205         }
00206         return $this->getProduct($product)->getData($this->_usedProductAttributeIds);
00207     }

getUsedProductAttributes ( product = null  ) 

Retrieve used product attributes

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Definition at line 215 of file Configurable.php.

00216     {
00217         if (!$this->getProduct($product)->hasData($this->_usedProductAttributes)) {
00218             $usedProductAttributes = array();
00219             $usedAttributes        = array();
00220             foreach ($this->getConfigurableAttributes($product) as $attribute) {
00221                 $id = $attribute->getProductAttribute()->getId();
00222                 $usedProductAttributes[$id] = $attribute->getProductAttribute();
00223                 $usedAttributes[$id]        = $attribute;
00224             }
00225             $this->getProduct($product)->setData($this->_usedAttributes, $usedAttributes);
00226             $this->getProduct($product)->setData($this->_usedProductAttributes, $usedProductAttributes);
00227         }
00228         return $this->getProduct($product)->getData($this->_usedProductAttributes);
00229     }

getUsedProductCollection ( product = null  ) 

Retrieve related products collection

Parameters:
Mage_Catalog_Model_Product $product
Returns:
Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Type_Configurable_Product_Collection

Definition at line 353 of file Configurable.php.

00354     {
00355         $collection = Mage::getResourceModel('catalog/product_type_configurable_product_collection')
00356             ->setFlag('require_stock_items', true)
00357             ->setProductFilter($this->getProduct($product));
00358         if (!is_null($this->getStoreFilter($product))) {
00359             $collection->addStoreFilter($this->getStoreFilter($product));
00360         }
00361         return $collection;
00362     }

getUsedProductIds ( product = null  ) 

Retrieve subproducts identifiers

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Definition at line 293 of file Configurable.php.

00294     {
00295         if (!$this->getProduct($product)->hasData($this->_usedProductIds)) {
00296             $usedProductIds = array();
00297             foreach ($this->getUsedProducts(null, $product) as $product) {
00298                 $usedProductIds[] = $product->getId();
00299             }
00300             $this->getProduct($product)->setData($this->_usedProductIds, $usedProductIds);
00301         }
00302         return $this->getProduct($product)->getData($this->_usedProductIds);
00303     }

getUsedProducts ( requiredAttributeIds = null,
product = null 
)

Retrieve array of "subproducts"

Parameters:
Mage_Catalog_Model_Product $product
Returns:
array

Definition at line 311 of file Configurable.php.

00312     {
00313         Varien_Profiler::start('CONFIGURABLE:'.__METHOD__);
00314         if (!$this->getProduct($product)->hasData($this->_usedProducts)) {
00315             if (is_null($requiredAttributeIds)
00316                 and is_null($this->getProduct($product)->getData($this->_configurableAttributes))) {
00317                 // If used products load before attributes, we will load attributes.
00318                 $this->getConfigurableAttributes($product);
00319                 // After attributes loading products loaded too.
00320                 Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
00321                 return $this->getProduct($product)->getData($this->_usedProducts);
00322             }
00323 
00324             $usedProducts = array();
00325             $collection = $this->getUsedProductCollection($product)
00326                 ->addAttributeToSelect('*')
00327                 ->addFilterByRequiredOptions();
00328 
00329             if (is_array($requiredAttributeIds)) {
00330                 foreach ($requiredAttributeIds as $attributeId) {
00331                     $attribute = $this->getAttributeById($attributeId, $product);
00332                     if (!is_null($attribute))
00333                         $collection->addAttributeToFilter($attribute->getAttributeCode(), array('notnull'=>1));
00334                 }
00335             }
00336 
00337             foreach ($collection as $item) {
00338                 $usedProducts[] = $item;
00339             }
00340 
00341             $this->getProduct($product)->setData($this->_usedProducts, $usedProducts);
00342         }
00343         Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
00344         return $this->getProduct($product)->getData($this->_usedProducts);
00345     }

getWeight ( product = null  ) 

Return product weight based on simple product weight or configurable product weight

Parameters:
Mage_Catalog_Model_Product $product
Returns:
decimal

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 649 of file Configurable.php.

00650     {
00651         if ($this->getProduct($product)->hasCustomOptions() && ($simpleProductOption = $this->getProduct($product)->getCustomOption('simple_product'))) {
00652             $simpleProduct = $simpleProductOption->getProduct($product);
00653             if ($simpleProduct) {
00654                 return $simpleProduct->getWeight();
00655             }
00656         }
00657 
00658         return $this->getProduct($product)->getData('weight');
00659     }

isSalable ( product = null  ) 

Check is product available for sale

Returns:
bool

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 435 of file Configurable.php.

00436     {
00437         $salable = parent::isSalable($product);
00438         if (!is_null($salable)) {
00439             return $salable;
00440         }
00441 
00442         $salable = false;
00443         foreach ($this->getUsedProducts(null, $product) as $child) {
00444             $salable = $salable || $child->isSalable();
00445         }
00446         return $salable;
00447     }

isVirtual ( product = null  ) 

Check is virtual product

Returns:
bool

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 606 of file Configurable.php.

00607     {
00608         if ($productOption = $this->getProduct($product)->getCustomOption('simple_product')) {
00609             if ($optionProduct = $productOption->getProduct()) {
00610                 /* @var $optionProduct Mage_Catalog_Model_Product */
00611                 return $optionProduct->isVirtual();
00612             }
00613         }
00614         return parent::isVirtual($product);
00615     }

prepareForCart ( Varien_Object buyRequest,
product = null 
)

Initialize product(s) for add to cart process

Parameters:
Varien_Object $buyRequest
Mage_Catalog_Model_Product $product
Returns:
mixed

$attributes = array($attributeId=>$attributeValue)

Adding parent product custom options to child product to be sure that it will be unique as its parent

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 519 of file Configurable.php.

00520     {
00521         if ($attributes = $buyRequest->getSuperAttribute()) {
00522             $result = parent::prepareForCart($buyRequest, $product);
00523             if (is_array($result)) {
00524                 $product = $this->getProduct($product);
00525                 /**
00526                  * $attributes = array($attributeId=>$attributeValue)
00527                  */
00528                 if ($subProduct = $this->getProductByAttributes($attributes, $product)) {
00529                     $product->addCustomOption('attributes', serialize($attributes));
00530                     $product->addCustomOption('product_qty_'.$subProduct->getId(), 1, $subProduct);
00531                     $product->addCustomOption('simple_product', $subProduct->getId(), $subProduct);
00532 
00533                     $_result = $subProduct->getTypeInstance(true)->prepareForCart($buyRequest, $subProduct);
00534                     if (is_string($_result) && !is_array($_result)) {
00535                         return $_result;
00536                     }
00537 
00538                     if (!isset($_result[0])) {
00539                         return Mage::helper('checkout')->__('Can not add item to shopping cart');
00540                     }
00541 
00542                     /**
00543                      * Adding parent product custom options to child product
00544                      * to be sure that it will be unique as its parent
00545                      */
00546                     if ($optionIds = $product->getCustomOption('option_ids')) {
00547                         $optionIds = explode(',', $optionIds->getValue());
00548                         foreach ($optionIds as $optionId) {
00549                             if ($option = $product->getCustomOption('option_' . $optionId)) {
00550                                 $_result[0]->addCustomOption('option_' . $optionId, $option->getValue());
00551                             }
00552                         }
00553                     }
00554 
00555                     $_result[0]->setParentProductId($product->getId())
00556                         // add custom option to simple product for protection of process when we add simple product separately
00557                         ->addCustomOption('parent_product_id', $product->getId())
00558                         ->setCartQty(1);
00559 
00560                     $result[] = $_result[0];
00561 
00562                     return $result;
00563                 }
00564             }
00565         }
00566         return $this->getSpecifyOptionMessage();
00567     }

save ( product = null  ) 

Save configurable product depended data

Parameters:
Mage_Catalog_Model_Product $product
Returns:
Mage_Catalog_Model_Product_Type_Configurable

Save Attributes Information

Save product relations

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 400 of file Configurable.php.

00401     {
00402         parent::save($product);
00403         /**
00404          * Save Attributes Information
00405          */
00406         if ($data = $this->getProduct($product)->getConfigurableAttributesData()) {
00407             foreach ($data as $attributeData) {
00408                 $id = isset($attributeData['id']) ? $attributeData['id'] : null;
00409                 Mage::getModel('catalog/product_type_configurable_attribute')
00410                    ->setData($attributeData)
00411                    ->setId($id)
00412                    ->setStoreId($this->getProduct($product)->getStoreId())
00413                    ->setProductId($this->getProduct($product)->getId())
00414                    ->save();
00415             }
00416         }
00417 
00418         /**
00419          * Save product relations
00420          */
00421         $data = $this->getProduct($product)->getConfigurableProductsData();
00422         if (is_array($data)) {
00423             $productIds = array_keys($data);
00424             Mage::getResourceModel('catalog/product_type_configurable')
00425                 ->saveProducts($this->getProduct($product)->getId(), $productIds);
00426         }
00427         return $this;
00428     }

setUsedProductAttributeIds ( ids,
product = null 
)

Declare attribute identifiers used for asign subproducts

Parameters:
array $ids
Mage_Catalog_Model_Product $product
Returns:
Mage_Catalog_Model_Product_Type_Configurable

Definition at line 174 of file Configurable.php.

00175     {
00176         $usedProductAttributes  = array();
00177         $configurableAttributes = array();
00178 
00179         foreach ($ids as $attributeId) {
00180             $usedProductAttributes[]  = $this->getAttributeById($attributeId);
00181             $configurableAttributes[] = Mage::getModel('catalog/product_type_configurable_attribute')
00182                 ->setProductAttribute($this->getAttributeById($attributeId));
00183         }
00184         $this->getProduct($product)->setData($this->_usedProductAttributes, $usedProductAttributes);
00185         $this->getProduct($product)->setData($this->_usedProductAttributeIds, $ids);
00186         $this->getProduct($product)->setData($this->_configurableAttributes, $configurableAttributes);
00187 
00188         return $this;
00189     }


Member Data Documentation

$_configurableAttributes = '_cache_instance_configurable_attributes' [protected]

Definition at line 66 of file Configurable.php.

$_isComposite = true [protected]

Reimplemented from Mage_Catalog_Model_Product_Type_Abstract.

Definition at line 87 of file Configurable.php.

$_usedAttributes = '_cache_instance_used_attributes' [protected]

Definition at line 59 of file Configurable.php.

$_usedProductAttributeIds = '_cache_instance_used_product_attribute_ids' [protected]

Definition at line 45 of file Configurable.php.

$_usedProductAttributes = '_cache_instance_used_product_attributes' [protected]

Definition at line 52 of file Configurable.php.

$_usedProductIds = '_cache_instance_product_ids' [protected]

Definition at line 73 of file Configurable.php.

$_usedProducts = '_cache_instance_products' [protected]

Definition at line 80 of file Configurable.php.

const TYPE_CODE = 'configurable'

Definition at line 38 of file Configurable.php.


The documentation for this class was generated from the following file:

Generated on Sat Jul 4 17:23:42 2009 for Magento by  doxygen 1.5.8