Библиотека PHP для общения с прибылью AFAS практическим образом, используя мыло или отдых.
Это библиотечный код для использования вашим собственным кодом/другим проектом. Тот, кто читает это, предположительно уже имеет представление о том, чего они хотят достичь и что такое AFA, поэтому мы не рассмотрим это здесь. (http://www.afas.nl/ - их текущая документация находится по адресу https://static-kb.afas.nl/datafiles/help/2_9_7/se/en/index.htm, хотя этот URL, несомненно, изменится.)
Этот код сформировался по трем принципам:
Первый (и третий) принцип означает, что понятный код предпочтится в отношении расширяемости в будущем, которая создает отдельные классы для каждой маленькой вещи и вводит множество кода котла. Это означает хорошо прокомментированный код. И это означает не неожиданное / незарегистрированное поведение. (Проверка входных аргументов и результатов, полученных от удаленной системы, охватывает ситуации, которые неожиданны для программиста, и бросает документированные исключения.)
При этом: Второй / третий принцип, плюс развивая функциональность AFAS плюс соображения обратной совместимости, в некоторых аспектах выдвинули аргументы связи :: getData (). Но код все еще довольно легко читабелен (потому что существует не так много разных методов) и легко призывать к «простым» вариантам использования.
Версия 2 библиотеки работает с PHP5 (5,4 и выше) и PHP7.
Классы клиентов для отдыха и мыла используют стандартный Curl + JSON и SOAP + Simplexml; Если они не работают для вас, PR с новыми / модифицированными клиентами приветствуются.
Автоматическое тестирование проводится на PHP5.6, 7.1 и 7.2 для классов UpdateConnect. (В настоящее время я не рассматриваю клиентские классы, нуждающиеся в тестах. В будущем могут быть некоторые легкие тесты для соединения, но этого не будет в моем списке.)
Хотя PHP5.6 больше не поддерживается, эта библиотека останется с ней, пока не появится реальная причина для введения языковых конструкций только PHP7.
Есть несколько частей этой библиотеки, которые не все тесно связаны:
Классы клиента могут использоваться автономными для звонков в разъемы AFAS. Вам нужно знать точные параметры, которые AFA ожидает от их отдыха или SOAP API; Есть клиент для обоих. Если вы хотите держать вещи вблизи собственной структуры AFAS, остальный клиент кажется наиболее подходящим. Используйте RestCurlClient (см. Пример ниже) и забудьте о других классах. Все, что вам нужно знать, это один публичный метод, callafas (), который либо возвращает строку (json) с успешным результатом вызова, либо бросает исключения.
Класс соединения оборачивается вокруг клиента SOAP или REST и абстрагирует некоторые параметры, с которыми не так легко обрабатывать. Используйте его, например,
UpdateObject (плюс детские классы) может использоваться для создания полезных нагрузок XML или JSON для обновления разъемов и проверки их содержимого. Их вывод - это строки, которые могут использоваться любым способом (например, отправьте строковые данные через класс клиента или через Connection :: SendData () или используйте обновления с вашим собственным пользовательским кодом).
Существует также помощник с некоторыми дополнительными статическими методами, которые могут быть полезны для некоторых программистов, но я не хотел перегружать клиентов / соединение. (Кроме того, isocountrytrait / knbasicaddress / orgpersonContact содержат некоторые публичные методы, которые программисты могут использовать для своей собственной пользовательской проверки EG -адресов, без использования основной функции этих классов. Они не документированы далее.)
Сначала мы обсудим клиентов и приведем примеры вызова для целей сравнения с соединением. Вы можете пропустить их, если только вам не интересуется различия.
Они могут быть использованы отдельно для того, чтобы сделать вызовы мыла / отдыха для прибыли AFAS, если вы знаете структуру вызовов. Клиентский класс имеет дело только:
Настройки соединения и аутентификации передаются в конструктор; Не каждый отдельный звонок AFA.
Вы будете использовать только один публичный метод: callafas (). (Существует второй публичный метод: static getClientType () - но это не обязательно для автономного использования.) Классы клиентов не делают (почти) никаких предположений о удаленных вызовах API; Точный (тип) удаленного метода и аргументы необходимо передать к нему, и он вернет тело результата в качестве строки.
Требуемые варианты находятся в конструкторе ниже; Смотрите код для других параметров.
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."}}}} ' Ниже (почти) эквивалентно примеру приведенного выше REST (за исключением того, что она возвращает строку XML вместо строки JSON). Обратите внимание, что это не класс PHP 'SoapClient'; Это обертка вокруг 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>' ] );Соединение оборачивается вокруг клиента и абстрагирует все валидацию аргументов / обработку данных, которые не являются конкретными клиентами. Он имеет свой собственный синтаксис для фильтров. Он имеет два важных метода: SendData (), который завершает разъем обновления AFAS, и getData (), который завершает все остальные разъемы. (Все остальные методы - это Getters и Setters, которые вам могут никогда не понадобиться.)
Эквивалентом приведенного выше примера:
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 ' );... Поэтому, если опция «outputMode» не предоставлена, getData () возвращает массив строк данных (то есть строка XML/JSON декодируется для вас).
Получите разъемы
Обновление разъемов / классов UpdateObject
Подсказки для разработчиков
Мне нравится вносить программное обеспечение с открытым исходным кодом в мир, и мне нравится открывать полузакрытые системы незарегистрированных. (Это имело место с AFAS в 2012 году, но это стало лучше.) Дайте мне выкрикнуть, если это полезно или если у вас есть вклад. Свяжитесь со мной, если вам нужна интеграционная работа. (У меня есть опыт работы с несколькими другими системами.)
Эта библиотека лицензирована по лицензии MIT - для получения подробной информации см. В файле License.md.
Совет для шляпы для Филиппа Вергунста и Натан Вергунст -Колозсвари @ Ваш источник - создание первой версии PHP -кода, которая, по крайней мере, обменивалась правильными данными, не должно быть простым.
Выкрикивать Yellowgrape, специалисты в области стратегии / маркетинга / дизайна электронной коммерции. В то время как я произвел это программное обеспечение в свое неоплачиваемое время, у меня не было бы опыта AFAS без них.