Mở rộng loại phức hợp có tên là hình ảnh hình ảnh mật mã với một loại hình ảnh tùy chỉnh


22

Mục tiêu của một mô-đun tôi hiện đang phát triển là thêm một loại hình ảnh tùy chỉnh được gọi là "opengraph_image". Tôi đã thêm một thuộc tính EAV mới mặc dù tập lệnh InstallData.php của tôi hoạt động tốt. Khi tôi đăng nhập vào phụ trợ Magento2 và thay đổi sản phẩm, tôi có thể chọn loại hình ảnh "opengraph_image" trong khi tải lên hoặc chỉnh sửa hình ảnh sản phẩm.

Tuy nhiên, trên frontend tôi muốn hiển thị hình ảnh này. Do đó, tôi đã tạo một tệp etc / view.xml trong mô-đun của mình với nội dung sau:

<?xml version="1.0"?>
<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Esites_SEO:etc/custom.xsd">
    <media>
        <images module="Magento_Catalog">
            <image id="opengraph_image" type="opengraph_image">
                <width>265</width>
                <height>265</height>
            </image>
        </images>
    </media>
</view>

Nhưng bây giờ tôi nhận được lỗi sau:

Invalid XML in file /var/www/html/vhosts/magento2/app/code/Esites/SEO/etc/view.xml:
Element 'image', attribute 'type': [facet 'enumeration'] The value 'opengraph_image' is not an element of the set {'thumbnail', 'small_image', 'image', 'swatch_image', 'swatch_thumb'}.
Line: 5

Element 'image', attribute 'type': 'opengraph_image' is not a valid value of the local atomic type.
Line: 5

Lý do là nó dường như không tải custom.xsd của tôi nằm ở: app/code/Esites/SEO/etc/custom.xsdnơi tôi xác định opengraph_image. Thay vào đó, nó dường như chỉ tải tệp XSD mặc định của nó:vendor/magento/framework/Config/etc/view.xsd

Nội dung của custom.xsd của tôi là một bản sao (cho mục đích thử nghiệm) của view.xsd gốc này, nơi tôi đã thêm vào dòng sau trên dòng 75:

 <xs:enumeration value="opengraph_image"/>

Giao diện không hoạt động mà không có lỗi nếu tôi bao gồm dòng trên trong tệp view.xsd gốc. Tôi đã làm theo tài liệu trên: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html và các đường dẫn của tôi được xây dựng theo thông tin trên trang đó. Bộ nhớ cache bị xóa nhiều lần.

Tôi đang thiếu gì?


Bạn đã thử thay đổi module="Magento_Catalog" thành module="Esites_SEO"?
Raphael tại Nghệ thuật piano kỹ thuật số 24/03/2016

Câu trả lời:


9

Tải Magento2 mặc view.xsd vì ConfigView Reader bằng lib/internal/Magento/Framework/Config/SchemaLocator.phpvà nó sẽ trả về mặc địnhview.xsd

$this->schema = $urnResolver
    ->getRealPath('urn:magento:framework:Config/etc/view.xsd');`

Tôi đã có thể ghi đè lên nó bằng cách làm theo các bước dưới đây:

  • Tạo tiện ích mở rộng mới, ví dụ Magento_SampleMinimal
  • Tạo định nghĩa plugin trong {MODULE}/etc/di.xml

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="Magento\Framework\Config\SchemaLocator">
            <plugin name="SampleMinimal_SchemaLocator" type="Magento\SampleMinimal\Model\Plugin\SchemaLocator" sortOrder="1"/>
        </type>
    </config>
  • Tạo plugin trong {MODULE} /Model/Plugin/SchemaLocator.php

    <?php
    namespace Magento\SampleMinimal\Model\Plugin;
    
    use Magento\TestFramework\ObjectManager;
    
    class SchemaLocator
    {
        /**
         * After Get Schema
         *
         * @param \Magento\Framework\Config\SchemaLocator $schemaLocator
         * @param string $result
         * @return array
         */
        public function afterGetSchema(\Magento\Framework\Config\SchemaLocator $schemaLocator, $result)
        {
            $result = sprintf(realpath(__DIR__ . '/../../etc/view.xsd'));
            return $result;
        }
    }

    Cập nhật cho Magento 2.0. phiên bản

  • Sao chép lib/internal/Magento/Framework/Config/etc/view.xsdvào{MODULE}/etc/view.xsd

Đối với Magento 2.1. phiên bản, Sao chépVendor/Magento/Framework/Config/etc/view.xsdvào{MODULE}/etc/view.xsd * Chỉnh sửa{MODULE}/etc/view.xsdvà thêm loại mớimedia_attribute


Bạn có nghiêm túc không .. Đây có phải là cách duy nhất? Có vẻ quá mức cần thiết và có thể nực cười khi bạn không thể thêm hình ảnh của riêng mình mà không ghi đè lên lõi XSD
Erfan

Đó là giải pháp đúng đắn. Cảm ơn rất nhiều cho điều đó.
medina

Điều này là rất tốt, cảm ơn bạn! Tuy nhiên, tôi khuyên bạn nên viết Plugin xung quanh Magento\Framework\Config\Dom\UrnResolvervì có những nơi sử dụng nó trực tiếp thay vì đi qua SchemaLocator.
quickshiftin

0

Đây dường như là một lỗ hổng thiết kế, kết hợp với lỗi Magento 2. Tôi đã tạo một báo cáo lỗi tại đây: https://github.com/magento/magento2/issues/10161

Nếu bạn đang sử dụng trình tạo hình ảnh trực tiếp trong một mẫu để xuất opengraph_image, một giải pháp tốt hơn là chuyển vào các thuộc tính tùy chỉnh (sử dụng Magento\Catalog\Block\Product\ImageBuilder::setAttributeshoặc tham số thứ ba của Magento\Catalog\Block\Product\View::getImage).

Tuy nhiên, điều đó sẽ không hoạt động (với lỗi của tôi), vì vậy bạn sẽ vẫn phải ghi đè createphương thức ImageBuilder để chuyển các thuộc tính đó vào Trình trợ giúp hình ảnh danh mục.


0

Có một cách đơn giản hơn câu trả lời của Yaroslav. Có thể thay đổi các tham số của hàm tạo thành SchemaLocator trong di.xml của mô-đun. Như:

<type name="Magento\Framework\Config\SchemaLocator" >
    <arguments>
        <argument name="realPath" xsi:type="string">urn:magento:module:VendorName_ModuleName:etc/view.xsd</argument>
    </arguments>
</type>

Không cần một Plugin.


Coi chừng, giải pháp đó chỉ hoạt động nếu bạn có $ realPath làm đối số trong SchemaLocator. Phụ thuộc vào phiên bản Magento 2.
Pol Ravalitera

-1

Bạn không cần sửa đổi hoặc ghi đè view.xsd, tệp này chỉ để xác thực.
Gần đây tôi đã thực hiện một giải pháp của mình bằng cách thực hiện như sau: Tạo thuộc tính danh mục hình ảnh (giả sử rằng ID thuộc tính mới 162). Khi bạn đã tạo thuộc tính, bạn sẽ có thể áp dụng nó trên bất kỳ hình ảnh danh mục nào. Bây giờ bạn phải áp dụng cho nó đúng mô hình và tầm nhìn phía trước. Bạn có thể làm điều đó theo chương trình hoặc làm theo hướng dẫn này.

  1. Mở cơ sở dữ liệu của bạn bằng phpMyAdmin hoặc MySQL và cố gắng phản chiếu bất kỳ thuộc tính hệ thống nào như small_image

    use magento2_database_name;
    SELECT * FROM  `eav_attribute`;
    UPDATE `magento2_database_name`.`eav_attribute` SET `frontend_model` = 'Magento\\Catalog\\Model\\Product\\Attribute\\Frontend\\Image' WHERE  `eav_attribute`.`attribute_id` =162;
    SELECT * FROM  `catalog_eav_attribute`;
    UPDATE `magento2_database_name`.`catalog_eav_attribute` SET `is_visible` = '1', 'using_in_product_listing' = '1' WHERE `catalog_eav_attribute`.`attribute_id` =162;
  2. Chuyển đến www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xmlvà thêm loại hình ảnh mới của bạn:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
  3. Cập nhật tệp mẫu bằng cách thêm loại hình ảnh mới vào www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. Làm sạch bộ nhớ cache của bạn và bạn sẽ thấy nó ở mặt trước.

Nó làm việc cho tôi cho một hình ảnh di chuột trên danh sách sản phẩm danh mục, hy vọng sự giúp đỡ này.


7xem, đây là bài viết thực sự đầu tiên của tôi.
JROCA22

Giải pháp này không hoạt động vì Magento đang tích cực xác nhận XSD
barbazul

@barbazul chỉ khi bạn ở chế độ nhà phát triển nếu tôi nhớ chính xác ..
Erfan

@Erfan Nó có thể. Tôi đã không kiểm tra, trung thực. Tuy nhiên, đó là một dấu hiệu cho thấy đó không phải là cách bạn phải làm điều đó hoặc có điều gì đó không đúng trong XSD cụ thể đó
barbazul

Có thể đó không phải là cách tốt nhất nhưng nó hiệu quả với tôi
JROCA22
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.