Новый атрибут Magento для продуктов со странами


У меня в магазине magento 10000 товаров, и мне пришлось сделать эти товары доступными для определенных стран, поэтому я хотел бы продолжить выполнение задачи, добавив доступную страну в качестве нового атрибута для каждого продукта, как я могу это сделать?

Author: Dan, 2014-04-25

1 answers

Если я согласен с комментарием Пола, я отвечу на вопрос так, как вам нужно, т. Е. Создам атрибут со списком стран.

К сожалению, создание атрибута в панели администратора не является простым решением. Вам придется вручную вводить каждую страну вручную. Что было бы излишним, так как список стран уже доступен в Magento.

Чтобы создать атрибут страны в Magento, вам необходимо создать атрибут при установке (или обновлении) сценарий и установите для него исходную модель.

Mangeto предлагает две модели, которые загружают страны:

  1. Mage_Adminhtml_Model_System_Config_Source_Country
  2. Mage_Catalog_Model_Product_Attribute_Source_Countryofmanufacture

Первый, может использоваться только в качестве источника для записей конфигурации и не может использоваться в качестве атрибута продукта.

Второй, хотя его название могло бы быть более общим, может быть использован в качестве источника для списка стран. Что он делает, так это загружает список стран и сопоставляет их с доступными странами, выбранными в панель администратора.

Для более полного (и ocd-менее) решения вы можете создать свою собственную исходную модель и использовать для нее другое имя, а также расширить модель Countryofmanufacture или просто повторно реализовать метод getAllOptions() в случае, если вам нужно удалить первый пустой элемент.

В вашем сценарии установки/обновления вам понадобится следующий код. Я объясню это встроенным в код как комментарии PHP

/*
 * Due to the large amount of variables & options here,
 * I'll start by setting them first,
 * and you change them as needed
 */

/*
 * I'm using the default attribute set here, if you need other
 * or more attribute sets, just replace `Default` or add it as an
 * extra array item.
 */
$attributeSets  = array(
    'Default',
);
$attributeLabel = 'Available in Countries';
$attributeCode  = 'available_in_countries';
$attributeGroup = 'General';
$attributeOrder  = 100;

$attributeOptions = array(
    // This is the the label text which will show in the admin panel
    'label'                      => $attributeLabel,
    // You can change the input to 'select' instead of 'multiselect'
    // if you don't want to allow multi selection
    'input'                      => 'multiselect',
    // A multiple select is saved as varchar in the database,
    // besides the country ids are actually text.
    'type'                       => 'varchar',
    // Set the 'backend' to null if changed 'multiselect' to 'select'
    'backend'                    => 'eav/entity_attribute_backend_array',
    'frontend'                   => null,
    // This line is where the magic happens. We are setting a source
    // model as the values of attribute. Each time its data needs
    // to be loaded, it will go to that model and load the return
    // values of its 'getAllOptions()' method
    'source'                     => 'catalog/product_attribute_source_countryofmanufacture',
    'global'                     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
    'required'                   => false,
    // You can set this to true, but leaving it as false removes some
    // admin capabilities like deleting the attribute from admin panel.
    'user_defined'               => false,
    // Change the following option to true
    // if the attribute should be required.
    'required'                   => false,
    'class'                      => null,
    'unique'                     => false,
    'searchable'                 => false,
    'filterable'                 => false,
    'comparable'                 => false,
    'visible_on_front'           => false,
    'is_configurable'            => false,
    'visible'                    => true,
);

/*
 * The following method will finally create the attribute
 */
$this->addAttribute(
    Mage_Catalog_Model_Product::ENTITY,
    $attributeCode,
    $attributeOptions, $attributeCode
);

/*
 * This block of code will add the attribute to the attribute sets
 * which are set in the $attributeSets variable
 */
foreach ($attributeSets as $attributeSet) {
    $this->addAttributeToSet(
        Mage_Catalog_Model_Product::ENTITY, $attributeSet,
        $attributeGroup, $attributeCode, $attributeOrder
    );
}

Отказ от ответственности: В этом ответе учитывается, что вы уже знаете, как создавать сценарии установки, и что ваш сценарий установки использует класс Mage_Eav_Model_Entity_Setup или пользовательский класс, который расширяет его.

 4
Author: Dan, 2014-12-01 08:37:48