Как переименовать код атрибута в Magento?

Я хочу переименовать существующий код атрибута в другое. Причина в том, что поле атрибута заполнено для более 300 продуктов, и я не хочу повторно импортировать все из них только потому, что изменил код атрибута.

Ответы

Ответ 1

Вы можете отредактировать его в mysql в eav_attribute.attribute_code. Обязательно сначала выполните резервное копирование и снова проиндексируйте все в System>Index Management.

Ответ 2

Гораздо проще использовать обновление script со следующим содержимым для этого:

$installer = $this;
$installer->startSetup();
$installer->updateAttribute('catalog_product', 'old_attribute_code', array('attribute_code' => 'new_attribute_code'));
$installer->endSetup();

Ответ 3

Вдохните следующие script:

<?php
$write = Mage::getSingleton('core/resource')->getConnection('core_write');
$write->query("
  UPDATE eav_attribute val
  SET  val.attribute_code = "SET VALUE WHAT YOU WANT"
  WHERE  val.attribute_id = (
     SELECT attribute_id FROM eav_attribute eav
     WHERE eav.entity_type_id = 4
       AND eav.attribute_code = 'price'
    )
");

Ответ 4

Гораздо проще использовать обновление script со следующим контентом для этого:

$installer = $this;
$installer->startSetup();
$installer->updateAttribute('catalog_product', 'old_attribute_code', array('attribute_code' => 'new_attribute_code'));
$installer->endSetup();

Вместо полной установки script вы можете запустить это также из простого файла, просто замените

$installer = $this;

с

require_once('./app/Mage.php');
Mage::app();

$installer  = Mage::getModel('eav/entity_setup', 'core_setup');
...

Ответ 5

После того, как вы отредактируете атрибут_код и повторно проиндексируете все, вы также обнаружите, что вам нужно очистить кеширование пурпурного цвета, включая кэш-память Flush Magento и хранилище флеш-памяти, или поочередно rm -rf var/cache/* (см. ниже для оговорок).

Magento использует кеши для хранения запросов, на которые ссылаются Mage::getSingleton('catalog/product')->loadByAttribute('sku',$sku); и, возможно, другие подобные вызовы. Запросы, подобные этому:

SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id`, `e`.`entity_id`, `e`.`attribute_set_id`, `e`.`type_id`, `e`.`cost`, `e`.`created_at`, `e`.`enable_googlecheckout`, `e`.`gift_message_available`, `e`.`has_options`, `e`.`image_label`, `e`.`is_recurring`, `e`.`links_exist`, `e`.`links_purchased_separately`, `e`.`links_title`, `e`.`manufacturer`, `e`.`manufacturer_value`, `e`.`name`, `e`.`news_from_date`, `e`.`news_to_date`, `e`.`price`, `e`.`price_type`, `e`.`price_view`, `e`.`recurring_profile`, `e`.`required_options`, `e`.`shipment_type`, `e`.`short_description`, `e`.`sku`, `e`.`sku_type`, `e`.`small_image`, `e`.`small_image_label`, `e`.`special_from_date`, `e`.`special_price`, `e`.`special_to_date`, `e`.`tax_class_id`, `e`.`thumbnail`, `e`.`thumbnail_label`, `e`.`updated_at`, `e`.`url_key`, `e`.`url_path`, `e`.`visibility`, `e`.`weight`, `e`.`weight_type`, `e`.`[CUSTOM_ATTRIBUTE_CODE]`, `e`.`[CUSTOM_ATTRIBUTE_CODE]` FROM `catalog_product_flat_1` AS `e` WHERE (e.sku = '[SKU]') LIMIT 1

Подробнее о том, что такое кэш Flush Magento и хранилище флеш-кэшей: http://blog.nexcess.net/2011/05/21/clearing-the-cache-in-magento/

Важным пунктом статьи является

Это может показаться тривиальным для тех, кто использует кеш файловой системы по умолчанию с Magento. Вы можете просто войти и вручную "rm -rf var/cache/*", чтобы очистить кеш. Но те из вас, кто использует альтернативные типы кеша (xcache, memcached, apc, db, sqlite), "Flush Magento Cache", возможно, не делают то, что вы хотите. Таким образом, когда все остальное терпит неудачу, и вы хотите убедиться, что кеш полностью чист, обязательно нажмите "Хранить хранилище флешей".

Одно предостережение перед тем, как я попрощаюсь, если вы используете один из типов кэшей общего хранилища - например, два разных приложения, использующих один и тот же memcached-экземпляр, - нажатие на "Хранилище флеш-кэша" может удалить записи кэша для этого другого приложения как Что ж. Возможно, это не то, что вы хотите, поэтому просто обратите внимание.