"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.