अपग्रेड स्क्रिप्ट - विकल्पों के साथ नई चयन विशेषता बनाएं


27

मैं अपग्रेड स्क्रिप्ट का उपयोग करके कुछ पूर्वनिर्धारित विकल्पों के साथ एक नई उत्पाद विशेषता बनाना चाहूंगा।

मेरे पास एक अपग्रेड स्क्रिप्ट काम कर रही है, इसलिए केवल एक चीज जो मुझे नहीं पता कि कैसे करना है ड्रॉप डाउन विकल्पों को विशेषता के साथ जोड़ना है।

मैं अपने मॉड्यूल के अंदर अपनी विशेषता जोड़ रहा हूँ निम्नलिखित का उपयोग कर स्क्रिप्ट को अपग्रेड करें:

$installer->addAttribute('catalog_product', "shirt_size", array(
    'type'       => 'int',
    'input'      => 'select',
    'label'      => 'Shirt Size',
    'sort_order' => 1000,
    'required'   => false,
    'global'     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
));

मैं इसके साथ 3 विकल्प कैसे जोड़ सकता हूं: छोटा, मध्यम और बड़ा?

मैं एक कस्टम स्रोत मॉडल का उपयोग नहीं करना चाहता। मुझे सामान्य विकल्प चाहिए

जवाबों:


30

यह एक क्लासिक मामला है जहां कोड-पीढ़ी आपका मित्र है। इन्हें हाथ से बनाना बंद करें, और निम्न मुक्त और खुले स्रोत स्क्रिप्ट का उपयोग करने का प्रयास करें , (जिसे n98-magerunटूल में भी शामिल किया गया है)

उदाहरण के लिए, निम्न नमूना डेटा के रंग विशेषता को डुप्लिकेट करेगा

$ magento-create-setup.php color
//WARNING, non false value detected in is_used_for_price_rules.  The setup resource migration scripts may not support this (per 1.7.0.1)
<?php
if(! ($this instanceof Mage_Catalog_Model_Resource_Setup) )
{
    throw new Exception("Resource Class needs to inherit from " .
    "Mage_Catalog_Model_Resource_Setup for this to work");
}

$attr = array (
  'attribute_model' => NULL,
  'backend' => '',
  'type' => 'int',
  'table' => '',
  'frontend' => '',
  'input' => 'select',
  'label' => 'Color',
  'frontend_class' => '',
  'source' => '',
  'required' => '0',
  'user_defined' => '1',
  'default' => '',
  'unique' => '0',
  'note' => '',
  'input_renderer' => NULL,
  'global' => '1',
  'visible' => '1',
  'searchable' => '1',
  'filterable' => '1',
  'comparable' => '1',
  'visible_on_front' => '0',
  'is_html_allowed_on_front' => '0',
  'is_used_for_price_rules' => '1',
  'filterable_in_search' => '1',
  'used_in_product_listing' => '0',
  'used_for_sort_by' => '0',
  'is_configurable' => '1',
  'apply_to' => 'simple',
  'visible_in_advanced_search' => '1',
  'position' => '1',
  'wysiwyg_enabled' => '0',
  'used_for_promo_rules' => '1',
  'option' => 
  array (
    'values' => 
    array (
      0 => 'Green',
      1 => 'Silver',
      2 => 'Black',
      3 => 'Blue',
      4 => 'Red',
      5 => 'Pink',
      6 => 'Magenta',
      7 => 'Brown',
      8 => 'White',
      9 => 'Gray',
    ),
  ),
);
$this->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'color', $attr);

यदि आप n98-magerunसंस्करण का उपयोग कर रहे हैं , तो वह होगा

$ n98-magerun dev:setup:script:attribute catalog_product color

कोड जेनरेशन का उपयोग करने से आपको अपना काम जल्दी करने में मदद मिलेगी, और जैसे-जैसे समय बीतता जाएगा आप प्रारूप सीखना शुरू कर देंगे।


क्या हम जे एस घटना पर्यवेक्षक को विशेषता के लिए onClickऔर onChangeविकल्पों में जोड़ सकते हैं ?
आरटी

18
$installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'shirt_size', [
    'type'       => 'int',
    'input'      => 'select',
    'label'      => 'Shirt Size',
    'sort_order' => 1000,
    'required'   => false,
    'global'     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
    'backend'    => 'eav/entity_attribute_backend_array',
    'option'     => [
        'values' => [
            0 => 'Small',
            1 => 'Medium',
            2 => 'Large',
        ]
    ],

]);

valueसरणी में प्रत्येक तत्व एक विकल्प का प्रतिनिधित्व करता है। यदि आपके पास ऐसा है तो आप प्रत्येक स्टोर दृश्य के लिए लेबल जोड़ सकते हैं:

[
    0=>'Small',
    1=>'Small',
    2=>'Petit'
]

मूल रूप से यह है store_id=>'Label for store'


6
मारियस, क्या आप जीविका के लिए काम करते हैं? :-)
बेंचमार्क

7
@benmarks। मैं जीने के लिए काम करता हूं और मैं वास्तव में उस काम का आनंद लेता हूं जो मैं कर रहा हूं। मुझे बस एक सवाल का जवाब देने के लिए समय-समय पर 2 मिनट का ब्रेक लेना पसंद है। क्या आप चाहते हैं कि मैं जवाब देना बंद कर दूं? :)
मेरियस

1
@philwinkle। हाँ ... 4 घंटे सप्ताह, लेकिन हर हफ्ते नहीं। मैं नहीं चाहता कि थक प्राप्त करना चाहते हैं :)।
मेरियस

1
@Dexter $installer = $this;इंस्टॉलर स्क्रिप्ट में पहली पंक्ति के रूप में जोड़ें ।
मेरियस

1
@mujas। backendमें backend_modelस्तंभ के बराबर है eav_attribute table। एक विशेषता फ्रंटेंड मॉडल का समर्थन कर सकती है (जो वास्तव में बैकएंड में विशेषता फ़ील्ड को प्रस्तुत करने के लिए उपयोग किया जाता है), स्रोत मॉडल (ड्रॉपडाउन और मल्टीसेप्ट विशेषताओं के लिए। यह विकल्पों का स्रोत है) और बैकेंड मॉडल। विशेषता मान सहेजे जाने से पहले या लोड होने के बाद आप प्रदर्शन करने के लिए बैकएंड मॉडल सेट करने वाले वर्ग का उपयोग कर सकते हैं। आप अतिरिक्त सत्यापन करने के लिए या मूल्य को बदलने के लिए इसका उपयोग कर सकते हैं। इस विशिष्ट मामले में, आपके द्वारा फॉर्म से भेजा गया सरणी क्रमबद्ध होता है।
मेरियस

3

जब भी आप विशेषता प्रकार ड्रॉपडाउन बनाते हैं तो स्रोत मॉडल जोड़ें।

'source'        => 'eav/entity_attribute_source_table',   

0
$valStringArray = array("Nike","Addidas");
createAttribute("Brand","manufacturer",-1,-1,-1,$valStringArray);

//
// Create an attribute.
//
// For reference, see Mage_Adminhtml_Catalog_Product_AttributeController::saveAction().
//
// @return int|false
//  

function createAttribute($labelText, $attributeCode, $values = -1, $productTypes = -1, $setInfo = -1, $options = -1)
{

    $labelText = trim($labelText);
    $attributeCode = trim($attributeCode);

    if($labelText == '' || $attributeCode == '')
    {
        echo "Can't import the attribute with an empty label or code.  LABEL= [$labelText]  CODE= [$attributeCode]"."<br/>";
        return false;
    }

    if($values === -1)
        $values = array();

    if($productTypes === -1)
        $productTypes = array();

    if($setInfo !== -1 && (isset($setInfo['SetID']) == false || isset($setInfo['GroupID']) == false))
    {
        echo "Please provide both the set-ID and the group-ID of the attribute-set if you'd like to subscribe to one."."<br/>";
        return false;
    }

    echo "Creating attribute [$labelText] with code [$attributeCode]."."<br/>";

    //>>>> Build the data structure that will define the attribute. See
    //     Mage_Adminhtml_Catalog_Product_AttributeController::saveAction().

    $data = array(
                    'is_global'                     => '1',
                    'frontend_input'                => 'select',
                    'default_value_text'            => '',
                    'default_value_yesno'           => '0',
                    'default_value_date'            => '',
                    'default_value_textarea'        => '',
                    'is_unique'                     => '0',
                    'is_required'                   => '0',
                    'frontend_class'                => '',
                    'is_searchable'                 => '1',
                    'is_visible_in_advanced_search' => '1',
                    'is_comparable'                 => '1',
                    'is_used_for_promo_rules'       => '0',
                    'is_html_allowed_on_front'      => '1',
                    'is_visible_on_front'           => '0',
                    'used_in_product_listing'       => '0',
                    'used_for_sort_by'              => '0',
                    'is_configurable'               => '0',
                    'is_filterable'                 => '1',
                    'is_filterable_in_search'       => '1',
                    'backend_type'                  => 'varchar',
                    'default_value'                 => '',
                    'is_user_defined'               => '0',
                    'is_visible'                    => '1',
                    'is_used_for_price_rules'       => '0',
                    'position'                      => '0',
                    'is_wysiwyg_enabled'            => '0',
                    'backend_model'                 => '',
                    'attribute_model'               => '',
                    'backend_table'                 => '',
                    'frontend_model'                => '',
                    'source_model'                  => '',
                    'note'                          => '',
                    'frontend_input_renderer'       => '',                      
                );

    // Now, overlay the incoming values on to the defaults.
    foreach($values as $key => $newValue)
        if(isset($data[$key]) == false)
        {
            echo "Attribute feature [$key] is not valid."."<br/>";
            return false;
        }

        else
            $data[$key] = $newValue;

    // Valid product types: simple, grouped, configurable, virtual, bundle, downloadable, giftcard
    $data['apply_to']       = $productTypes;
    $data['attribute_code'] = $attributeCode;
    $data['frontend_label'] = array(
                                        0 => $labelText,
                                        1 => '',
                                        3 => '',
                                        2 => '',
                                        4 => '',
                                    );

    //<<<<

    //>>>> Build the model.

    $model = Mage::getModel('catalog/resource_eav_attribute');

    $model->addData($data);

    if($setInfo !== -1)
    {
        $model->setAttributeSetId($setInfo['SetID']);
        $model->setAttributeGroupId($setInfo['GroupID']);
    }

    $entityTypeID = Mage::getModel('eav/entity')->setType('catalog_product')->getTypeId();
    $model->setEntityTypeId($entityTypeID);

    $model->setIsUserDefined(1);

    //<<<<

    // Save.

    try
    {
        $model->save();
    }
    catch(Exception $ex)
    {
        echo "Attribute [$labelText] could not be saved: " . $ex->getMessage()."<br/>";
        if($ex->getMessage() == "Attribute with the same code already exists."){
            if(is_array($options)){
                foreach($options as $_opt){
                    addAttributeValue($attributeCode, $_opt);
                }
            }
        }
        return false;
    }

    if(is_array($options)){
        foreach($options as $_opt){
            addAttributeValue($attributeCode, $_opt);
        }
    }

    $id = $model->getId();

    echo "Attribute [$labelText] has been saved as ID ($id).<br/>";

    // Asssign to attribute set.
    $model1 = Mage::getModel('eav/entity_setup','core_setup');
    $model1->addAttributeToSet(
        'catalog_product', 'Default', 'General', $attributeCode
    ); //Default = attribute set, General = attribute group

    // return $id;
}

function addAttributeValue($arg_attribute, $arg_value)
{
    $attribute_model        = Mage::getModel('eav/entity_attribute');

    $attribute_code         = $attribute_model->getIdByCode('catalog_product', $arg_attribute);
    $attribute              = $attribute_model->load($attribute_code);

    if(!attributeValueExists($arg_attribute, $arg_value))
    {
        $value['option'] = array($arg_value,$arg_value);
        $result = array('value' => $value);
        $attribute->setData('option',$result);
        $attribute->save();
    }

    $attribute_options_model= Mage::getModel('eav/entity_attribute_source_table') ;
    $attribute_table        = $attribute_options_model->setAttribute($attribute);
    $options                = $attribute_options_model->getAllOptions(false);

    foreach($options as $option)
    {
        if ($option['label'] == $arg_value)
        {
            return $option['value'];
        }
    }
   return false;
}
function attributeValueExists($arg_attribute, $arg_value)
{
    $attribute_model        = Mage::getModel('eav/entity_attribute');
    $attribute_options_model= Mage::getModel('eav/entity_attribute_source_table') ;

    $attribute_code         = $attribute_model->getIdByCode('catalog_product', $arg_attribute);
    $attribute              = $attribute_model->load($attribute_code);

    $attribute_table        = $attribute_options_model->setAttribute($attribute);
    $options                = $attribute_options_model->getAllOptions(false);

    foreach($options as $option)
    {
        if ($option['label'] == $arg_value)
        {
            return $option['value'];
        }
    }

    return false;
}

इसे इस्तेमाल करे। मैंने इस कोड के माध्यम से बहुत सारे गुण और विशेषता मान जोड़े हैं और आप इस कोड के माध्यम से सेट की गई विशेषता को निर्दिष्ट कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.