PHP soyut türleriyle bir WSDL kullanarak

3 Cevap php

Ben. Ben Exchange Server kurmak için Exchange Web Hizmetleri (EWS) kullanıyorum bizim web uygulaması ve Microsoft Exchange 2007 arasında bir entegrasyon üzerinde çalışıyorum. Ancak, WSDL ile bazı sorunları çalıştırıyorum. Soyut türleri unsurları var WSDL tanımlanan çeşitli türleri vardır. Örneğin:

<xs:complexType name="RestrictionType">
  <xs:sequence>
    <xs:element ref="t:SearchExpression"/>
  </xs:sequence>
</xs:complexType>

SearchExpression bir abtract türüdür. Böyle ExistsType gibi SearchExpression uzatmak çeşitli türleri vardır:

<xs:complexType name="ExistsType"> 
  <xs:complexContent> 
    <xs:extension base="t:SearchExpressionType"> 
      ...
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:element name="Exists" type="t:ExistsType" substitutionGroup="t:SearchExpression"/>

Ben aşağıdaki XML üreten geçerli bir arama yapabilmek için beklediğiniz:

<Restriction>
  <Exists>
    ...
  </Exists>
</Restriction>

PHP'nin SoapClient sınıfını kullanarak arama yapmak çalıştığınızda Ancak, aşağıdaki hatayı alırsınız:

Istek şema doğrulaması başarısız oldu: elemanı 'http://schemas.microsoft.com/exchange/services/2006/types%3ASearchExpression' soyut ya da kendi türü soyut.

Ben RestrictionType türüne izleyin tanımını değiştirirseniz, çağrı çalışır:

<xs:element name="Exists" type="t:ExistsType"/>

PHP'nin SOAP işleme düzgün WSDL soyut türlerini ele almak mümkün değildir, ya da WSDL kendisi ile yanlış bir şey olabilir mi? Gerek arrises eğer ben ona düzenlemeler yapmak, böylece WSDL yerel olarak saklanır.

Şimdiden yardımlarınız için teşekkür ederim.

Edit:
I just wanted to clarify that I am not forming the XML myself. I am using the following code that should be creating the proper XML:

$request->Restriction->IsGreaterThan->FieldURI->FieldURI =
  'item:DateTimeReceived';
$request->Restriction->IsGreaterThan->FieldURIOrConstant
  ->Constant->Value = date('c', $last_checked_time);

3 Cevap

Ben kendi sorunun cevabını buldu. Görünüşe PHP'nin SOAP nesnesi düzgün soyut türleri olduğunda nesne yapısından ben kullanıyorum XML oluşamaz. Sorunu ile mücadele etmek için, ben WSDL düzenlenmiş ve bunları genişletmek beton türlerine referansları ile herhangi bir soyut türlerine başvurular değiştirilir. Yani yukarıdaki RestrictionType örneğin, ben şu maç için şema tanımı değişti:

<xs:complexType name="RestrictionType"> 
  <xs:choice maxOccurs ="unbounded">
    <xs:element ref="t:Exists"/>
    <xs:element ref="t:Excludes"/>
    <xs:element ref="t:IsEqualTo"/>
    <xs:element ref="t:IsNotEqualTo"/>
    <xs:element ref="t:IsGreaterThan"/>
    <xs:element ref="t:IsGreaterThanOrEqualTo"/>
    <xs:element ref="t:IsLessThan"/>
    <xs:element ref="t:IsLessThanOrEqualTo"/>
    <xs:element ref="t:Not"/>
    <xs:element ref="t:And"/>
    <xs:element ref="t:Or"/>
  </xs:choice>
</xs:complexType>

Ben bunu bir başkası yardımcı olur umarım. En azından benim yazıyı okumak için zaman aldı herkese teşekkürler.

Ben FieldURI elemanı ile ek özellikler eklemek için çalışan bir çok benzer bir sorun yaşıyorum. : PHP'nin SoapClient xml olarak yaratıyor

: onu olarak yaratmak olmalıdır zaman

Bir yan not olarak, ben sorunu çözmek için bir girişimde proxy sınıfları oluşturmak için wsdl2php kullanılır, ama yardım etmedi. Yani şimdi wsdl değişimi döner yanlış ise php SoapClient arabası ise, merak, ya ediyorum wsdl2php yanlış bir proxy sınıfları oluşturuldu eğer. Herkes bu konuda herhangi bir fikir varsa, lütfen bize bildirin.

Thanks, Jake Levitt

You can use substitutionGroup only with global elements not with types. The same with

<xs:element ref="t:SearchExpression"/>

Bir ref referans kullanmak eğer bir eleman ve bir tür gerekmez!

<xsd:complexType name="PublicationType"/>
<xsd:element name="Publication" abstract="true" type="PublicationType"/>

<xsd:element name="Book" substitutionGroup="Publication" type="BookType"/>
<xsd:element name="Magazine" substitutionGroup="Publication"  type="MagazineType"/>

Yerine ve size yaptığı gibi substitutionGroup bırakın: Bir diğer yaklaşımda sadece soyut türleri ve XMLSchema-örneği (tip xsi) kullanmaktır.

<xsd:complexType name="PublicationType" abstract="true"/>
<xsd:element name="Publication" type="PublicationType"/>

<xsd:element name="Book"type="BookType"/>
<xsd:element name="Magazine" type="MagazineType"/>

<Publication" xsi:type="MagazineType">

This may explain that a bit better as i did. http://www.xfront.com/ExtensibleContentModels.pdf