我正在尝试扩展 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 。我只需要标量值。所以我取消了 carrier、delivey 和 invoice 对象的设置。
默认情况下,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/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):
假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它