Làm thế nào để các thuộc tính mở rộng hoạt động trong Magento 2?


7

Tôi không chắc những gì các tài liệu đang nói.

Tôi biết rằng chúng được sử dụng để thêm các thuộc tính (phức tạp hoặc không) thông qua etc/extension_attributes.xmlvà tôi đã quản lý để làm cho quá trình biên dịch tạo giao diện với các phương thức tùy chỉnh tự động tạo, nhưng đó là về nó.

Ví dụ, hãy lấy một vài giao diện: github link 1github link 2 . Làm cách nào tôi có thể sử dụng các thuộc tính mở rộng để thêm các thuộc tính nhất định vào một trong các giao diện đó? Tôi không quan tâm đến việc tham gia phức tạp. Chỉ cần thêm một thuộc tính vô hướng, nói "attr1" của loại string.

Các Datagiao diện là cổng vào dữ liệu ... của mô hình, vì vậy tôi cần hiểu cách mở rộng của các giao diện đó hoạt động để sử dụng đúng hệ thống. Tôi thường nhận được một Datagiao diện như một thông số thay vì một mô hình thực tế và điều đó thực sự ổn. Nhưng tôi hơi bối rối về cách các phần mở rộng hoạt động.

Câu trả lời:


14

Thuộc tính mở rộng là một cách để mở rộng Giao diện. Hãy lấy ví dụ về liên kết đầu tiên bạn cung cấp cho ProductAttributionMediaGalleryEntryInterface. Nếu bạn nhìn vào các phương thức ở đó bạn sẽ thấy rằng nó có phương pháp này

/**
 * Retrieve existing extension attributes object or create a new one.
 *
 * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface|null
 */
public function getExtensionAttributes();

Lưu ý loại @return của phương thức ProductAttributionMediaGalleryEntryExtensionInterface - đây là giao diện sẽ được tạo lại nếu bạn xác định thuộc tính mở rộng cho ProductAttributionMediaGalleryEntryInterface (theo mặc định, nó được tạo không có phương thức). Tên của thuộc tính bạn đã đăng ký sẽ được sử dụng để tạo các phương thức giao diện.

Giả sử bạn đã thêm attr1 của chuỗi loại. Những gì bạn có thể làm sau khi giao diện được tái tạo là truy cập nó từ thể hiện của giao diện.

$entity = $objectManager->get('..\ProductAttributeMediaGalleryEntryInterface')
$entity->getExtensionAttributes()->getAttr1();

Để đặt thuộc tính, bạn cần khởi tạo giao diện Thuộc tính mở rộng

$extension = $objectManager->get('..\ProductAttributeMediaGalleryEntryExtensionInterface')
$extension->setAttr1('value');
$entity->setExtensionAttributes($extension)

Cái sau là kịch bản mặc định có sẵn, nó có thể được đơn giản hóa tùy thuộc vào cách mở rộng giao diện cha mẹ và phần mở rộng.

[Đã cập nhật]

Thuộc tính tùy chỉnh và thuộc tính mở rộng phục vụ các mục đích khác nhau.

Các thuộc tính tùy chỉnh là cần thiết để thể hiện các thuộc tính EAV của thực thể. Hầu hết các thuộc tính EAV là động: chúng có thể được thêm sau khi Magento được triển khai thông qua giao diện người dùng quản trị viên. Đó là lý do tại sao bạn không thể tự động hoàn thành mã cho các thuộc tính EAV: bạn không biết về tất cả chúng trước thời hạn.

Tuy nhiên, là nhà phát triển tiện ích mở rộng, bạn chắc chắn biết về một số thuộc tính - những thuộc tính mà bạn đã tạo tại thời điểm phát triển. Nó có thể là một trường mới trong cơ sở dữ liệu, trường trong cơ sở dữ liệu liên quan hoặc thuộc tính EAV. Bạn có thể đăng ký chúng làm thuộc tính mở rộng vì chúng không bao giờ thay đổi trừ khi cơ sở mã được thay đổi. Bạn có thể nhận được mã tự động hoàn thành cho họ.


Bây giờ rõ ràng hơn nhiều, cảm ơn rất nhiều. Bây giờ tất cả các loại câu hỏi khác phát sinh, nhưng tôi sẽ tạo các bài đăng khác cho họ.
nevvermind

Trên thực tế, một câu hỏi nữa ở đây nếu bạn không phiền. Khi lưu Sản phẩm bằng thuộc tính EAV tùy chỉnh, chúng ta có thể sử dụng setCustomAttribute(), nhưng tôi thích tính năng tự động hoàn thành mà tôi nhận được từ các giao diện mở rộng được tạo tự động. Nhưng, nếu tôi muốn sử dụng đó, tôi cần phải thiết lập phần mở rộng bản thân mình . Vì vậy, phần mở rộng là một điều thủ công? Có lẽ điều này nói tốt hơn những gì tôi đang cố nói: gist.github.com/nevvermind/155952b0b01773f4b42f
nevvermind

Tôi đã cập nhật câu trả lời chính của mình để giải quyết câu hỏi này. Xin vui lòng cho tôi biết điều đó làm cho nó rõ ràng hơn
Eugene Tulika

Tôi nghĩ rằng "thuộc tính tùy chỉnh" và "thuộc tính mở rộng" trùng lặp phần nào, bởi vì bạn cũng có thể tự động hoàn thành cho attrs được tạo bằng GUI hoặc theo lập trình. Tôi nghĩ rằng tất cả chúng đều phục vụ cùng một mục đích (mở rộng API của một thực thể), nhưng hoạt động khác nhau (một số có UI, một số không, thậm chí không có EAV hoặc thậm chí vẫn tồn tại, nhưng được tính toán, v.v.) - và extension_attributes.xmlcó thể bắt được tất cả - nếu bạn muốn, đó là. Nói chung, bây giờ tôi đủ tự tin để giải quyết vấn đề mở rộng. Nhiều nghĩa vụ.
nevvermind

Tôi muốn nói rằng bạn có thể tự động hoàn thành cho attrs được tạo bằng GUI hoặc theo chương trình, nếu bạn ánh xạ chúng trong tệp extension_attribut.xml .
nevvermind

1

Để hoàn thành câu trả lời @EugeneTulika, chúng ta cần tạo /etc/extension_attribut.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="Magento\Catalog\Api\Data\ProductInterface">
        <attribute code="attr1" type="string" />
    </extension_attributes>
</config>

Sau đó, bạn có thể đặt thuộc tính mới của mình bằng phương thức setAttr1 (), như bên dưới:

/** @var ProductExtension $extensionAttributes */
$extensionAttributes = $product->getExtensionAttributes();
$extensionAttributes->setAttr1('super data');
$product->setExtensionAttributes($extensionAttributes);

Hy vọng điều này cũng có thể giúp được ai đó :)

Sẽ

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.