用自定义图像类型扩展名为“ imageType”的complexType


22

我当前正在开发的模块的目标是添加一个称为“ opengraph_image”的自定义图像类型。我通过可以正常运行的InstallData.php脚本添加了新的EAV属性。现在,我登录到Magento2后端并更改产品时,可以在上载或编辑产品图像时选择图像类型“ opengraph_image”。

但是,在前端我想显示此图像。因此,我在模块中创建了一个etc / view.xml文件,其内容如下:

<?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>

但是现在我得到以下错误:

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

原因是它似乎未加载位于以下app/code/Esites/SEO/etc/custom.xsd位置的我的custom.xsd :我在其中定义opengraph_image。相反,它似乎只是加载了默认的XSD文件:vendor/magento/framework/Config/etc/view.xsd

我的custom.xsd的内容是该原始view.xsd的副本(出于测试目的),我在第75行添加了以下内容:

 <xs:enumeration value="opengraph_image"/>

如果我在原始view.xsd文件中包含上面的行,那么前端确实可以正常工作。我遵循了以下文档:http : //devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html,我的路径是根据该页面上的信息构建的。缓存被多次清除。

我想念什么?


您尝试过更改module="Magento_Catalog"module="Esites_SEO"吗?
拉斐尔(Raphael)在Digital Pianism上2016年

Answers:


9

Magento2加载默认的view.xsd,因为使用ConfigView Reader lib/internal/Magento/Framework/Config/SchemaLocator.php并返回默认值view.xsd

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

我可以按照以下步骤覆盖它:

  • 创建新的扩展名,例如Magento_SampleMinimal
  • 在中创建插件定义 {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>
    
  • 在{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;
        }
    }
    

    Magento 2.0更新

  • 复制lib/internal/Magento/Framework/Config/etc/view.xsd{MODULE}/etc/view.xsd

对于Magento 2.1。版本, 复制Vendor/Magento/Framework/Config/etc/view.xsd{MODULE}/etc/view.xsd *编辑{MODULE}/etc/view.xsd并添加新的类型media_attribute


你是认真的。这是唯一的方法吗?似乎过大了,可能很荒谬,如果不覆盖核心XSD,就无法添加自己的映像
Erfan

那是正确的解决方案。感谢堆积如山的雅罗斯拉夫。
麦地那

非常感谢!但是,我建议您在周围编写插件,Magento\Framework\Config\Dom\UrnResolver因为有些地方直接使用它而不是通过SchemaLocator
quickshiftin

0

结合Magento 2错误,这似乎是设计缺陷。我在这里创建了一个错误报告:https : //github.com/magento/magento2/issues/10161

如果您直接在模板中使用图像构建器来输出opengraph_image,则更好的解决方案是传入自定义属性(使用 Magento\Catalog\Block\Product\ImageBuilder::setAttributes或的第三个参数Magento\Catalog\Block\Product\View::getImage)。

但是,这将不起作用(考虑到我的错误报告),因此您仍然必须重写ImageBuilder的create方法,以将这些属性传递给Catalog Image Helper。


0

有一个比雅罗斯拉夫的答案更简单的方法。可以在模块的di.xml中将构造函数参数更改为SchemaLocator。喜欢:

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

无需插件。


请注意,仅当在SchemaLocator中将$ realPath作为参数时,该解决方案才有效。取决于Magento 2版本。
Pol Ravalitera

-1

您无需修改​​或覆盖view.xsd,该文件仅用于验证。
我最近通过执行以下操作实现了我的解决方案:创建图像目录属性(假设新属性ID为162)。创建属性后,便可以将其应用于任何目录图像。现在,您必须为其应用正确的模型和前端可见性。您可以通过编程方式或按照本指南进行操作。

  1. 使用phpMyAdmin或MySQL打开数据库,然后尝试镜像任何系统属性,例如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. 转到www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xml并添加新的图像类型:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
    
  3. 通过添加新的图像类型来更新模板文件 www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. 清理缓存,您将在前端看到它。

它对我有用,可以将鼠标悬停在类别产品列表上,希望对您有所帮助。


tho 7ochem,这是我的第一个真实帖子。
JROCA22 '02 -2-18

该解决方案无法正常工作,因为Magento正在积极验证XSD
barbazul

@barbazul,如果在开发模式是唯一的,如果我没有记错..
尔法恩

@Erfan可能是。老实说,我没有检查。但是,这仍然表明它不是您应该做的方式,或者特定的XSD中存在问题
barbazul

也许这不是最佳做法,但对我
有用
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.