Una biblioteca de PHP para comunicarse con las ganancias de AFA de manera práctica, usando jabón o descanso.
Este es código de biblioteca, para usar su propio código/otro proyecto. Quien esté leyendo esto, supuestamente ya tiene una idea de lo que quieren lograr y lo que es AFAS, por lo que no abordaremos eso aquí. (http://www.afas.nl/ - Su documentación actual está en https://static-kb.afas.nl/datafiles/help/2_9_7/se/en/index.htm aunque esa url indudablemente cambiará)).
Este código se formó a través de tres principios:
El primer (y tercero) principio significa que el código comprensible se prefiere sobre la extensibilidad a prueba de futuro que crea clases separadas para cada pequeña cosa e introduce cargas de código de placa de caldera. Significa código bien comentado. Y significa que no hay comportamiento inesperado / indocumentado. (La validación de los argumentos de entrada, y de los resultados recibidos del sistema remoto, cubre situaciones que son inesperadas para el programador y arroja excepciones documentadas).
Dicho esto: el segundo / tercer principio, más la funcionalidad AFAS en evolución más las consideraciones de compatibilidad hacia atrás, han hecho que los argumentos de conexión :: getData () sean ilógicos en algunos aspectos. Pero el código todavía es bastante fácilmente legible (porque no hay muchos métodos diferentes) y fácil de llamar a casos de uso 'simples'.
La versión 2 de la biblioteca funciona con PHP5 (5.4 y arriba) y PHP7.
Las clases de clientes para REST y SOAP utilizan las extensiones estándar de PHP Curl + JSON y SOAP + SimplexML; Si estos no funcionan para usted, los PR con clientes nuevos / modificados son bienvenidos.
Las pruebas automáticas se realizan en PHP5.6, 7.1 y 7.2 para las clases de UpdateConnector. (Actualmente no considero las clases de clientes que necesitan pruebas. Puede haber algunas pruebas de luz para la conexión en el futuro, pero no está en mi lista).
Aunque Php5.6 ya no es compatible oficialmente, esta biblioteca permanecerá compatible con ella hasta que haya una razón real para introducir construcciones de lenguaje solo por PHP7.
Hay algunas partes de esta biblioteca que no están muy acopladas:
Las clases de clientes se pueden usar independientemente para hacer llamadas a los conectores AFAS. Necesitará saber los parámetros exactos que AFAS espera para su reposo o API de jabón; Hay un cliente para ambos. Si desea mantener las cosas cerca de la propia estructura de AFAS, el cliente REST parece más adecuado. Use RestCurlClient (consulte el ejemplo a continuación) y olvídate de las otras clases. Todo lo que necesita saber es que hay un método público, Callafas (), que devuelve una cadena (JSON) con un resultado de llamadas exitoso o arroja excepciones.
La clase de conexión envuelve el cliente SOAP o REST y abstrae algunos parámetros que no son tan fáciles de manejar. Úselo si es así
UpdateObject (más clases para niños) se puede usar para crear cargas útiles XML o JSON para conectores de actualización y validar sus contenidos. Su salida es cadenas, que se pueden usar de cualquier manera que desee (por ejemplo, envíe los datos de cadena a través de una clase de cliente, o a través de Connection :: sendData (), o use UpdateObjects con su propio código personalizado).
También hay una clase de ayuda con algunos métodos estáticos adicionales que podrían ser útiles para algunos programadores, pero con los que no quería sobrecargar los clientes / conexión. (Además, ISoCountryTrait / Knbasicaddress / OrgpersonContact contiene algunos métodos públicos que los programadores podrían usar para su propia validación personalizada de las direcciones EG, sin usar la funcionalidad principal de estas clases. Estos no están documentados más a fondo).
Primero discutiremos a los clientes y daremos ejemplos de llamadas para fines de comparación con la conexión. Puedes omitirlos, a menos que tengas curiosidad por las diferencias.
Estos podrían usarse independientemente para hacer llamadas de jabón / descanso a las ganancias de AFA, si conoce la estructura de las llamadas. Una clase de cliente solo trata de:
La configuración de conexión y autenticación se transmite al constructor; No para todas las llamadas individuales de AFA.
Solo usará un método público: Callafas (). (Hay un segundo método público: static getClientType (), pero esto no es necesario para el uso independiente). Las clases de clientes no hacen (casi) no hay suposiciones sobre las llamadas de API remotas; El método y los argumentos remotos exactos y los argumentos deben transmitirse a él, y le devolverá el cuerpo de resultados como una cadena.
Las opciones requeridas se encuentran en el constructor a continuación; Vea el código para otras opciones.
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."}}}} ' El siguiente es (casi) equivalente al ejemplo de descanso anterior (excepto que devuelve una cadena XML en lugar de una cadena JSON). Tenga en cuenta que esta no es una clase PHP 'SoapClient'; Es un envoltorio alrededor 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 conexión envuelve un cliente y resume toda la validación de argumentos / procesamiento de datos que no es específico del cliente. Tiene su propia sintaxis para filtros. Tiene dos métodos importantes: sendData () que envuelve el conector de actualización de AFAS, y getData () que envuelve todos los demás conectores. (Todos los demás métodos son Getters y Setters que quizás nunca necesite).
El equivalente al ejemplo anterior es:
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 ' );... Entonces, si no se proporciona la opción 'OutputMode', getData () devuelve una matriz de filas de datos (es decir, la cadena XML/JSON se decodifica para usted).
Obtener conectores
Actualizar las clases de conectores / updateObject
Sugerencias para desarrolladores
Me gusta contribuir con el software de código abierto al mundo y me gusta abrir sistemas subdocumentados semicerrados. (Lo cual fue el caso con AFA en 2012, pero ha mejorado). Dame un agradecimiento si esto es útil o si tienes una contribución. Contácteme si necesita trabajo de integración. (Tengo experiencia con varios otros sistemas).
Esta biblioteca tiene licencia bajo la licencia MIT: consulte el archivo License.md para más detalles.
Consejo de sombrero a Philip Vergunst y Nathan Vergunst -Kolozsvári @ su fuente: produciendo una primera versión del código PHP que al menos intercambiaron los datos correctos, no debe haber sido fácil.
Disfruten de YellowGrape, profesionales en estrategia / marketing / diseño de comercio electrónico. Si bien producí este software en mi propio tiempo no remunerado, no tendría la experiencia AFAS sin ellos.