Eine PHP -Bibliothek für die Kommunikation mit AFAS -Gewinn auf praktische Weise und verwendet entweder Seife oder Ruhe.
Dies ist Bibliothekscode für die Verwendung durch Ihren eigenen Code/ein anderes Projekt. Wer dies liest, hat angeblich bereits eine Vorstellung davon, was sie erreichen wollen und was AFAS ist, damit wir das hier nicht ansprechen werden. (http://www.afas.nl/ - ihre aktuelle Dokumentation ist unter https://static-kb.afas.nl/datafiles/help/2_9_7/se/en/index.htm, dass sich die URL unendlich ändert.))
Dieser Code wurde durch drei Prinzipien gebildet:
Das erste (und dritte) Prinzip bedeutet, dass ein verständlicher Code gegenüber zukunftssicherer Erweiterbarkeit bevorzugt wird, die für jedes kleine Ding separate Klassen erstellt und eine Menge Kesselplattencode einführt. Es bedeutet gut kommentierten Code. Und es bedeutet kein unerwartetes / undokumentiertes Verhalten. (Die Validierung von Eingabeargumenten und der aus dem Remote -System erhaltenen Ergebnisse deckt Situationen ab, die für den Programmierer unerwartet sind, und wirft dokumentierte Ausnahmen aus.)
Das heißt: Das zweite / dritte Prinzip sowie die sich entwickelnde AFAS -Funktionalität sowie Rückwärtskompatibilitätsüberlegungen haben die Verbindung in einigen Aspekten unlogisch gemacht. Der Code ist jedoch noch ziemlich leicht lesbar (da es nicht viele verschiedene Methoden gibt) und "einfache" Anwendungsfälle zu fordern.
Version 2 der Bibliothek funktioniert mit PHP5 (5.4 und UP) und PHP7.
Client -Klassen für REST- und SOAP verwenden PHP -Standard -Curl + JSON- und SOAP + Simplexml -Erweiterungen; Wenn diese nicht für Sie funktionieren, sind PRs mit neuen / modifizierten Kunden willkommen.
Die automatischen Tests erfolgen für die UpdateConnector -Klassen auf Php5.6, 7.1 und 7.2. (Ich betrachte derzeit die Kundenklassen, die Tests benötigen, in Zukunft möglicherweise einige Lichttests für die Verbindung, aber es steht nicht auf meiner Liste.)
Obwohl Php5.6 nicht mehr offiziell unterstützt wird, bleibt diese Bibliothek damit kompatibel, bis es einen wirklichen Grund gibt, nur Sprachkonstrukte von PHP7 einzuführen.
Es gibt ein paar Teile dieser Bibliothek, die nicht alle fest gekoppelt sind:
Die Clientklassen können eigenständig verwendet werden, um Anrufe bei AFAS -Anschlüssen zu tätigen. Sie müssen die genauen Parameter kennen, die AFAS für ihre Ruhe- oder Seifen -API erwartet. Es gibt einen Kunden für beide. Wenn Sie die AFAS -eigene Struktur nahe halten möchten, scheint der Restkunde am besten geeignet zu sein. Verwenden Sie Restcurlient (siehe Beispiel unten) und vergessen Sie die anderen Klassen. Alles, was Sie wissen müssen, ist, dass es eine öffentliche Methode gibt, CallAfas (), die entweder eine (JSON) -Sache mit einem erfolgreichen Anrufergebnis zurückgibt oder Ausnahmen ausgelöst hat.
Die Verbindungsklasse wickelt sich um die Seife oder den REST -Client und abstrakte einige Parameter ab, die nicht so einfach zu handhaben sind. Verwenden Sie es, wenn Sie z.
UpdateObject (plus untergeordnete Klassen) kann verwendet werden, um XML- oder JSON -Payloads für Update -Anschlüsse zu erstellen und deren Inhalt zu validieren. Ihre Ausgabe sind Zeichenfolgen, die in jeder gewünschten Weise verwendet werden können (z. B. die String -Daten über eine Client -Klasse oder über Connection :: sendData () oder verwenden Sie UpdateObjects mit Ihrem eigenen benutzerdefinierten Code).
Es gibt auch eine Helferklasse mit einigen zusätzlichen statischen Methoden, die für einige Programmierer nützlich sein könnten, mit denen ich die Clients / die Verbindung nicht überladen wollte. (Außerdem enthalten Isocountrytrait / Knbasicaddress / OrgpersonContact einige öffentliche Methoden, die Programmierer für ihre eigene benutzerdefinierte Validierung von EG -Adressen verwenden könnten, ohne die Hauptfunktionalität dieser Klassen zu verwenden. Diese sind nicht weiter dokumentiert.)
Wir werden zunächst die Kunden diskutieren und Anrufe für Vergleichszwecke mit der Verbindung angeben. Sie können diese überspringen, es sei denn, Sie sind neugierig auf die Unterschiede.
Diese könnten eigenständig verwendet werden, um Seifen- / Rastanrufe zum AFAS -Gewinn zu tätigen, wenn Sie die Struktur der Anrufe kennen. Eine Kundenklasse befasst sich nur mit:
Die Verbindungs- und Authentifizierungseinstellungen werden in den Konstruktor übergeben. Nicht für jeden einzelnen AFAS -Anruf.
Sie verwenden nur eine öffentliche Methode: Callafas (). (Es gibt eine zweite öffentliche Methode: static getClientType () - Dies ist jedoch für den eigenständigen Gebrauch nicht erforderlich.) Client -Klassen machen (fast) keine Annahmen über die Remote -API -Anrufe; Die genaue (Art von) Remote -Methode und Argumente müssen an sie übergeben werden, und es wird die Ergebniskörper als Zeichenfolge zurückgegeben.
Die erforderlichen Optionen finden Sie im folgenden Konstruktor. Weitere Optionen finden Sie im Code.
use PracticalAfas Client RestCurlClient ;
$ client = new RestCurlClient ( [ ' customerId ' => 12345 , ' appToken ' => ' 64CHARS ' ] );
$ result_as_json_string = $ client -> callAfas (
' GET ' ,
' connectors/MyGetConnectorName ' ,
[ ' take ' => 1000 ,
' filterfieldids ' => ' SomeCategory,Updated ' ,
' filtervalues ' => ' CategName,2017-01-01T16:00:00 ' ,
' operatortypes ' => ' 1,4 ' ,
' orderbyfieldids ' => ' -Updated '
]
);
$ attachment = $ client -> callAfas ( ' GET ' , ' subjectconnector/123 ' );
// This is inserting a new organisation with only its name filled:
$ client ->callAfas( ' POST ' , ' connectors/KnOrganisation ' , [], ' {"KnOrganisation":{"Element":{ "Fields":{"MatchOga":0,"Nm":MyCompany Ltd."}}}} ' Das folgende ist (fast) dem obigen REST -Beispiel entspricht (außer dass es eine XML -Zeichenfolge anstelle einer JSON -Zeichenfolge zurückgibt). Beachten Sie, dass dies keine Php -Klasse "Soapclient" ist; Es ist ein Wrapper um Seifenkläger.
use PracticalAfas Client SoapAppClient ;
$ client = new SoapAppClient ( [ ' customerId ' => 12345 , ' appToken ' => ' 64CHARS ' ] );
$ result_as_xml_string = $ client -> callAfas (
' get ' ,
' GetDataWithOptions ' ,
[ ' connectorId ' => ' MyGetConnectorName ' ,
' take ' => 1000 ,
' filtersXml ' => ' <Filters><Filter><Field FieldId="SomeCategory" OperatorType="1">CategName</Field>
<Field FieldId="Updated" OperatorType="4">2017-01-01T16:00:00</Field></Filter></Filters> ' ,
' options ' => ' <options><Index><Field FieldId="Updated" OperatorType="0"/></Index>
<Outputoptions>3</Outputoptions><Outputmode>1</Outputmode><Metadata>0</Metadata></options> ' ,
]
);
$ attachment = $ client -> callAfas ( ' subject ' , ' GetAttachment ' , [ ' subjectID ' => 123 ] );
$ client ->callAfas( ' update ' , ' Execute ' , [ ' connectorType ' => ' KnOrganisation ' , ' dataXml => ' <KnOrganisation xmlns:xsi="http: //www.w3.org/2001/XMLSchema-instance"><Element><Fields Action="insert"><MatchOga>0</MatchOga><Nm>MyCompany Ltd.</Nm></Fields></Element></KnOrganisation>' ] );Die Verbindung wickelt sich um einen Client und die Zusammenfassung der gesamten Argumentvalidierung / Datenverarbeitung, die nicht clientspezifisch ist. Es hat eine eigene Syntax für Filter. Es verfügt über zwei wichtige Methoden: sendData (), der den AFAS -Update -Connector und GetData () umhüllt, das alle anderen Anschlüsse umhüllt. (Alle anderen Methoden sind Getter und Setter, die Sie möglicherweise nie brauchen.)
Das Äquivalent zum obigen Beispiel ist:
use PracticalAfas Connection ;
use PracticalAfas Client RestCurlClient ;
$ client = new RestCurlClient ( [ ' customerId ' => 12345 , ' appToken ' => ' 64CHARS ' ] );
$ connection = new Connection ( $ client );
// A (more common) example for a Get connector with simple filter, returning an
// array of rows:
$ result_as_array = $ connection -> getData ( ' MyGetConnectorName ' , [ ' SomeCategory ' => ' CategName ' ] );
// The equivalent of above:
$ result_as_string = $ connection -> getData (
' MyGetConnectorName ' ,
[ ' SomeCategory ' => ' CategName ' ,
[ ' Updated ' => ' 2017-01-01T16:00:00 ' , ' #op ' => Connection:: OP_LARGER_THAN ],
],
Connection:: GET_FILTER_AND ,
[ ' take => 1000,
' orderbyfieldids' => ' -Updated ' ,
' options ' => [ ' Outputmode ' => Connection:: GET_OUTPUTMODE_LITERAL ]
]
);
$ attachment = $ connection -> getData ( 123 , [], Connection:: DATA_TYPE_SUBJECT );
$ connection -> sendData ([ ' name ' => ' MyCompany Ltd. ' ], ' KnOrganisation ' , ' insert ' );... Wenn also die Option 'OutputMode' nicht bereitgestellt wird, gibt getData () stattdessen eine Reihe von Datenzeilen zurück (dh der XML/JSON -String wird für Sie dekodiert).
Holen Sie sich Anschlüsse
Aktualisieren Sie Steckverbinder / UpdateObject -Klassen
Hinweise für Entwickler
Ich mag es, Open-Source-Software zur Welt beizutragen, und ich eröffne gerne mit halb geplante unterdokumentierte Systeme. (Dies war bei AFAs im Jahr 2012 der Fall, aber es ist besser geworden.) Geben Sie mir einen Shout-Out, wenn dies nützlich ist oder wenn Sie einen Beitrag haben. Kontaktieren Sie mich, wenn Sie Integrationsarbeiten erledigen müssen. (Ich habe Erfahrung mit mehreren anderen Systemen.)
Diese Bibliothek ist unter der MIT -Lizenz lizenziert - Einzelheiten finden Sie in der lizenz.md -Datei.
Hut -Tipp an Philip Vergunst & Nathan Vergutzer -Kolozsvári @ Ihre Quelle - Erstellen einer ersten Version von PHP -Code, die zumindest die richtigen Daten ausgetauscht hat, darf nicht einfach gewesen sein.
Ruf an Yellowgrape, Profis in E-Commerce-Strategie / Marketing / Design. Während ich diese Software in meiner eigenen unbezahlten Zeit produzierte, hätte ich ohne sie nicht die AFAS -Erfahrung.