as the title says, I can successfully create a new Product via Prestashop 1.6.1 webservice. The problem is that the new product XML has an empty stock_available section:
<stock_availables nodeType="stock_available" api="stock_availables" />
so I have no idea how to set the initial quantity for that product. If I set it manually from the back office, the stock_available section is filled.
Maybe there is something I'm missing in the XML request? Here it is:
<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<product>
<id/>
<id_manufacturer/>
<id_supplier/>
<id_category_default>52</id_category_default>
<new/>
<cache_default_attribute/>
<id_default_image/>
<id_default_combination/>
<id_tax_rules_group/>
<position_in_category/>
<type/>
<id_shop_default/>
<reference>A130</reference>
<supplier_reference/>
<location/>
<width/>
<height/>
<depth/>
<weight/>
<quantity_discount/>
<ean13/>
<upc/>
<cache_is_pack/>
<cache_has_attachments/>
<is_virtual/>
<on_sale/>
<online_only/>
<ecotax/>
<minimal_quantity/>
<price>1.30</price>
<wholesale_price/>
<unity/>
<unit_price_ratio/>
<additional_shipping_cost/>
<customizable/>
<text_fields/>
<uploadable_files/>
<active>1</active>
<redirect_type/>
<id_product_redirected/>
<available_for_order>1</available_for_order>
<available_date/>
<condition/>
<show_price>1</show_price>
<indexed>1</indexed>
<visibility/>
<advanced_stock_management/>
<date_add/>
<date_upd/>
<pack_stock_type/>
<meta_description>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</meta_description>
<meta_keywords>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</meta_keywords>
<meta_title>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</meta_title>
<link_rewrite>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</link_rewrite>
<name>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</name>
<description>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</description>
<description_short>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</description_short>
<available_now>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[product name]]></language>
</available_now>
<available_later>
<language id="1" xlink:href="http://www.mysite.it/prestashop/api/languages/1"><![CDATA[available later]]></language>
</available_later>
<associations>
<categories>
<category>
<id/>
</category>
<category>
<id>52</id>
</category>
</categories>
<images>
<image>
<id/>
</image>
</images>
<combinations>
<combination>
<id/>
</combination>
</combinations>
<product_option_values>
<product_option_value>
<id/>
</product_option_value>
</product_option_values>
<product_features>
<product_feature>
<id/>
<id_feature_value/>
</product_feature>
</product_features>
<tags>
<tag>
<id/>
</tag>
</tags>
<stock_availables>
<stock_available>
<id/>
<id_product_attribute/>
</stock_available>
</stock_availables>
<accessories>
<product>
<id/>
</product>
</accessories>
<product_bundle>
<product>
<id/>
<quantity/>
</product>
</product_bundle>
</associations>
</product>
</prestashop>
Thank you for any help!
Iuri
The problem was probably a bug with that version of Prestashop. With the latest version (1.6.1.17) it works correctly.
I have created a custom data list in Alfresco, and have populated its model with the desired data columns. However, when I view the list in Alfresco share, the order is completely off, and there are elements that I have not defined in the model.
I have searched extensively as to how to fix this, and have not been successful. From what I understand, I need to define the layout in the share-config-custom.xml, which I have attempted below (snippet of only what I added):
<config evaluator="model-type" condition="orpdl:orpList">
<forms>
<form>
<field-visibility>
<show id="orpdl:programName" />
</field-visibility>
<create-form template="../data-lists/forms/dataitem.ftl" />
<appearance>
<field id="orpdl:programName">
<control template="/org/alfresco/components/form/controls/textarea.ftl" />
</field>
</appearance>
</form>
</forms>
</config>
<config evaluator="node-type" condition="orpdl:orpList">
<forms>
<form>
<field-visibility>
<show id="orpdl:programName" />
</field-visibility>
<create-form template="../data-lists/forms/dataitem.ftl" />
<appearance>
<field id="orpdl:programName">
<control template="/org/alfresco/components/form/controls/textarea.ftl" />
</field>
</appearance>
</form>
</forms>
</config>
Content model:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Definition of new Model -->
<model name="orpdl:orpDataListModel" xmlns="http://www.alfresco.org/model/dictionary/1.0">
<!-- Optional meta-data about the model -->
<description>Information retrieved from the Opportunity Registration Process workflow form.</description>
<author>Alan George</author>
<version>1.0</version>
<!-- Imports are required to allow references to definitions in other models -->
<imports>
<!-- Import Alfresco Dictionary Definitions -->
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
<!-- Import Alfresco Content Domain Model Definitions -->
<import uri="http://www.alfresco.org/model/content/1.0" prefix="cm" />
<import uri="http://www.alfresco.org/model/system/1.0" prefix="sys" />
<import uri="http://www.alfresco.org/model/datalist/1.0" prefix="dl" />
</imports>
<!-- Introduction of new namespaces defined by this model -->
<namespaces>
<namespace uri="http://www.test.com/model/orpDataListModel/1.0" prefix="orpdl" />
</namespaces>
<constraints>
<constraint name="orpdl:contractTypeList" type="LIST">
<parameter name="allowedValues">
<list>
<value>T&M</value>
<value>FFP</value>
<value>CPFF</value>
<value>CPIF</value>
</list>
</parameter>
</constraint>
</constraints>
<types>
<type name="orpdl:orpList">
<title>Opportunity Registration Process</title>
<description>Information retrieved from the Opportunity Registration Process workflow form.</description>
<parent>dl:dataListItem</parent>
<properties>
<property name="orpdl:programName">
<title>Program Name</title>
<type>d:text</type>
<mandatory>true</mandatory>
</property>
<property name="orpdl:programDescription">
<title>Program Description</title>
<type>d:text</type>
<mandatory>true</mandatory>
</property>
<property name="orpdl:client">
<title>Client</title>
<type>d:text</type>
<mandatory>true</mandatory>
</property>
<property name="orpdl:contractType">
<title>Contract Type</title>
<type>d:text</type>
<mandatory>true</mandatory>
<constraints>
<constraint ref="orpdl:contractTypeList" />
</constraints>
</property>
<property name="orpdl:value">
<title>Value</title>
<type>d:text</type>
<mandatory>true</mandatory>
</property>
</properties>
</type>
</types>
</model>
The goal of this code is to have only the programName text box appear. But this is what I'm seeing:
What am I missing?
You are entering wrong condition in <config> tag.
Below
<config evaluator="model-type" condition="orpdl:orpDataListModel">
should replace with
<config evaluator="model-type" condition="orpdl:issuesList">
This will also apply to node-type.
I can't seem to use local xsd element in the WSDL schema, since i can't create an external xsd (project conditions).
<types>
<xsd:schema xmlns:fs_req="urn:rg:fs_req" xmlns:sf_facto="urn:rg:sf_facto">
<xsd:import namespace="urn:rg:sf_facto" schemaLocation="ROOT_sf_facto_SF_facto_V00_05.xsd" />
<xsd:import namespace="urn:rg:fs_req" schemaLocation="ROOT_fs_req_fs_req_V00_04.xsd" />
<xsd:element name="getDetailsAction1" type="fs_req:fs_req_fs_req" /
<xsd:element name="getDetailsAction1Response" type="sf_facto:SF_facto_SF_facto"/>
</xsd:schema>
</types>
Below the call of the xsd element (Not valide part!)
<message name="detailMpaResponse">
<part name="getDetail" element="tns:getDetailsAction1Response" />
</message>
<message name="detailMpaRequest">
<part name="getDetailResponse" element="tns:getDetailsAction1" />
</message>
How can i have a valide wsdl with the local xsd element?
The problem looks to be with your namespace qualifier in the <part> nodes.
EDIT:
In looking closer at your original post I think the schema element might hold the values we need. Give this code a shot:
<message name="detailMpaResponse">
<part name="getDetail" element="fs_req:getDetailsAction1Response" />
</message>
<message name="detailMpaRequest">
<part name="getDetailResponse" element="sf_facto:getDetailsAction1" />
</message>
You need to declare a new targetNamespace for the xs:schema in your wsdl:types and add it to wsdl:definitions, something like this:
<types>
<xsd:schema xmlns:types="urn:rg:types" targetNameSpace="urn:rg:types" xmlns:fs_req="urn:rg:fs_req" xmlns:sf_facto="urn:rg:sf_facto">
<xsd:import namespace="urn:rg:sf_facto" schemaLocation="ROOT_sf_facto_SF_facto_V00_05.xsd" />
<xsd:import namespace="urn:rg:fs_req" schemaLocation="ROOT_fs_req_fs_req_V00_04.xsd" />
<xsd:element name="getDetailsAction1" type="fs_req:fs_req_fs_req" />
<xsd:element name="getDetailsAction1Response" type="sf_facto:SF_facto_SF_facto"/>
</xsd:schema>
</types>
then add the new namespace to wsdl:definitions:
xmlns:types="urn:rg:types"
and then refer to it in the message parts:
<message name="detailMpaResponse">
<part name="getDetail" element="types:getDetailsAction1Response" />
</message>
<message name="detailMpaRequest">
<part name="getDetailResponse" element="types:getDetailsAction1" />
</message>
The new namespace can't match the ones you import.
Just did a quick experiment (using Eclipse WSDL editor), and the following code was generated when I selected "using a type" from an external XSD (in the same directory as the WSDL file):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.example.org/NewWSDLFile/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="NewWSDLFile"
targetNamespace="http://www.example.org/NewWSDLFile/" xmlns:xsd1="http://www.example.org/NewXMLSchema">
<wsdl:types>
(...)
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.example.org/NewXMLSchema"
schemaLocation="NewXMLSchema.xsd">
</xsd:import>
</xsd:schema>
</wsdl:types>
<wsdl:message name="NewOperationRequest">
<wsdl:part name="parameters" type="xsd1:externalSchemaParamType" />
</wsdl:message>
(...)
In your case: is "tns" the name space of the externa XSD?
I am trying to unmarshal an XML that I marshalled before.
In the unmarshalled result, I am missing elements and the elements I get are not in the same order as the input XML. I've created a afterUnmarshal() listener and I see the elements there, but not in the resulting Java Object.
The XSD is structured like this (a 'fanout'-node, for example, can contain another set of processSteps, so it can be deeply nested (tree)):
<xsd:element name="process">
<xsd:annotation>
<xsd:documentation>Integration Process</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<!-- more -->
<xsd:element name="itinerary" type="lwis:itineraryType"/>
<!-- more -->
</xsd:complexType>
</xsd:element>
<xsd:complexType name="itineraryType">
<xsd:sequence>
<xsd:element name="step" type="lwis:stepType"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="step" type="lwis:stepType"/>
<xsd:element name="fanout" type="lwis:fanoutType"/>
<xsd:element name="decision">
<xsd:complexType>
<!-- snip.. -->
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
I suppose the order is given by the SAX parser, but I can't imagine a SAX parser would change the order for no reason? At the moment, the first element in the list is the last one in the XML. The second element in the list is the third in the XML - it seems random..
Thanks for any help!
Sample Input:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<process name="My.Process" description="My Process description" qualityOfService="AT_LEAST_ONCE" entryEndpoint="ENTRY.EP" xmlns="http://www.xxxxx.com/ns/yyyy">
<faultEndpoint endpoint_ref="EXIT.EP"/>
<rejectEndpoint endpoint_ref="EXIT.EP"/>
<itinerary>
<step name="Step 1" endpoint_ref="Step1.EP" type="SERVICE"/>
<step name="Step2-CBRStep" endpoint_ref="Step2.EP" type="SERVICE"/>
<decision name="Decision-nonameneeded">
<option name="op1">
<step name="Step 2A" endpoint_ref="Step2a.EP" type="SERVICE"/>
</option>
<option name="op2">
<step name="Step 2B" endpoint_ref="Step2a.EP" type="SERVICE"/>
</option>
</decision>
<step name="Step 3" endpoint_ref="Step3.EP" type="SERVICE"/>
<fanout name="Fan1">
<path>
<step name="Step4A" endpoint_ref="Step4A.EP" type="SERVICE"/>
</path>
<path>
<step name="Step4B" endpoint_ref="Step4B.EP" type="SERVICE"/>
<step name="Step5" endpoint_ref="Step5.EP" type="SERVICE"/>
</path>
</fanout>
<step name="Step6" endpoint_ref="Step6.EP" type="SERVICE"/>
</itinerary>
</process>
Object:
Process Object has a field with itinerary of Type ItineraryType which:
step = StepType ("Step6" from XML)
stepOrFanoutOrDecision = ArrayList:
item 0: ItineraryType$Decision ("Decision-nonameneeded" from XML)
option 0: "op1" from XML
step: "Step 2A" from XML
option 1: "op2" from XML
step: "Step 2B" from XML
item 1: FanoutType ("Fan1" from XML)
path 0:
step: Step4A
path 1:
step: Step5
Step 1, Step2-CBRStep and Step 4B is missing?
I have the toString() output of the itinerary here:
com.x.ItineraryType#fe39ebf[step=com.x.StepType#28cb15bf[endpointRef=Step6.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step6, description=<null>], stepOrFanoutOrDecision={com.x.ItineraryType$Decision#2d00c385[option={com.x.ItineraryType$Decision$Option#d2467d8[step=com.x.StepType#511d9ca5[endpointRef=Step2a.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step 2A, description=<null>], stepOrFanoutOrDecision=<null>, name=op1],com.x.ItineraryType$Decision$Option#6f173e3d[step=com.x.StepType#5ef74fc5[endpointRef=Step2a.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step 2B, description=<null>], stepOrFanoutOrDecision=<null>, name=op2]}, name=Decision-nonameneeded, description=<null>],com.x.FanoutType#3e963f38[path={com.x.FanoutType$Path#7a1095a1[step=com.x.StepType#56cfbba2[endpointRef=Step4A.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step4A, description=<null>], stepOrFanoutOrDecision=<null>, name=<null>],com.x.FanoutType$Path#6027b534[step=com.x.StepType#4ee99a3d[endpointRef=Step5.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step5, description=<null>], stepOrFanoutOrDecision=<null>, name=<null>]}, name=Fan1, description=<null>]}]
Ant Script I'm using: with extensions hashCode, toString and equals:
<?xml version="1.0" encoding="UTF-8"?>
<project name="RunningXjc" default="generate-sources" basedir=".">
<description>Runs Xjc Binding Compiler</description>
<target name="generate-sources">
<taskdef name="xjc" classname="org.jvnet.jaxb2_commons.xjc.XJC2Task">
<classpath>
<fileset dir="buildLib/jaxb-ri-2.2.6/lib">
<include name="*" />
</fileset>
<fileset dir="buildLib/jaxb2-basics-dist-0.6.4/dist">
<include name="jaxb2-basics-ant-*.jar" />
</fileset>
</classpath>
</taskdef>
<!-- Generate the Java code for XSD -->
<xjc destdir="${basedir}/target/generated-sources/xjc" extension="true">
<arg
line="
-Xequals
-XhashCode
-XtoString
-Xcopyable
-Xmergeable" />
<binding dir="${basedir}/src">
<include name="**/*.xjb" />
</binding>
<schema dir="${basedir}/schema">
<include name="processSlim.xsd" />
</schema>
<!-- Plugins -->
<classpath>
<fileset dir="${basedir}/buildLib/jaxb2-basics-dist-0.6.4">
<!-- JAXB2 Basics library -->
<include name="dist/jaxb2-basics-*.jar" />
<!-- JAXB2 Basics library dependencies -->
<include name="dist/jaxb2-basics-runtime-*.jar" />
<include name="dist/jaxb2-basics-tools-*.jar" />
<include name="lib/commons-beanutils-*.jar" />
<include name="lib/commons-lang-*.jar" />
<include name="lib/commons-logging-*.jar" />
<include name="lib/javaparser-*.jar" />
<include name="lib/annox-*.jar" />
</fileset>
</classpath>
</xjc>
</target>
</project>
PROBLEM
From Your XML Schema
Below is a fragment from your XML schema. The itineraryType contains a sequence where a step element can occur both inside and outside of the choice structure.
<xsd:complexType name="itineraryType">
<xsd:sequence>
<xsd:element name="step" type="lwis:stepType" />
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="step" type="lwis:stepType" />
<xsd:element name="fanout" type="lwis:fanoutType" />
<xsd:element name="decision">
<xsd:complexType>
<!-- snip.. -->
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
ItineraryType
This is causing the step element to be mapped to two different properties which is causing your problem.
public class ItineraryType {
#XmlElement(required = true)
protected StepType step;
#XmlElements({
#XmlElement(name = "step", type = StepType.class),
#XmlElement(name = "fanout", type = FanoutType.class),
#XmlElement(name = "decision", type = ItineraryType.Decision.class)
})
protected List<Object> stepOrFanoutOrDecision;
...
}
SOLUTION
You can use the simple binding mode extension in the JAXB XJC tool to support this use case. It will automatically prevent the step property from being created. You can specify this via an external binding document like the following:
bindings.xml
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc"
version="2.1">
<jxb:globalBindings>
<xjc:simple />
</jxb:globalBindings>
</jxb:bindings>
XJC Call
Below is how the external bindings file is referenced in an XJC call. You will need to also use the -extension flag to enable the XJC extension to be used.
xjc -extension -b bindings.xml schema.xsd
I would like to allow some of my SOAP header elements to be nillable. This is possible for body elements, but I am not sure if it is allowed from header elements.
In the sample message below, I would like to allow the MessageDateTime to be null.
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://mycompany.com/repositoryservice">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace="http://mycompany.com/repositoryservice">
<element name="MessageDateTime" type="dateTime" />
<element name="SaveRequest">
<!-- complexType -->
</element>
</schema>
</types>
<message name="SaveRequest_Headers">
<part name="MessageDateTime" element="tns:MessageDateTime" />
</message>
<message name="SaveRequest">
<part name="parameters" element="tns:SaveRequest" />
</message>
<binding name="RepositoryServiceBinding" type="tns:IRepositoryService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="Save">
<soap:operation soapAction="http://mycompany.com/repositoryservice/Save" style="document" />
<input name="SaveRequest">
<soap:header message="tns:SaveRequest_Headers" part="MessageDateTime" use="literal" />
<soap:body use="literal" />
</input>
</operation>
</binding>
<!-- service, portType -->
</definitions>
It is allowed as long as the definition allows for it. In your case, all you have to do is add the nillable="true" to the element's definition. The result on .NET w/ WCF would look something like this:
[System.ServiceModel.MessageHeaderAttribute(Namespace="...")]
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public System.Nullable<System.DateTime> MessageDateTime;