「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、opengraph_imageを定義する場所にあるcustom.xsdをロードしていないようです。代わりに、デフォルトの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"か?
デジタルピアニズムのラファエル

回答:


9

Magento2は、ConfigView Readerを使用してデフォルトを返すため、デフォルトのview.xsdをロードし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


本気ですか。これが唯一の方法ですか?過剰
すぎるよう

それが正しい解決策です。ヤロスラフに感謝します。
メディナ

本当にありがとうございます!ただし、をMagento\Framework\Config\Dom\UrnResolver経由する代わりに直接使用する場所があるため、プラグインを記述することをお勧めしSchemaLocatorます。
クイックシフト

0

これは、Magento 2のバグと組み合わせた設計上の欠陥のようです。ここにバグレポートを作成しました:https : //github.com/magento/magento2/issues/10161

テンプレートで画像ビルダーを直接使用してopengraph_imageを出力する場合、より良い解決策はカスタム属性を渡すことです( Magento\Catalog\Block\Product\ImageBuilder::setAttributes、またはの3番目のパラメーターを使用Magento\Catalog\Block\Product\View::getImage)。

ただし、それは機能しません(バグレポートが与えられたため)、ImageBuilderのcreateメソッドをオーバーライドして、これらの属性をカタログ画像ヘルパーに渡す必要があります。


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. キャッシュを消去すると、フロントエンドに表示されます。

カテゴリの商品リストにカーソルを合わせるとうまくいきました。


thx 7ochem、それは私の最初の本当の投稿です。
JROCA22

MagentoがXSDをアクティブに検証しているため、このソリューションは機能しません
-barbazul

@barbazulそれはあなたが開発者モードにいる場合にのみ私が正しく思い出す場合です
。.–エルファン

@Erfan可能性があります。正直、チェックしていません。しかし、それでも、それはあなたがそれをする方法ではない、またはその特定のXSDに何か問題があるという
兆候です-barbazul

多分それはベストプラクティスではありませんが、それは私のために働いた
JROCA22
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.