Tijdens de ontwikkeling van het nieuwe controle paneel moest er onder andere een Zend Framework class geschreven worden voor verbinding tussen ons eigen systeem en Twinfield. Hier heeft Twinfield een heel mooie API beschikbaar via SOAP. Hieronder de basis van de My_Soap_Client_Twinfield class.
Zodra de class verder af is, zal ik nog een update plaatsen.
class My_Soap_Client_Twinfield extends Zend_Soap_Client
{
protected $cache = NULL;
protected $user = "********";
protected $password = "********";
protected $organisation = "********";
protected $administration = "********";
protected $header = NULL;
protected $data = false;
private function getSession() {
$ret = false;
$params = array( 'user' => $this->user,
'password' => $this->password,
'organisation' => $this->organisation
);
$cache = Zend_Registry::get ( 'Cache' );
if( $this->data === false && ( $this->data = $cache->load( md5("Twinfield_Session_And_Url") ) ) === false ) {
$client = new Zend_Soap_Client( "https://login.twinfield.com/webservices/session.asmx?wsdl" );
$client->logon( $params );
$doc = new domDocument();
$doc->loadXML( $client->getLastResponse() );
$this->data['SessionID'] = $doc->getElementsByTagName('SessionID')->item(0)->textContent;
$cluster = $doc->getElementsByTagName('cluster')->item(0)->textContent;
$this->data['cluster'] = $cluster . '/webservices/processxml.asmx?wsdl';
$client = new Zend_Soap_Client( $cluster . '/webservices/session.asmx?wsdl' );
$header = new SoapHeader( 'http://www.twinfield.com/', 'Header', array( 'SessionID' => $this->data['SessionID'] ) );
$client->addSoapInputHeader( $header );
$client->SelectCompany( array( 'company' => $this->administration ) );
$doc = new domDocument();
$doc->loadXML( $client->getLastResponse() );
$result = $doc->getElementsByTagName('SelectCompanyResult')->item(0)->textContent;
# Alleen het resultaat bewaren als alles goed gegaan is
if( strcmp( $result, "Ok" ) ) {
$cache->save( $this->data );
$ret = true;
}
}
return $ret;
}
public function __construct( ) {
if( $this->getSession() ) {
parent::__construct( $this->data['cluster'] );
$this->header = new SoapHeader( 'http://www.twinfield.com/', 'Header', array( 'SessionID' => $this->data['SessionID'] ) );
# Add permanent session header
$this->addSoapInputHeader( $this->header, true );
} else {
throw new Exception( "Error creating Twinfield session" );
}
}