Programmatically Adding Attributes and Attribute Sets (Example)

Last modified by dsoprea on Thu, April 14, 2011 11:01
Source|Old Revisions  

Comprehensive error-checking has been omitted.

  1. <?php
  2.     /**
  3.      * Create an atribute-set.
  4.      *
  5.      * For reference, see Mage_Adminhtml_Catalog_Product_SetController::saveAction().
  6.      *
  7.      * @return array|false
  8.      */
  9.     function createAttributeSet($setName, $copyGroupsFromID = -1)
  10.     {
  11.  
  12.         $setName = trim($setName);
  13.  
  14.         $this->logInfo("Creating attribute-set with name [$setName].");
  15.  
  16.         if($setName == '')
  17.         {
  18.             $this->logError("Could not create attribute set with an empty name.");
  19.             return false;
  20.         }
  21.  
  22.         //>>>> Create an incomplete version of the desired set.
  23.  
  24.         $model = Mage::getModel('eav/entity_attribute_set');
  25.  
  26.         // Set the entity type.
  27.  
  28.         $entityTypeID = Mage::getModel('catalog/product')->getResource()->getTypeId();
  29.         $this->logInfo("Using entity-type-ID ($entityTypeID).");
  30.  
  31.         $model->setEntityTypeId($entityTypeID);
  32.  
  33.         // We don't currently support groups, or more than one level. See
  34.         // Mage_Adminhtml_Catalog_Product_SetController::saveAction().
  35.  
  36.         $this->logInfo("Creating vanilla attribute-set with name [$setName].");
  37.  
  38.         $model->setAttributeSetName($setName);
  39.  
  40.         // We suspect that this isn't really necessary since we're just
  41.         // initializing new sets with a name and nothing else, but we do
  42.         // this for the purpose of completeness, and of prevention if we
  43.         // should expand in the future.
  44.         $model->validate();
  45.  
  46.         // Create the record.
  47.  
  48.         try
  49.         {
  50.             $model->save();
  51.         }
  52.         catch(Exception $ex)
  53.         {
  54.             $this->logError("Initial attribute-set with name [$setName] could not be saved: " . $ex->getMessage());
  55.             return false;
  56.         }
  57.  
  58.         if(($id = $model->getId()) == false)
  59.         {
  60.             $this->logError("Could not get ID from new vanilla attribute-set with name [$setName].");
  61.             return false;
  62.         }
  63.  
  64.         $this->logInfo("Set ($id) created.");
  65.  
  66.         //<<<<
  67.  
  68.         //>>>> Load the new set with groups (mandatory).
  69.  
  70.         // Attach the same groups from the given set-ID to the new set.
  71.         if($copyGroupsFromID !== -1)
  72.         {
  73.             $this->logInfo("Cloning group configuration from existing set with ID ($copyGroupsFromID).");
  74.            
  75.             $model->initFromSkeleton($copyGroupsFromID);
  76.         }
  77.  
  78.         // Just add a default group.
  79.         else
  80.         {
  81.             $this->logInfo("Creating default group [{$this->groupName}] for set.");
  82.  
  83.             $modelGroup = Mage::getModel('eav/entity_attribute_group');
  84.             $modelGroup->setAttributeGroupName($this->groupName);
  85.             $modelGroup->setAttributeSetId($id);
  86.  
  87.             // This is optional, and just a sorting index in the case of
  88.             // multiple groups.
  89.             // $modelGroup->setSortOrder(1);
  90.  
  91.             $model->setGroups(array($modelGroup));
  92.         }
  93.  
  94.         //<<<<
  95.  
  96.         // Save the final version of our set.
  97.  
  98.         try
  99.         {
  100.             $model->save();
  101.         }
  102.         catch(Exception $ex)
  103.         {
  104.             $this->logError("Final attribute-set with name [$setName] could not be saved: " . $ex->getMessage());
  105.             return false;
  106.         }
  107.  
  108.         if(($groupID = $modelGroup->getId()) == false)
  109.         {
  110.             $this->logError("Could not get ID from new group [$groupName].");
  111.             return false;
  112.         }
  113.  
  114.         $this->logInfo("Created attribute-set with ID ($id) and default-group with ID ($groupID).");
  115.  
  116.         return array(
  117.                         'SetID'     => $id,
  118.                         'GroupID'   => $groupID,
  119.                     );
  120.     }
  121.  
  122.     /**
  123.      * Create an attribute.
  124.      *
  125.      * For reference, see Mage_Adminhtml_Catalog_Product_AttributeController::saveAction().
  126.      *
  127.      * @return int|false
  128.      */
  129.     function createAttribute($labelText, $attributeCode, $values = -1, $productTypes = -1, $setInfo = -1)
  130.     {
  131.  
  132.         $labelText = trim($labelText);
  133.         $attributeCode = trim($attributeCode);
  134.  
  135.         if($labelText == '' || $attributeCode == '')
  136.         {
  137.             $this->logError("Can't import the attribute with an empty label or code.  LABEL= [$labelText]  CODE= [$attributeCode]");
  138.             return false;
  139.         }
  140.  
  141.         if($values === -1)
  142.             $values = array();
  143.  
  144.         if($productTypes === -1)
  145.             $productTypes = array();
  146.  
  147.         if($setInfo !== -1 && (isset($setInfo['SetID']) == false || isset($setInfo['GroupID']) == false))
  148.         {
  149.             $this->logError("Please provide both the set-ID and the group-ID of the attribute-set if you'd like to subscribe to one.");
  150.             return false;
  151.         }
  152.  
  153.         $this->logInfo("Creating attribute [$labelText] with code [$attributeCode].");
  154.  
  155.         //>>>> Build the data structure that will define the attribute. See
  156.         //     Mage_Adminhtml_Catalog_Product_AttributeController::saveAction().
  157.  
  158.         $data = array(
  159.                         'is_global'                     => '0',
  160.                         'frontend_input'                => 'text',
  161.                         'default_value_text'            => '',
  162.                         'default_value_yesno'           => '0',
  163.                         'default_value_date'            => '',
  164.                         'default_value_textarea'        => '',
  165.                         'is_unique'                     => '0',
  166.                         'is_required'                   => '0',
  167.                         'frontend_class'                => '',
  168.                         'is_searchable'                 => '1',
  169.                         'is_visible_in_advanced_search' => '1',
  170.                         'is_comparable'                 => '1',
  171.                         'is_used_for_promo_rules'       => '0',
  172.                         'is_html_allowed_on_front'      => '1',
  173.                         'is_visible_on_front'           => '0',
  174.                         'used_in_product_listing'       => '0',
  175.                         'used_for_sort_by'              => '0',
  176.                         'is_configurable'               => '0',
  177.                         'is_filterable'                 => '0',
  178.                         'is_filterable_in_search'       => '0',
  179.                         'backend_type'                  => 'varchar',
  180.                         'default_value'                 => '',
  181.                     );
  182.  
  183.         // Now, overlay the incoming values on to the defaults.
  184.         foreach($values as $key => $newValue)
  185.             if(isset($data[$key]) == false)
  186.             {
  187.                 $this->logError("Attribute feature [$key] is not valid.");
  188.                 return false;
  189.             }
  190.        
  191.             else
  192.                 $data[$key] = $newValue;
  193.  
  194.         // Valid product types: simple, grouped, configurable, virtual, bundle, downloadable, giftcard
  195.         $data['apply_to']       = $productTypes;
  196.         $data['attribute_code'] = $attributeCode;
  197.         $data['frontend_label'] = array(
  198.                                             0 => $labelText,
  199.                                             1 => '',
  200.                                             3 => '',
  201.                                             2 => '',
  202.                                             4 => '',
  203.                                         );
  204.  
  205.         //<<<<
  206.  
  207.         //>>>> Build the model.
  208.  
  209.         $model = Mage::getModel('catalog/resource_eav_attribute');
  210.  
  211.         $model->addData($data);
  212.  
  213.         if($setInfo !== -1)
  214.         {
  215.             $model->setAttributeSetId($setInfo['SetID']);
  216.             $model->setAttributeGroupId($setInfo['GroupID']);
  217.         }
  218.  
  219.         $entityTypeID = Mage::getModel('eav/entity')->setType('catalog_product')->getTypeId();
  220.         $model->setEntityTypeId($entityTypeID);
  221.  
  222.         $model->setIsUserDefined(1);
  223.  
  224.         //<<<<
  225.  
  226.         // Save.
  227.  
  228.         try
  229.         {
  230.             $model->save();
  231.         }
  232.         catch(Exception $ex)
  233.         {
  234.             $this->logError("Attribute [$labelText] could not be saved: " . $ex->getMessage());
  235.             return false;
  236.         }
  237.  
  238.         $id = $model->getId();
  239.  
  240.         $this->logInfo("Attribute [$labelText] has been saved as ID ($id).");
  241.  
  242.         return $id;
  243.     }



 

Magento 2 GitHub Repository

Magento Job Board - Some sort of tag line goes here

Latest Posts| View all Jobs