"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

그 이유는 opengraph_image를 app/code/Esites/SEO/etc/custom.xsd정의하는 위치에 내 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"?
— 디지털 피아니즘의 Raphael

답변:


9

ConfigView Reader를 사용하여 Magento2가 기본 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;
        }
    }

    마 젠토 2.0 업데이트 . 번역

  • 복사 lib/internal/Magento/Framework/Config/etc/view.xsd에{MODULE}/etc/view.xsd

마 젠토 2.1. version, CopyVendor/Magento/Framework/Config/etc/view.xsdto{MODULE}/etc/view.xsd *{MODULE}/etc/view.xsd새로운 유형의편집및 추가media_attribute


당신은 진지합니다. 이것이 유일한 방법입니까? 코어 XSD를 덮어 쓰지 않고 자신의 이미지를 추가 할 수 없다는 말은 너무 과장된 것 같습니다.
— Erfan

이것이 올바른 해결책입니다. 야로슬라프에게 감사합니다.
— medina

감사합니다! 그러나을 Magento\Framework\Config\Dom\UrnResolver거치지 않고 직접 사용하는 장소가 있으므로 플러그인을 작성하는 것이 좋습니다 SchemaLocator.
— quickshiftin

0

이것은 마 젠토 2 버그와 함께 디자인 결함으로 보인다. https://github.com/magento/magento2/issues/10161 에서 버그 리포트를 만들었습니다.

opengraph_image를 출력하기 위해 템플리트에서 직접 이미지 빌더를 사용하는 경우 더 나은 솔루션은 사용자 정의 속성 ( Magento\Catalog\Block\Product\ImageBuilder::setAttributes또는, 또는 세 번째 매개 변수 사용)을 전달하는 것입니다 Magento\Catalog\Block\Product\View::getImage.

그러나 (작동하지 않는 버그 보고서) 작동하지 않으므로 create이러한 속성을 카탈로그 이미지 도우미에 전달 하려면 ImageBuilder의 메소드를 재정의해야합니다 .


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

이 솔루션은 젠토 등의 작업을 적극적으로 XSD 유효성 검사가되지 않습니다
— barbazul

@barbazul 내가 올바르게 기억한다면 개발자 모드에있는 경우에만 가능합니다.
— Erfan

@ Erfan 그것은 될 수 있습니다. 솔직히 확인하지 않았습니다. 그러나 여전히, 그것은 당신이 어떻게해야하는지가 아니거나 특정 XSD에 문제가 있다는 표시입니다
— barbazul

어쩌면 그것은 최선의 방법은 아니지만 그것은 나를 위해 일했다
— JROCA22
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.