Sử dụng Thực thể làm Thuộc tính của Thực thể khác trong Magento


7

Tôi sẽ làm theo hướng dẫn này nhưng câu hỏi của tôi là .. có thể sử dụng Thực thể EAV làm thuộc tính của Thực thể EAV mới không?

Cảm ơn.

EDIT : Hướng dẫn mà tôi đã đăng ban đầu khá lộn xộn và cuối cùng tôi đã làm theo hướng dẫn khác này .

Câu trả lời:


13

Vâng nó có thể.
bạn cần thêm một thuộc tính cho thực thể chính có mô hình nguồn tùy chỉnh.

Giả sử các thực thể của bạn được gọi ArticleAuthorbạn muốn Articlethực thể có thuộc tính và Authorvì vậy khi bạn thêm / chỉnh sửa và bài viết, bạn có thể chọn từ một trong số tất cả các tác giả.

Bạn cần thêm phần này vào lớp thiết lập ( TC_Skeleton_Model_Resource_Setuptừ ví dụ bạn đã liên kết) trong số các thuộc tính khác:

               'author_id' => array(
                    'type' => 'int',
                    'label' => 'Author',
                    'input' => 'select',
                    'required' => true, //or false
                    'sort_order' => 10, //what ever
                    'position' => 10,//what ever
                    'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL, //or SCOPE_WEBSITE or SCOPE_STORE,
                    'source' => '[module_alias]/source_author', //this needs to be added
                ),   

Bây giờ tạo lớp [Namespace]_[Module]_Model_Source_Authorvới nội dung này

<?php
class [Namespace]_[Module]_Model_Source_Author extends Mage_Eav_Model_Entity_Attribute_Source_Abstract{
    protected $_options = null;
    public function getAllOptions($withEmpty = false){
        if (is_null($this->_options)){
            $this->_options = array();
            $authors = Mage::getModel('[module_alias]/author')->getCollection()->addAttributeToSelect('name')->addAttributeToSelect('country');
            foreach ($authors as $author) {
                $this->_options[] = array(
                    'value' => $author->getId(),
                    'label' => $author->getName(). ' - '.$author->getCountry()
                );
            }
        }
        $options = $this->_options;
        if ($withEmpty) {
            array_unshift($options, array('value'=>'', 'label'=>''));
        }
        return $options;
    }
    public function getOptionText($value)
    {
        $options = $this->getAllOptions(false);

        foreach ($options as $item) {
            if ($item['value'] == $value) {
                return $item['label'];
            }
        }
        return false;
    }
}

Ngoài ra, bạn có thể tìm thấy ở đây và ví dụ về cách thêm một thuộc tính với mô hình nguồn tùy chỉnh vào các sản phẩm. Nếu thực thể của bạn là EAV, nó sẽ hoạt động như nhau. Phần quan trọng nhất là getAllOptionsphương thức trong lớp được đề cập ở trên. bạn có thể làm bất cứ điều gì trong đó miễn là bạn trả về một mảng các giá trị.

Ngoài ra phần mở rộng này có thể giúp đỡ. Nó có thể xây dựng nhanh chóng các tệp bạn cần cho các thực thể của mình (EAV hoặc căn hộ) và nó cũng cho phép bạn thiết lập quan hệ giữa các thực thể (một đến nhiều hoặc nhiều với nhiều). Trong trường hợp của bạn, bạn cần một mối quan hệ một đến nhiều.


Tôi tham gia vào việc phát triển tiện ích mở rộng, nhưng mọi người đều có thể sử dụng hoặc thay đổi miễn phí.


4
GÌ?! KHUYẾN MÃI TỰ ĐỘNG! jk / câu trả lời tuyệt vời :)
Sander Mangel

@Sander Tôi không có gì phải xấu hổ :)
Marius

Một điều. Trong ví dụ của bạn, hãy tưởng tượng rằng "Tác giả" có một thuộc tính được gọi là "quốc gia". Có thể hiển thị "Tác giả - Quốc gia" dưới dạng tùy chọn thả xuống trong Thực thể bài viết không?
VDD

1
@VDD Tôi đã sửa đổi mã cho phù hợp với nhu cầu của bạn.
Marius

@Marius làm thế nào có thể truy cập mô hình nguồn từ các tiện ích mở rộng khác? Tôi đang thực hiện tiện ích mở rộng adminhtml với các trường được chọn cho tất cả các thuộc tính này của Thực thể EAV mới. Tôi đã thử $ fieldset-> addField ('tác giả', 'select', mảng ('nhãn' => $ this -> __ ('Tác giả'), 'class' => 'required-entry', 'required' => true, 'name' => 'tác giả', 'value' => '1', 'value' => Mage :: getResourceModel ('namepace_module / source_ Author) -> getAllOptions (),)); nhưng tôi gặp lỗi Phương thức không hợp lệ Namespace_Module_Model_Author :: addFieldToSelect (Array ([0] => name))
VDD
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.