在 Sulu 模板中使用 xpointer 包含属性

Including properties with xpointer in Sulu templates

我已经设置了一些 Sulu 模板,我已经能够使用此处描述的方法将整个文件的内容包含在多个模板中:

https://docs.sulu.io/en/2.1/book/templates.html

我正在使用:

<xi:include href="fragments/common-properties.xml"/

这很完美

然而,我随后尝试使用 xpointer 方法包​​含来自另一个模板的属性(以便我可以在一个文件中包含所有模板的一系列通用属性,以及为各个模板定义特定属性)

我的根模板在这里:(root-page-test.xml)

<?xml version="1.0" ?>
<template xmlns="http://schemas.sulu.io/template/template"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude"
          xsi:schemaLocation="http://schemas.sulu.io/template/template http://schemas.sulu.io/template/template-1.0.xsd">

    <key>my-account-page-react</key>

    <view>pages/my-account-page-react</view>
    <controller>App\Controller\Headless\HeadlessWebsiteController::indexAction</controller>
    <cacheLifetime>604800</cacheLifetime>

    <meta>
        <title lang="en">Test including properties</title>
    </meta>
    
    <properties>
        <property name="header" type="text_line">
            <meta>
                <title lang="en">Header</title>
            </meta>
        </property>

        <xi:include href="include.xml"
            xpointer="xmlns(sulu=http://schemas.sulu.io/template/template)
                      xpointer(/sulu:properties/sulu:property)"/>

    </properties>
    
    

    
</template>

包含我想要包含的属性的模板在这里:(include.xml)

<?xml version="1.0" ?>
<template xmlns="http://schemas.sulu.io/template/template"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude"
          xsi:schemaLocation="http://schemas.sulu.io/template/template http://schemas.sulu.io/template/template-1.1.xsd">

    <key>include-test</key>
    
    <view>pages/my-account-page-react</view>
    <controller>App\Controller\Headless\HeadlessWebsiteController::indexAction</controller>
    <cacheLifetime>604800</cacheLifetime>
    
    <meta>
        <title lang="en">Test include</title>
    </meta>
    
    <properties>
        
        <property name="url" type="resource_locator" mandatory="true">
            <meta>
                <title lang="en">Resourcelocator</title>
            </meta>

            <tag name="sulu.rlp"/>
        </property>
        
        <property name="title" type="text_line" mandatory="true"> 
            <meta>
                <title lang="en">Title</title> 
            </meta>
            <params>
                <param name="headline" value="true"/> 
            </params>

            <tag name="sulu.rlp.part"/>
        </property>

        <property name="article" type="text_editor">
            <meta>
                <title lang="en">Article</title>
            </meta>
        </property>

    </properties>
</template>

加载管理界面时,ajax 请求之一出现以下错误:

[ERROR 1612] XPointer evaluation failed: #xmlns(sulu=http://schemas.sulu.io/template/template) xpointer(/sulu:properties/sulu:property) (in C:\xampp\htdocs\<vhost>/config/templates/pages\root-page-test.xml - line 26, column 0)↵[ERROR 1604] could not load include.xml, and no fallback was found (in C:\xampp\htdocs\<vhost>/config/templates/pages\root-page-test.xml - line 26, column 0)↵[ERROR 1871] Element '{http://www.w3.org/2001/XInclude}include': This element is not expected. (in C:\xampp\htdocs\<vhost>/config/templates/pages\root-page-test.xml - line 26, column 0)

两个文件在同一个目录下

我哪里错了?

您的 XPointer 不正确,因为如果您以 / 开头,则意味着您从文档的根目录开始。因此,如果您执行 /sulu:properties/sulu:property,XPointer 会假定您要包含的文件的根目录中应该有一个 properties 标记。我的建议是你制作一个这样的文件 (this is also shown in the last code snippet in our documentation in this heading):

<?xml version="1.0" ?>
<properties xmlns="http://schemas.sulu.io/template/template"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://schemas.sulu.io/template/template http://schemas.sulu.io/template/template-1.1.xsd">
    <property name="url" type="resource_locator" mandatory="true">
        <meta>
            <title lang="en">Resourcelocator</title>
        </meta>

        <tag name="sulu.rlp"/>
    </property>
        
    <property name="title" type="text_line" mandatory="true"> 
        <meta>
            <title lang="en">Title</title> 
        </meta>
        <params>
           <param name="headline" value="true"/> 
        </params>
        <tag name="sulu.rlp.part"/>
    </property>

    <property name="article" type="text_editor">
        <meta>
            <title lang="en">Article</title>
        </meta>
    </property>
</properties>

这样你也可以去掉不必要的元素,如 viewcontroller 标签,在这种情况下不需要这些元素。

或者,您也可以调整包含的 XPointer:

<xi:include href="include.xml" xpointer="xmlns(sulu=http://schemas.sulu.io/template/template)xpointer(/sulu:template/sulu:properties/sulu:property)" />

注意 xpointer 开头的附加 sulu:template