Thêm một thuộc tính sản phẩm với các giá trị và đánh dấu một giá trị làm mặc định


7

Tôi biết làm thế nào tôi có thể thêm một thuộc tính sản phẩm từ tập lệnh cài đặt, nhưng làm cách nào để bảo Magento sử dụng một trong các giá trị làm giá trị mặc định? (hoặc nhiều giá trị hơn trong trường hợp đó là thuộc tính multiselect).
Tôi sử dụng mã này trong tập lệnh cài đặt để thêm thuộc tính với các tùy chọn:

$installer->addAttribute('catalog_product', "some_code_here", array(
    'type'       => 'int', //or varchar if it's multiselect
    'input'      => 'select', //or multiselect
    'label'      => 'Attribute label here',
    'sort_order' => 1000,
    'required'   => false,
    'global'     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
    'backend'    => 'eav/entity_attribute_backend_array',
    'option'     => array (
        'values' => array(
            0 => 'Value 1',
            1 => 'Value 2',
            2 => 'Value 3',
        )
    ),

)); 

Vì vậy, tôi cần phải làm cho Value 2giá trị mặc định. Hoặc Value 2Value 3trong trường hợp tôi tạo một thuộc tính multiselect


Cách duy nhất tôi biết là lấy các giá trị sau khi tạo thuộc tính, lấy id và cập nhật thuộc tính. Tôi nghĩ bạn đã cố gắng default => 'value 2’?
Fabian Blechschmidt

@FabianBlechschmidt. Cảm ơn. Tôi biết cách tiếp cận này, nhưng đây là điều tôi đang cố gắng tránh. Tôi muốn, nếu có thể, thực hiện nó từ tập lệnh cài đặt, mà không cần thêm bất kỳ lựa chọn và cập nhật nào. Tôi cảm thấy bẩn khi làm điều đó khác. Nhưng nếu không thể, tôi đoán tôi sẽ phải giải quyết nó như thế.
Marius

@Marius có lẽ tôi vẫn còn bối rối. Có phải vấn đề của bạn là bạn có một thuộc tính bạn thêm vào trong tập lệnh thiết lập nhưng các tùy chọn sẽ được thêm sau thông qua quản trị viên? Hoặc một kịch bản thiết lập khác? Hoặc một cái gì đó hoàn toàn khác nhau;)
David Manners

@DavidManners. Tôi đang thêm một thuộc tính thông qua tập lệnh thiết lập và cùng với thuộc tính tôi thêm một số tùy chọn. Và thông qua cùng một kịch bản thiết lập, tôi muốn đặt một trong các tùy chọn làm mặc định. Điều này không có gì để làm với quản trị viên. Giả sử tôi tạo thuộc tính colorvới các tùy chọn Red, Green, Bluevà tôi muốn (không có sự tương tác của quản trị viên) Greentùy chọn là mặc định. Tôi hy vọng điều này đã rõ ràng hơn một chút.
Marius

1
@FabianBlechschmidt. Cũng có thể viết bình luận của bạn như là một câu trả lời. Tôi đoán không có cách nào để làm điều này từ tập lệnh cài đặt một cách thanh lịch.
Marius

Câu trả lời:


7

tl; dr: Đối với các thuộc tính được chọn, điều này không thể được khai báo trực tiếp trong addAttribute()cuộc gọi ban đầu ; hai cuộc gọi được yêu cầu.

Để đặt giá trị mặc định, eav_attribute.defaultphải được đặt với giá trị khóa chính từ eav_attribute_optionbảng Ở mức cao, nhu cầu về hai cuộc gọi là rõ ràng bằng cách xem xét luồng và chức năng của phương thức addAttribute()addAttributeOption():

  1. Chuẩn bị giá trị
  2. Chèn / cập nhật vào eav_attributebảng
  3. Chèn / cập nhật bộ / nhóm
  4. Gọi addAttributeOption()để chèn / cập nhật giá trị tùy chọn

Hy vọng duy nhất sau đó addAttributeOption()sẽ có thể cập nhật eav_attributehồ sơ. Tuy nhiên, không có mã nào làm điều này. Các bảng duy nhất được truy cập bởi phương thức này là eav_attribute_optioneav_attribute_option_value.

Do đó, cần phải gọi getAttribute()sau cuộc gọi ban đầu addAttribute(), lấy ID tùy chọn thuộc tính và sau đó gọi updateAttribute().

Biên tập:

Sau câu trả lời trước đó, tôi không thể giúp xác minh câu trả lời của mình đối với mã hiện có; xét cho cùng, đối với catalog_productcác thực thể, chúng ta có một luồng MVC đẹp để làm theo nhờ vào CRUD GUI. Và ở đó, \Mage_Adminhtml_Catalog_Product_AttributeController::saveAction()tôi đã thấy mô hình thuộc tính được thiết lập với dữ liệu sau ngay trước khi được lưu:

Dữ liệu cấu hình tùy chọn và tùy chọn được hiển thị bằng PhpStorm & Xdebug

Lưu ý rằng defaultgiá trị của thuộc tính có tham chiếu đến các valuekhóa. Thực hiện một chút đào và bạn kết thúc tại \Mage_Eav_Model_Resource_Entity_Attribute::_saveOption(), được gọi từ _afterSave()phương pháp của tài nguyên này - giống như bạn mong đợi khi chúng ta cần có một eav_attributebản ghi để cập nhật. Bạn thậm chí có thể xem cách xử lý đa mặc định và chọn mặc định ở cùng một vị trí, ngay trước khi cập nhật cuối cùng:

$bind  = array('default_value' => implode(',', $attributeDefaultValue));
$where = array('attribute_id =?' => $object->getId());
$adapter->update($this->getMainTable(), $bind, $where);

Vì vậy, một cách khác là làm việc trực tiếp với mô hình tài nguyên.


Cảm ơn. Tôi rất thất vọng về điều này. Tôi đã thực hiện updateAttributephương pháp này, nhưng nên có một cách để làm điều này một cách thanh lịch. Có lẽ trong Magento 2. oh ... và lời giải thích tốt đẹp.
Marius

Cảm ơn, nhưng ... quá tệ là tôi sai! Cố gắng tìm hiểu tại sao mặc dù.
đánh dấu

Bạn có nghĩa là bạn sai. Thật tệ là bạn đúng :)
Marius

Cập nhật - nghĩ rằng tôi đã sai, nhưng tôi đã không. Có thể làm việc trực tiếp với mô hình tài nguyên và có một tiền lệ cho việc này trong cách các thuộc tính được lưu thông qua GUI.
đánh dấu

1
Cảm ơn các cập nhật. Tâm trí tuyệt vời như nhau. Tôi đã kết thúc ở cùng một nơi cho cảm hứng. Đây chính xác là cách tôi xử lý việc này trong thời gian trung bình :)
Marius

0

Trong trình cài đặt Đây là hai dòng sau addAttribution mà ben giải thích để thêm mặc định:

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
. . . . 
. . . . 
. . . .     
$attr = $setup->getAttribute('catalog_product', 'attribute_code');
$setup->updateAttribute('catalog_product',$attr['attribute_id'],'default_value', 'default_value1,default_value2,default_value3,default_value4');

property_code: sẽ là mã thuộc tính default_value1: sẽ là giá trị tương ứng của bạn tách biệt bởi,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.