2011-10-21 36 views
9

là có thể thay đổi loại thuộc tính sau khi thuộc tính đã được tạo. Tôi muốn thay đổi loại thuộc tính nhất định thành Danh sách đa lựa chọn. Loại thuộc tính này hiện là 'Thả xuống'. Thực ra Khi tôi tạo các thuộc tính, không cần phải chọn đa khi tạo nó ban đầu, nhưng bây giờ khách hàng muốn thay đổi nó thành "Đa lựa chọn".Loại thuộc tính thay đổi Magento trong phần phụ trợ

Hãy giúp tôi, tôi không thể tạo thuộc tính mới bằng cách xóa các thuộc tính cũ, vì có một số dữ liệu và một phần thiết kế nào đó được mã hóa cứng và phụ thuộc vào các giá trị thuộc tính nhất định.

Trả lời

17

Có nó có thể lập trình nhờ vào các phương pháp Mage_Eav_Model_Entity_Setup::updateAttribute($entityTypeId, $id, $field, $value=null, $sortOrder=null)

Đó là không thể với Ban Quản lý thuộc tính trong Magento Backend bởi vì nó có hậu quả với các dữ liệu hiện có. Trong trường hợp của bạn, việc thay đổi từ chọn thành multiselect sẽ là ok nhưng thực hiện sao lưu cơ sở dữ liệu và kiểm tra nếu sản phẩm của bạn vẫn được hiển thị chính xác.

Theo cách lập trình, cách tốt nhất là làm điều đó từ tập lệnh thiết lập cập nhật. Tôi không biết mô-đun của bạn nhưng đây là một số thông tin để làm điều đó.

Tập lệnh thiết lập cập nhật được khởi chạy khi bạn cung cấp phiên bản số mới cho mô-đun của mình và bạn cung cấp tập lệnh thiết lập với số phiên bản cũ và mới làm tên tệp.

1) Dưới đây là tiêu đề của mô-đun config.xml, thay đổi nó để cung cấp phiên bản cao hơn. Ví dụ, phiên bản mới là

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
<modules> 
    <Mycompany_Mymodule> 
     <version>1.0.1</version><!-- the old one was 1.0.0 --> 
    </Mycompany_Mymodule> 
</modules> 
... 
</config> 

2) bạn cần phải có trong file config.xml, giữa các thẻ <global>...</global> đoạn mã sau, xin vui lòng thích ứng với tình hình của bạn:

<resources> 
     <mymodule_setup><!-- name that you will give to the folder into the sql folder --> 
      <setup> 
       <module>Mycompany_Mymodule</module> 
       <class>Mage_Eav_Model_Entity_Setup</class><!-- You can have a setup class which extends this class --> 
      </setup> 
      <connection> 
       <use>default_setup</use> 
      </connection> 
     </mymodule_setup> 
    </resources> 

3) Sau đó, bạn cần tạo tập lệnh thiết lập trong thư mục mô-đun của mình với phiên bản ứng dụng/mã số cũ/mới/local/mycompany/mymodule/sql/mymodule_setup/mysql4-upgrade-1.0.0-1.0.1.php (mysql4-upgrade-old.version.number-new.version.number.php)

4) Và trong kịch bản mới này thiết lập một mã như thế này, xin vui lòng thích ứng với tình hình của bạn:

<?php 
$installer = $this; 
/*@var $installer Mage_Eav_Model_Entity_Setup */ 

$entityTypeId = $installer->getEntityTypeId('catalog_product'); 

$idAttributeOldSelect = $this->getAttribute($entityTypeId, 'myold_attribute', 'attribute_id'); 
$installer->updateAttribute($entityTypeId, $idAttributeOldSelect, array(
    'frontend_input' => 'multiselect' 
)); 

5) Làm mới trang Magento của bạn và cuối cùng tuôn bộ nhớ cache

+0

cảm ơn câu trả lời chi tiết như vậy, tôi sẽ thử giải pháp do bạn đề xuất ... – Ravish

+0

@mushin là đúng. Bạn muốn ''frontend_input'' trong lệnh' updateAttribute() ', không phải'' input''. (Thử nghiệm trên Magento 1.9.0.1) –

+0

@TylerV. nếu bạn kiểm tra lớp 'Mage_Eav_Model_Entity_Setup :: _ prepareValues' bạn sẽ thấy rằng' đầu vào' sẽ làm việc –

0

Bạn có thể thử phương thức Mage_Eav_Model_Entity_Setup::updateAttribute.

6

4.I nghĩ cập nhật sử dụng các trường cơ sở dữ liệu, tức là đầu vào nên frontend_input.

<?php 
$installer = $this; 
/*@var $installer Mage_Eav_Model_Entity_Setup */ 

$entityTypeId = $installer->getEntityTypeId('catalog_product'); 

$idAttributeOldSelect = $this->getAttribute($entityTypeId, 'myold_attribute', 'attribute_id'); 
$installer->updateAttribute($entityTypeId, $idAttributeOldSelect, array(
    'frontend_input' => 'multiselect' 
)); 
+0

Khi làm theo điều này, tôi cũng phải đặt 'backend_type' => 'varchar', 'backend_model' => 'eav/entity_attribute_backend_array'' – clockworkgeek

+0

I cố gắng này nó không hoạt động? –

0

Trước tiên, bạn cần phải cập nhật các loại đầu vào thuộc tính để Multiselect sử dụng mã dưới đây nói:

UPDATE eav_attribute SET 
entity_type_id = '4', 
attribute_model = NULL, 
backend_model = 'eav/entity_attribute_backend_array', 
backend_type = 'varchar', 
backend_table = NULL, 
frontend_model = NULL, 
frontend_input = 'multiselect', 
frontend_class = NULL 
WHERE attribute_id = 'YOUR_ATTRIBUTE_ID_HERE'; 

Bây giờ, sao chép các giá trị thuộc tính từ bảng cũ sang mới:

INSERT INTO catalog_product_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) 
SELECT entity_type_id, attribute_id, store_id, entity_id, value 
FROM catalog_product_entity_int 
WHERE attribute_id = YOUR_ATTRIBUTE_ID_HERE; 

Cuối cùng, loại bỏ các giá trị cũ nếu không chúng sẽ xung đột với thiết lập mới (giá trị cũ sẽ tải, nhưng Magento sẽ lưu giá trị mới vào bảng varchar):

DELETE FROM catalog_product_entity_int 
WHERE entity_type_id = 4 and attribute_id = YOUR_ATTRIBUTE_ID_HERE; 
Các vấn đề liên quan