Une bibliothèque PHP pour communiquer avec les bénéfices AFAS de manière pratique, en utilisant du savon ou du repos.
Il s'agit du code de la bibliothèque, pour une utilisation par votre propre code / un autre projet. Celui qui lit ceci, soi-disant déjà une idée de ce qu'ils veulent réaliser et de ce qu'est les AFAS, donc nous n'aborderons pas cela ici. (http://www.afas.nl/ - Leur documentation actuelle se trouve à https://static-kb.afas.nl/datafiles/help/2_9_7/se/en/index.htm, bien que cette URL changera.)
Ce code s'est formé par trois principes:
Le premier (et troisième) principe signifie que le code compréhensible est préféré à une extensibilité à l'épreuve future qui crée des classes distinctes pour chaque petite chose et introduit des charges de code de plaque de chaudière. Cela signifie un code bien commenté. Et cela signifie aucun comportement inattendu / sans papiers. (La validation des arguments d'entrée et les résultats reçus du système distant, couvre les situations qui sont inattendues pour le programmeur et lance des exceptions documentées.)
Cela dit: Le deuxième / troisième principe, ainsi que la fonctionnalité AFAS en évolution ainsi que les considérations de compatibilité vers l'arrière, ont rendu la connexion :: getData () arguments illogique à certains aspects. Mais le code est toujours assez facilement lisible (car il n'y a pas beaucoup de méthodes différentes) et facile à appeler pour des cas d'utilisation «simples».
La version 2 de la bibliothèque fonctionne avec PHP5 (5.4 et plus) et PHP7.
Les classes client pour le repos et le savon utilisent les extensions standard de Curl + JSON et SOAP + simplexml; Si ceux-ci ne fonctionnent pas pour vous, les PR avec des clients nouveaux / modifiés sont les bienvenus.
Les tests automatiques sont effectués sur PHP5.6, 7.1 et 7.2 pour les classes UpdateConnector. (Je ne considère actuellement pas les classes clients qui ont besoin de tests. Il peut y avoir des tests légers pour la connexion à l'avenir, mais ce n'est pas sur ma liste.)
Bien que PHP5.6 ne soit plus officiellement pris en charge, cette bibliothèque restera compatible avec elle jusqu'à ce qu'il y ait une réelle raison d'introduire des constructions de langage uniquement PHP7.
Il y a quelques parties de cette bibliothèque qui ne sont pas toutes étroitement couplées:
Les classes client peuvent être utilisées autonomes pour passer des appels aux connecteurs AFAS. Vous aurez besoin de connaître les paramètres exacts que l'AFAS attend pour leur API de repos ou de savon; Il y a un client pour les deux. Si vous voulez garder les choses proches de la propre structure d'AFAS, le client reste semble le plus approprié. Utilisez RestCurlClient (voir l'exemple ci-dessous) et oubliez les autres classes. Tout ce que vous devez savoir est qu'il existe une méthode publique, callafas (), qui renvoie une chaîne (JSON) avec un résultat d'appel réussi, soit lance des exceptions.
La classe de connexion s'enroule autour du client SOAP ou REST et résume certains paramètres qui ne sont pas si faciles à manipuler. Utilisez-le si vous n'expliquez pas
UpdateObject (plus les classes enfants) peut être utilisée pour créer des charges utiles XML ou JSON pour les connecteurs de mise à jour et valider leur contenu. Leur sortie est des chaînes, qui peuvent être utilisées de toutes les manières souhaitées (par exemple, envoyez les données de chaîne via une classe client, ou via Connection :: sendData (), ou utilisez UpdateObjects avec votre propre code personnalisé).
Il existe également une classe d'assistance avec des méthodes supplémentaires statiques qui pourraient être utiles pour certains programmeurs, mais avec qui je ne voulais pas surcharger les clients / connexions. (En outre, IsoCounryTrait / KnbasicAddress / OrgPersonContact contiennent certaines méthodes publiques que les programmeurs pourraient utiliser pour leur propre validation personnalisée des adresses EG, sans utiliser les principales fonctionnalités de ces classes. Celles-ci ne sont pas encore documentées.)
Nous allons d'abord discuter des clients et donner des exemples d'appels à des fins de comparaison avec la connexion. Vous pouvez les sauter, sauf si vous êtes curieux de savoir les différences.
Ceux-ci pourraient être utilisés autonomes pour effectuer des appels de savon / repos au profit de l'AFAS, si vous connaissez la structure des appels. Une classe client ne traite que:
Les paramètres de connexion et d'authentification sont transmis dans le constructeur; Pas à chaque appel AFAS individuel.
Vous n'utiliserez qu'une seule méthode publique: callafas (). (Il existe une deuxième méthode publique: static getClientType () - mais ce n'est pas nécessaire pour une utilisation autonome.) Les classes client ne font (presque) aucune hypothèse sur les appels API distants; La méthode et les arguments à distance exacts (type de) doivent y être transmis, et il renverra le corps de résultat en tant que chaîne.
Les options requises sont dans le constructeur ci-dessous; Voir le code pour d'autres options.
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."}}}} ' Ce qui est ci-dessous est (presque) équivalent à l'exemple de repos ci-dessus (sauf qu'il renvoie une chaîne XML au lieu d'une chaîne JSON). Notez qu'il ne s'agit pas d'une classe PHP «SoapClient»; C'est un wrapper autour de Soapclient.
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>' ] );La connexion s'enroule autour d'un client et résume toute validation / traitement des données d'argument qui n'est pas spécifique au client. Il a sa propre syntaxe pour les filtres. Il a deux méthodes importantes: SendData () qui enveloppe le connecteur de mise à jour d'AFAS, et GetData () qui enveloppe tous les autres connecteurs. (Toutes les autres méthodes sont des getters et des setters dont vous pourriez jamais avoir besoin.)
L'équivalent de l'exemple ci-dessus est:
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 ' );... Donc, si l'option 'OutputMode' n'est pas fournie, GetData () renvoie un tableau de lignes de données à la place (c'est-à-dire que la chaîne XML / JSON est décodée pour vous).
Obtenir des connecteurs
Mettre à jour les connecteurs / classes UpdateObject
Conseils pour les développeurs
J'aime contribuer des logiciels open source au monde et j'aime ouvrir des systèmes sous-classés sous-clôturés. (Ce qui a été le cas avec les AFAS en 2012, mais cela s'est amélioré.) Donnez-moi un cri si cela est utile ou si vous avez une contribution. Contactez-moi si vous avez besoin d'un travail d'intégration. (J'ai de l'expérience avec plusieurs autres systèmes.)
Cette bibliothèque est autorisée en vertu de la licence MIT - voir le fichier licence.md pour plus de détails.
Astuce du chapeau à Philip Vergunst et Nathan Vergunst-Kolozsvári @ votre source - Produire une première version de PHP Code qui a au moins échangé les données correctes, n'a pas dû être facile.
Shout-out à Yellowgrapes, professionnels de la stratégie / marketing / conception du commerce électronique. Bien que je produise ce logiciel à mon époque non rémunérée, je n'aurais pas l'expérience AFAS sans eux.