将XSLT与Xtento结合使用’订单导出Magento模块
将XSLT与Xtento结合使用’订单导出Magento模块

将XSLT与Xtento结合使用’订单导出Magento模块

2016年10月27日发布 in 发展历程
法师nto 2中的Icon字体:基础
法师nto 2:基础的图标字体
2016年10月18日
用户验收测试:Magento 2
用户验收测试Magento 2网站
2016年11月16日

概述示例

当使用ERP集成或其他需要Magento数据采用非常特定格式的系统时,有两种选择。您可以编写一个自定义模块来处理将Magento数据直接转换为最终产品所需的格式,或者可以使用已构建的模块。

最近,我发现自己处于一种情况,即客户具有需要重新格式化数据的自定义ERP集成。此外,该格式比Magento数据的格式还差很多。对于这种情况,我转向使用XTENTO 订购 Export,因为它带有XSLT选项。

这只会覆盖其中的XSLT部分。 XTENTO 有关如何使用其产品的优秀文档。

最简单的XSLT是一种将XML转换为其他格式的语言,例如HTML或格式不同的XML。

如果您具有一些如下所示的XML结构:

1
2
3
4
5
6
7
8
9
10
11
<?XML文件 ="1.0" 编码方式=“ UTF-8”?>
<破坏者>
<名字>杰米</名字>
<>海尼曼</>
<pet_name></pet_name>
</破坏者>
<破坏者>
<名字>卡里</名字>
<>拜伦</>
<pet_name>格蒂</pet_name>
</破坏者>

也许您只是想从此文档中获得宠物的名字。以下XSLT代码将实现该目标。

1
2
3
4
5
6
7
8
9
10
11
12
<?XML文件 ="1.0" 编码方式=“ UTF-8”?>
    <xsl:样式表 ="1.0" XML文件ns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:模板 比赛=“ /”>
        <ul>
            <xsl:对于- 选择=“破坏者”>
                <>
                    <xsl:-选择=“宠物名” />
                </>  
            </xsl:对于->
        </ul>  
    </xsl:模板>
    </xsl:样式表>

上面XSLT的输出如下,考虑到数据样本的大小,我们可以手动完成此操作,而这不会是一项繁重的工作。

1
2
        
        格蒂

现在,我们已经了解了XSLT的用途,以及对可以实现的结果的想法,让我们继续进行一些有用的工作。我们将把Cute 猫 Inc.的Magento订单XML转换为他们的ERP期望的XML格式。

这是至关重要的业务,因为人们需要携带可爱的猫咪照片出门,因此从客户角度来看,速度越快越好。

就以下示例而言,我们将与以下产品一起订购:

1
2
3
产品 名称        产品 ku      产品 数量         产品 价钱
, 太棒了        150-ku-01          1                   $699.00
,            150-ku-02          1                   $555.00

以下是我们将使用的XML结构的示例。 法师nto通过XML以可预测的方式存储订单。这个例子并不精确,但是对于我们的例子来说已经足够接近了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
     <!- 简化 怎么样 马真托 商店 订购 信息 一个 XML文件 ->
    <!- 可爱 成立公司 - 我们 专攻 可爱 ->
    <订单>
        <订购>
            <增量编号>100000034</增量编号>
            <订购_item>
                <名称>, 太棒了</名称>
                <ku>150-ku-01</ku>
                <数量>1</数量>
                <价钱>699.000</数量>
            </订购_item>
            <订购_item>
                <名称>, 太棒了</名称>
                <ku>150-ku-01</ku>
                <数量>1</数量>
                <价钱>699.000</数量>
            </订购_item>
        </订购>
    </订单>

我们尝试达到的格式类似于以下示例:

1
2
3
4
5
6
     <!- 企业资源计划 格式 对于 订单 ->
    <!- 商业 通常 有限责任公司 - 企业资源计划 ->
    100000034,1
    <!- 订购 ID, 订购 (如果 订单 这个 增量) ->
    太棒了,150-ku-01,1.0000,699.0000, <!- 项目 名称, ku, 数量, 价钱 ->
    ,150-ku-02,1.0000,555.0000, <!- <!- 项目 名称, ku, 数量, 价钱 ->

为此,我们将创建一个XSL模板,该模板将用于Magento的所有订单。定义了XSLT模板,以便为XML提供预定义的位置以在文档中输出。

XSL模板的基本结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     <?XML文件 ="1.0"?>
    <!- 档案 标签 保持 每一个 文件 我们 工作 , 它的 案件 XTENTO ->
    <档案>
        <!- 文件 标签 对于 个人 文件 ->
        <!- 能够 控制 名称 文件 输出 这里 看过 文件名 属性 ->
    <文件 文件名=“%lastorderincrementid%.so”>
    <!- xsl:样式表 哪里 实际 xsl 开始 重要 包括 XML文件ns 的PHP 对于 XTENTO ->
    <xsl:样式表 ="1.0" XML文件ns:xsl="http://www.w3.org/1999/XSL/Transform" XML文件ns:的PHP="http://php.net/xsl">
        <!- 输出 方法 文本 告诉 xsl 什么 输出   ->
        <xsl:输出 方法=“文本”/>
        <!- 常数 宣告 如果 计划 使用 他们 对于 更多 事情 I 通常 创建 对于 分隔符 ->
        <xsl:变量 名称=“ sepstart” 选择=“”'“ />
        <xsl:variable 名称 申博娱乐 分离” 选择 申博娱乐','“ />
        <!-如果我的csv将有一个,我也会为空值创建一个->
        <xsl:variable 名称 申博娱乐 emptyval” 选择 申博娱乐'~'/>
        <!-xsl 模板 比赛这告诉它要匹配哪个字符->
        <xsl:template 比赛="/">
            <!- 模板 这里 ->
            <!- 这个 哪里 我们 在做 工作 这个 博客 ->        
        </xsl:模板>
    </xsl:样式表>
    </文件>
    </档案>

我们可以定义常量变量,它们可以像我一样保留字段分隔符,或者您想要保持常量的任何值,然后可以在整个XSLT模板中引用它们。

1
2
3
     <xsl:变量 名称=“ sepstart” 选择=“”'“ />
    <xsl:variable 名称 申博娱乐 分离” 选择 申博娱乐','“ />
    <xsl:variable 名称 申博娱乐 emptyval” 选择 申博娱乐'~'” />

使用简单字段

我计划使用该系统检查三种有用的情况,一个简单的示例,一个使用PHP本机功能的示例,以及一个更复杂的解决方案,该解决方案使用自定义的静态方法将数据与admin字段进行比较。这种多层的复杂性使您可以根据需要更改数据以实际上满足任何要求。

就我们的简单示例而言,我们将看一下需要一个简单的CSV输出的情况,该输出包括:订购的每件商品的sku,订购的数量和价格。

使用XTENTO,我们已经有了一些基本结构,使我们能够遍历订单项,并访问其中包含的数据。

1
2
3
4
         <!- 循环 ->
    <xsl:对于- 选择=“订单/订单”>
        <!- 循环 过度 订单 这里 ->
    </xsl:对于->

简单字段– 例 1

首先,让我们看一下如何从xml节点提取基本字段数据。

1
     <xsl:-选择="ku"/>

这将返回以下内容:

1
     150-ku-01,

这不是很多代码,并且以这种形式也相当可读。您将获得所选节点的值(在这种情况下,“SKU”).

因此,使用我们研究过的循环将一些数据放在一起,以及如何从节点中提取数据将类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
     <xsl:对于- 选择=“订单/订单”>
        <!- 订购 ID ->
        <xsl:-选择="增量编号"/>
        <xsl:-选择=“ $ 分离” />
        <xsl:文本>
</xsl:文本> <!- 这个 插入 a 线 打破 ->
        
        <xsl:对于- 选择=“项目/项目”>
            <!- 循环 过度 订购 项目 ->
 
            <!- ku ->
            <xsl:-选择="ku"/>
            <xsl:-选择=“ $ 分离” />
 
            <!- 数量 下令 ->
            <xsl:-选择=“ 数量_ordered”/>
            <xsl:-选择=“ $ 分离” />
 
            <!- 价钱 ->
            <xsl:-选择="价钱"/>
            <xsl:-选择=“ $ 分离” />
            <xsl:文本>
</xsl:文本>
    
        </xsl:对于->
    </xsl:对于->

将输出以下内容:

1
2
3
     100000034, <!- 订购 ID ->
    150-ku-01,1.0000,699.0000, <!- ku, 数量 下令, 价钱 ->
    150-ku-02,1.0000,555.0000, <!- ku, 数量 下令, 价钱 ->

在XSLT中只有一个简短的模板,订单已经从一个长的XML文档更改为一小段CSV数据,并且具有所需的详细信息。

PHP函数– 例 2

现在来看一个更复杂的示例,在这里我们可以调用一些PHP本机功能。可以直接从XSL模板使用任何PHP函数。在这种情况下,我想包括产品的标题或名称,但它们包含逗号,因此这是一个问题,因为它会破坏CSV结构。有两种方法可以解决此问题,一种是将整个文档作为一个整体来解决,然后是更集中的方法。

首先,让我们来看一下自己调用PHP函数的方法:

1
<xsl:-选择=“ 的PHP:functionString('preg_replace','/ [,] /',``,name)”/>

这使我们可以调用PHP函数“ 预浸料_replace”,传入正则表达式以去除逗号,然后替换它们。我们将要传递的字段ID作为参数传递给它,就像在常规使用PHP的函数中使用函数一样。

因此,如果我们将其插入XSL模板,则上面看起来已经像这样:

1
2
3
4
5
6
7
8
9
10
...
<xsl:对于- 选择=“项目/项目”>
        <!- 循环 过度 订购 项目 ->
 
        <!- 名称 ->
        <xsl:-选择=“ 的PHP:functionString('preg_replace','/ [,] /',``,name)”/>
        <xsl:-选择=“ $ 分离” />
 
        <!- ku ->
        ...

这将输出以下内容:

1
2
3
     100000034,
    太棒了,150-ku-01,1.0000,699.0000,
    ,150-ku-02,1.0000,555.0000,

如您所见,我们现在有了这两个非常重要的产品的名称,“ 猫 太棒了”和“ 猫 凉”,这是Cute 猫 Inc.的骨干。

进阶功能– 例 3

假设在我们的示例中,我们的客户Cute 猫 Inc.想向批发客户提供免费送货,批发客户具有特定的Wholesale_id,可以在管理员中设置(一旦内置在另一个模块中)。这些人毕竟是在卖自己最重要的产品,所以让我们特别照顾他们。为了做到这一点,我们将需要创建一个静态方法来执行任务。

首先,我们必须遵循Magento最佳实践在模块中创建XSL.php帮助器,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
     / **
    *
    *应用程序/代码/本地/CLS/OrderExport/Helper/Xsl.php
    */
     CLS_OrderExport_Helper_Xsl 延伸 Xtento_OrderExport_Helper_Xsl
    {
        const XML_FREE_SHIPPING_WHOLESALE_ID = '路径/到/管理员/配置/字段';
        
        / **
        *如果根据管理员中的批发编号提供免费送货,请返回
        * @param $orderId
        *
        * @return 在t
        */
        
        静态的 功能 getIsFreeShippingAvailable($订购Id)
        {
            $自由ShippingWholesaleId =        
                 法师::getStoreConfig(::XML_FREE_SHIPPING_WHOLESALE_ID);
            / ** @var  $ 订购 法师_Sales_Model_Order * /
                $订购 = 法师::getModel('销售订单')->加载($订购Id);
                $顾客 =  
                 法师::getModel(“客户/客户”)->加载($订购->getCustomerId());
 
                如果 ($顾客->getWholesaleId() == $自由ShippingWholesaleId) {
                返回 1;
            }
 
                返回 0;
        }  
        
    }

然后,我们需要调用该函数,并从命令中将entity_id传递给方法,以便它可以完成逻辑工作。

1
2
3
4
5
6
7
8
9
10
...
    <!- 自由 运输 1 对于 , 0 对于 没有 ->
    <xsl:-选择=“ 的PHP:functionString('CLS_OrderExport_Helper_Xsl :: getIsFreeShippingAvailable',entity_id)”/>
    <xsl:-选择=“ $ 分离” />
    
    <xsl:文本>
</xsl:文本>
    
    <xsl:对于- 选择=“项目/项目”>
...

完成此操作后,我们现在可以使用自定义功能,为我们提供以下输出:

1
2
3
     100000034,1
    太棒了,150-ku-01,1.0000,699.0000,
    ,150-ku-02,1.0000,555.0000,

这完全符合我们的客户对ERP集成的期望。我们不仅完成了任务,而且不必手动编辑任何XML或在PHP中编写多个简短方法。

概要

如您所见,使用XTENTO模块可以使您以很高的速度着手运行,您可以将其与几行XSLT一起使用,以开箱即用的方式将文本格式设置为所需的任何格式,并进行一些额外的工程设计您可以执行复杂的逻辑以使输出模仿您需要说的内容。在下面,我们有完整的XSLT模板,我们已将全部编译成一个条目。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?XML文件 ="1.0"?>
    <!- 档案 标签 保持 每一个 文件 我们 工作 , 它的 案件 XTENTO ->
    <档案>
        <!- 文件 标签 对于 个人 文件 ->
        <!- 能够 控制 名称 文件 输出 这里 看过 文件名 属性 ->
    <文件 文件名=“%lastorderincrementid%.so”>
    <!- xsl:样式表 哪里 实际 xsl 开始 重要 包括 XML文件ns 的PHP 对于 XTENTO ->
    <xsl:样式表 ="1.0" XML文件ns:xsl="http://www.w3.org/1999/XSL/Transform" XML文件ns:的PHP="http://php.net/xsl">
        <!- 输出 方法 文本 告诉 xsl 什么 输出 I 决不 用过的 任何东西 其他 文本 ->
        <xsl:输出 方法=“文本”/>
        <!- 常数 宣告 如果 计划 使用 他们 对于 更多 事情 I 通常 创建 对于 分隔符 ->
        <xsl:变量 名称=“ sepstart” 选择=“”'“ />
        <xsl:variable 名称 申博娱乐 分离” 选择 申博娱乐','“ />
        <!-如果我的csv将有一个,我也会为空值创建一个->
        <xsl:variable 名称 申博娱乐 emptyval” 选择 申博娱乐'~'“ />
        <!-xsl 模板 比赛这告诉它要匹配哪个字符->
        <xsl:template 比赛 申博娱乐 /”>
            <!-模板会在这里->
            <xsl:for-each 选择 申博娱乐 订单 / 订购”>
        
                <!-- 订购 ID ->
                <xsl:value-of 选择 申博娱乐增量编号"/>
                <xsl:value-of 选择 申博娱乐 $ 分离” />
                
                <!-免费送货1是,0否->
                <xsl:value-of 选择 申博娱乐 的PHP:functionString('CLS_OrderExport_Helper_Xsl::getIsFreeShippingAvailable',entity_id)“ />
                <xsl:value-of 选择 申博娱乐 $ 分离” />
                <xsl:text>
</xsl:text> <!-这会插入换行符->
        
                <xsl:for-each 选择 申博娱乐商品/商品”>
                    <!-循环订购商品->
                    
                    <!-- 名称 ->
                    <xsl:value-of 选择 申博娱乐 的PHP:functionString('预浸料_更换','/[,]/','',名称)"/>
                    <xsl:value-of 选择 申博娱乐$分离/>
 
                    <!-- ku ->
                    <xsl:value-of 选择 申博娱乐ku"/>
                    <xsl:value-of 选择 申博娱乐$分离/>
 
                    <!-- 数量 下令 ->
                    <xsl:value-of 选择 申博娱乐数量_下令"/>
                    <xsl:value-of 选择 申博娱乐$分离/>
 
                    <!-- 价钱 ->
                    <xsl:value-of 选择 申博娱乐价钱"/>
                    <xsl:value-of 选择 申博娱乐$分离" />
                    <xsl:文本>
</xsl:文本>
                </xsl:对于->
    
            </xsl:对于->
        </xsl:模板>
    </xsl:样式表>
    </文件>
    </档案>

XTENTO模块与Magento界面无缝链接,为您提供放置XSL模板的好地方。它还带来了一些其他功能,您可以利用这些功能来利用Magento的数据。

XTENTO导出XSL中使用的其他一些功能包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
     <!- 静态的 输出 ->
    <xsl:文本>随你 输出 这里.</xsl:文本>
    
    <!- 映射 如果/然后/其他 ->
    <xsl:选择>
        <xsl:什么时候 测试=“ 运输_method ='abc'”><xsl:文本>输出 这个 文本</xsl:文本></xsl:什么时候>
        <xsl:什么时候 测试=“ 运输_method ='xyz'”><xsl:文本>输出 某事 其他</xsl:文本></xsl:什么时候>
        <xsl:除此以外><xsl:文本>没有 火柴, 输出 这个</xsl:文本></xsl:除此以外>
    </xsl:选择>
    
    <!- 更换 所有 人物 领域 ->
    <文件 文件名=“ 文件_name.csv” 搜索=“,;” 更换=“-”>
    <!- 这个 其实 跨越 所有 领域 所以 许多 更宽的 预浸料_replace 以上 哪一个 只要 a 领域->

您可以在以下位置找到购买信息 Xtento订单导出模块 & 的ir 文献资料 也可以。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.

最近的帖子查看全部
2020年10月22日
通过 阿什莉·科利弗 商业见解, 优雅的骆马 2020年10月22日
毫无疑问,2020年是历史性的一年。火灾,全球大流行,暴动,老虎王等’只是冰山一角。如 […]