업그레이드 스크립트-옵션으로 새로운 선택 속성 작성


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

코드 생성을 사용하면 작업을 더 빨리 완료 할 수 있으며 시간이 지남에 따라 형식을 배우기 시작합니다.


js 이벤트 옵저버 를 속성 onClick과 같은 onChange옵션에 추가 할 수 있습니까?
RT

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
마리우스, 당신은 생계를 위해 일하십니까? :-)
benmarks

7
@ 벤 마크스. 나는 생계를 위해 일하고 있으며 내가하고있는 일을 정말로 즐깁니다. 나는 때때로 질문에 대답하기 위해 2 분의 휴식을 취하는 것을 좋아합니다. 내가 대답을 멈 추길 원하십니까? :)
Marius

1
@ 필 윈클. 네 ... 매주 4 시간은 아니지만 피곤하고 싶지 않습니다. :)
마리우스

1
@Dexter $installer = $this;설치 관리자 스크립트의 첫 번째 줄로 추가하십시오 .
Marius

1
@mujas. backendbackend_model열과 같습니다 eav_attribute table. 속성은 프런트 엔드 모델 (실제로 백엔드에서 속성 필드를 렌더링하는 데 사용되는 블록), 소스 모델 (드롭 다운 및 다중 선택 속성의 경우 옵션의 소스) 및 백엔드 모델을 지원할 수 있습니다. 백엔드 모델을 설정 한 클래스를 사용하여 속성 값을 저장하기 전에 또는로드 한 후에 작업을 수행 할 수 있습니다. 이를 사용하여 추가 검증을 수행하거나 값을 변경할 수 있습니다. 이 경우 양식에서 전송 한 배열이 직렬화됩니다.
Marius

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

이 시도. 이 코드를 통해 너무 많은 속성 및 속성 값을 추가했으며이 코드를 통해 속성 세트에 속성을 할당 할 수 있습니다.

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