扩展prestashop Web服务资源 [英] Extend prestashop webservice resource

查看:65
本文介绍了扩展prestashop Web服务资源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用另外一个字段扩展carts资源,该字段应输出Cart::getSummaryDetails调用的结果.我扩展了CartCore类,以添加新参数和类似的方法,如下所示:

I'm trying to extend carts resource with one more field which should output result of Cart::getSummaryDetails call. I've extended CartCore class to add new parameter and corresponding method like this:

class Cart extends CartCore
{
    protected $webserviceParameters = [
        'fields'       => [
            'id_address_delivery' => ['xlink_resource' => 'addresses'],
            'id_address_invoice'  => ['xlink_resource' => 'addresses'],
            'id_currency'         => ['xlink_resource' => 'currencies'],
            'id_customer'         => ['xlink_resource' => 'customers'],
            'id_guest'            => ['xlink_resource' => 'guests'],
            'id_lang'             => ['xlink_resource' => 'languages'],
        ],
        'associations' => [
            'cart_rows' => [
                'resource'       => 'cart_row',
                'virtual_entity' => true,
                'fields'         => [
                    'id_product'           => ['required' => true, 'xlink_resource' => 'products'],
                    'id_product_attribute' => ['required' => true, 'xlink_resource' => 'combinations'],
                    'id_address_delivery'  => ['required' => true, 'xlink_resource' => 'addresses'],
                    'quantity'             => ['required' => true],
                ],
            ],
            'summary'   => [
                'getter'         => 'getWsSummaryDetails',
                'setter'         => false,
                'virtual_entity' => true,
            ],
        ],
    ];

    public function getWsSummaryDetails()
    {
        $result = $this->getSummaryDetails(null, true);
        unset($result['carrier']);
        unset($result['delivery']);
        unset($result['invoice']);
        return $result;
    }
}

预期输出应该是这样的:

The expected output should be something like this:

<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<carts>
    <cart>
        <id>105</id>
        <id_address_delivery xlink:href="http://prestashop.lo/api/addresses/8">8</id_address_delivery>
        <id_address_invoice xlink:href="http://prestashop.lo/api/addresses/8">8</id_address_invoice>
        <id_currency xlink:href="http://prestashop.lo/api/currencies/1">1</id_currency>
        <id_customer xlink:href="http://prestashop.lo/api/customers/8">8</id_customer>
        <id_guest>0</id_guest>
        <id_lang xlink:href="http://prestashop.lo/api/languages/1">1</id_lang>
        <id_shop_group>0</id_shop_group>
        <id_shop>1</id_shop>
        <id_carrier>4</id_carrier>
        <recyclable>0</recyclable>
        <gift>0</gift>
        <gift_message/>
        <mobile_theme>0</mobile_theme>
        <delivery_option/>
        <secure_key>ced146ac54cc140e7d8da06469003688</secure_key>
        <allow_seperated_package>0</allow_seperated_package>
        <date_add>2016-06-20 11:14:31</date_add>
        <date_upd>2016-06-20 11:14:31</date_upd>
        <associations>
            <cart_rows nodeType="cart_row" virtualEntity="true">
                <cart_row>
                    <id_product xlink:href="http://prestashop.lo/api/products/8">8</id_product>
                    <id_product_attribute xlink:href="http://prestashop.lo/api/combinations/0">0</id_product_attribute>
                    <id_address_delivery xlink:href="http://prestashop.lo/api/addresses/8">8</id_address_delivery>
                    <quantity>1</quantity>
                </cart_row>
                <cart_row>
                    <id_product xlink:href="http://prestashop.lo/api/products/11">11</id_product>
                    <id_product_attribute xlink:href="http://prestashop.lo/api/combinations/0">0</id_product_attribute>
                    <id_address_delivery xlink:href="http://prestashop.lo/api/addresses/8">8</id_address_delivery>
                    <quantity>1</quantity>
                </cart_row>
            </cart_rows>
            <summary nodeType="cart_summary" api="summary">
                <products/>
                <gift_products/>
                <discounts/>
                <is_virtual_cart/>
                <total_discounts/>
                <total_discounts_tax_exc/>
                <total_wrapping/>
                <total_wrapping_tax_exc/>
                ... <!-- and so on -->
            </summary>
        </associations>
    </cart>
</carts>
</prestashop>

但是我收到<summary>[Array]</summary>或xml解析错误.

But I get <summary>[Array]</summary> or xml parse errors.

我尝试添加cart_summary的另一种方法是使用所需的$webserviceParameters字段创建CartSummary对象.但是我无法获得如何从该字段获取值以及如何将此cart_summary对象与carts资源相关联.

The another way I've tried to add cart_summary was to create CartSummary object with needed $webserviceParameters fields. But I can't get how to get values from this fields and how to associate this cart_summary object with carts resource.

推荐答案

好,调试是灵丹妙药.事实证明,扩展carts资源比我想象的要容易一些. 首先,无需增加任何额外资源.我们唯一需要的是列出我们需要的字段并设置它们的吸气剂.我扩展的Cart课:

Well, debug is a silver bullet. It turned out to be a bit easier to extend carts resource than I thought. First of all, there is no need to make any extra resource. The only thing we need is to list field we need and to set them getters. My extended Cart class:

class Cart extends CartCore
{
    protected $webserviceParameters = [
        'fields'       => [
            'id_address_delivery' => ['xlink_resource' => 'addresses'],
            'id_address_invoice'  => ['xlink_resource' => 'addresses'],
            'id_currency'         => ['xlink_resource' => 'currencies'],
            'id_customer'         => ['xlink_resource' => 'customers'],
            'id_guest'            => ['xlink_resource' => 'guests'],
            'id_lang'             => ['xlink_resource' => 'languages'],
        ],
        'associations' => [
            'cart_rows'    => [
                'resource'       => 'cart_row',
                'virtual_entity' => true,
                'fields'         => [
                    'id_product'           => ['required' => true, 'xlink_resource' => 'products'],
                    'id_product_attribute' => ['required' => true, 'xlink_resource' => 'combinations'],
                    'id_address_delivery'  => ['required' => true, 'xlink_resource' => 'addresses'],
                    'quantity'             => ['required' => true],
                ],
            ],
            'cart_summary' => [
                'resource'       => 'cart_summary_row',
                'virtual_entity' => true,
                'setter'         => false,
                'fields'         => [
                    'id'                        => '',
                    'is_virtual_cart'           => '',
                    'total_discounts'           => '',
                    'total_discounts_tax_exc'   => '',
                    'total_wrapping'            => '',
                    'total_wrapping_tax_exc'    => '',
                    'total_shipping'            => '',
                    'total_shipping_tax_exc'    => '',
                    'total_products_wt'         => '',
                    'total_products'            => '',
                    'total_price'               => '',
                    'total_tax'                 => '',
                    'total_price_without_tax'   => '',
                    'is_multi_address_delivery' => '',
                    'free_ship'                 => '',
                ],
            ],
        ],
    ];


    /**
     * @return array
     */
    public function getWsCartSummary()
    {
        $result = $this->getSummaryDetails(null, true);
        unset($result['carrier']);
        unset($result['delivery']);
        unset($result['invoice']);
        $result['id'] = $this->id;
        return ['cart_summary' => $result];
    }
}

WebserviceOutputBuilder不太适合处理对象,它需要使更复杂的字段列表和获取方法变得更加复杂.我只需要标量值.因此,我未设置carrierdeliveyinvoice对象. 默认情况下,Prestashop会搜索字段cart_summary的吸气剂getWsCartSummary().如果您有any_other字段,则为getWsAnyOther().

WebserviceOutputBuilder doesn't suit well to deal with objects and it needs to make more complicated fields list and getters. I just needed scalar values. So I've unset carrier, delivey and invoice objects. Prestashop searches for getter getWsCartSummary() for field cart_summary by default. If you had any_other field, it would be getWsAnyOther().

我得到的结果:

<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<carts>
<cart>
    <id><![CDATA[108]]></id>
    <id_address_delivery xlink:href="http://prestashop.lo/api/addresses/5"><![CDATA[5]]></id_address_delivery>
    <id_address_invoice xlink:href="http://prestashop.lo/api/addresses/5"><![CDATA[5]]></id_address_invoice>
    <id_currency xlink:href="http://prestashop.lo/api/currencies/1"><![CDATA[1]]></id_currency>
    <id_customer xlink:href="http://prestashop.lo/api/customers/2"><![CDATA[2]]></id_customer>
    <id_guest xlink:href="http://prestashop.lo/api/guests/25"><![CDATA[25]]></id_guest>
    <id_lang xlink:href="http://prestashop.lo/api/languages/1"><![CDATA[1]]></id_lang>
    <id_shop_group><![CDATA[1]]></id_shop_group>
    <id_shop><![CDATA[1]]></id_shop>
    <id_carrier><![CDATA[5]]></id_carrier>
    <recyclable><![CDATA[0]]></recyclable>
    <gift><![CDATA[0]]></gift>
    <gift_message></gift_message>
    <mobile_theme><![CDATA[0]]></mobile_theme>
    <delivery_option></delivery_option>
    <secure_key><![CDATA[18fcd352cc7355102674d9056705f43c]]></secure_key>
    <allow_seperated_package><![CDATA[0]]></allow_seperated_package>
    <date_add><![CDATA[2016-06-24 09:34:42]]></date_add>
    <date_upd><![CDATA[2016-06-27 03:23:18]]></date_upd>
<associations>
<cart_rows nodeType="cart_row" virtualEntity="true">
    <cart_row>
    <id_product xlink:href="http://prestashop.lo/api/products/5"><![CDATA[5]]></id_product>
    <id_product_attribute xlink:href="http://prestashop.lo/api/combinations/19"><![CDATA[19]]></id_product_attribute>
    <id_address_delivery xlink:href="http://prestashop.lo/api/addresses/5"><![CDATA[5]]></id_address_delivery>
    <quantity><![CDATA[1]]></quantity>
    </cart_row>
    <cart_row>
    <id_product xlink:href="http://prestashop.lo/api/products/6"><![CDATA[6]]></id_product>
    <id_product_attribute xlink:href="http://prestashop.lo/api/combinations/31"><![CDATA[31]]></id_product_attribute>
    <id_address_delivery xlink:href="http://prestashop.lo/api/addresses/5"><![CDATA[5]]></id_address_delivery>
    <quantity><![CDATA[1]]></quantity>
    </cart_row>
    <cart_row>
    <id_product xlink:href="http://prestashop.lo/api/products/11"><![CDATA[11]]></id_product>
    <id_product_attribute xlink:href="http://prestashop.lo/api/combinations/0"><![CDATA[0]]></id_product_attribute>
    <id_address_delivery xlink:href="http://prestashop.lo/api/addresses/5"><![CDATA[5]]></id_address_delivery>
    <quantity><![CDATA[1]]></quantity>
    </cart_row>
</cart_rows>
<cart_summary nodeType="cart_summary_row" virtualEntity="true">
    <cart_summary_row>
    <id><![CDATA[108]]></id>
    <is_virtual_cart></is_virtual_cart>
    <total_discounts></total_discounts>
    <total_discounts_tax_exc></total_discounts_tax_exc>
    <total_wrapping></total_wrapping>
    <total_wrapping_tax_exc></total_wrapping_tax_exc>
    <total_shipping></total_shipping>
    <total_shipping_tax_exc></total_shipping_tax_exc>
    <total_products_wt><![CDATA[67.06]]></total_products_wt>
    <total_products><![CDATA[64.48]]></total_products>
    <total_price><![CDATA[67.06]]></total_price>
    <total_tax><![CDATA[2.58]]></total_tax>
    <total_price_without_tax><![CDATA[64.48]]></total_price_without_tax>
    <is_multi_address_delivery></is_multi_address_delivery>
    <free_ship><![CDATA[1]]></free_ship>
    </cart_summary_row>
</cart_summary>
</associations>
</cart>
</carts>
</prestashop>

这篇关于扩展prestashop Web服务资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆