php - 扩展 prestashop webservice 资源

标签 php web-services api prestashop

我正在尝试扩展 carts多一个字段的资源应该输出 Cart::getSummaryDetails 的结果称呼。我延长了 CartCore类添加新的参数和相应的方法是这样的:

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;
    }
}

预期的输出应该是这样的:

<?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 解析错误。

我尝试添加的另一种方式 cart_summary是创造CartSummary需要的对象 $webserviceParameters领域。但是我不知道如何从这个字段中获取值以及如何关联这个 cart_summary对象 carts资源。

最佳答案

好吧,调试是 Elixir 。事实证明,扩展 carts 资源比我想象的要容易一些。 首先,不需要制作任何额外的资源。我们唯一需要做的就是列出我们需要的字段并为它们设置 getter。我的扩展 Cart 类:

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 不适合处理对象,它需要制作更复杂的字段列表和 getter 。我只需要标量值。所以我取消了 carrierdeliveyinvoice 对象的设置。 默认情况下,Prestashop 为字段 cart_summary 搜索 getter getWsCartSummary()。如果您有 any_other 字段,它将是 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>

关于php - 扩展 prestashop webservice 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37996663/

相关文章:

php - 关闭控制台后重置所有登录用户

php - 如何使用时间戳功能查看谁在线?

php - Facebook 应用程序的结果在本地和 Heroku 上有所不同

java - 我如何知道哪个其余客户端消耗 xml 或 json 数据

wordpress - wp_remote_post 响应体被保护

php - 删除非空目录

ios - 是否有一种标准方法可以为 iOS 客户端提供契约优先的 Web 服务端点?

java - 从普通 POJO 自动创建 Java Web 服务

javascript - REACT 从嵌套 JSON 中获取属性

php - 如何在 PHP 中实现这个歌词 API?