비누 또는 휴식을 사용하여 실용적인 방식으로 AFAS 이익과 의사 소통하기위한 PHP 라이브러리.
이것은 자신의 코드/다른 프로젝트에서 사용하기위한 라이브러리 코드입니다. 이것을 읽고있는 사람은 이미 그들이 달성하고자하는 것과 AFA가 무엇인지에 대한 아이디어를 가지고 있기 때문에 우리는 여기서 다루지 않을 것입니다. (http://www.afas.nl/- 그들의 현재 문서는 https://static-kb.afas.nl/datafiles/help/2_9_7/se/en/index.htm에 있습니다.
이 코드는 세 가지 원칙을 통해 형성되었습니다.
첫 번째 (및 세 번째) 원칙은 이해할 수있는 코드가 미래 방지 확장 성보다 선호되는 것을 의미하며 각 작은 것들에 대해 별도의 클래스를 생성하고 많은 보일러 플레이트 코드를 소개합니다. 그것은 잘 댓글이 달린 코드를 의미합니다. 그리고 그것은 예상치 못한 / 문서화되지 않은 행동이 없음을 의미합니다. (입력 인수 및 원격 시스템에서받은 결과의 검증은 프로그래머에게 예상치 못한 상황을 포괄하고 문서화 된 예외를 던집니다.)
즉, 두 번째 / 세 번째 원칙과 진화하는 AFA 기능과 뒤로 호환성 고려 사항은 일부 측면에서 getData () 인수를 비논리적으로 연결 시켰습니다. 그러나 코드는 여전히 다른 방법이 많지 않기 때문에 여전히 쉽게 읽을 수 있으며 '간단한'사용 사례를 쉽게 요청할 수 있습니다.
라이브러리의 버전 2는 PHP5 (5.4 이상) 및 PHP7에서 작동합니다.
REST 및 SOAP 용 클라이언트 클래스 PHP의 표준 CURL + JSON 및 SOAP + SimpleXML 확장을 사용합니다. 이것들이 당신에게 효과가 없다면, 신규 / 수정 된 클라이언트가있는 PR은 환영합니다.
UpdateConnector 클래스의 경우 PHP5.6, 7.1 및 7.2에서 자동 테스트가 수행됩니다. (현재 테스트가 필요한 클라이언트 클래스를 고려하지 않습니다. 향후 연결을위한 약간의 가벼운 테스트가있을 수 있지만 내 목록에 있지 않습니다.)
PHP5.6은 더 이상 공식적으로 지원되지 않지만,이 라이브러리는 PHP7 전용 언어 구성을 도입해야 할 실제 이유가있을 때까지 그와 호환됩니다.
이 라이브러리에는 모두 단단히 결합되지 않은 몇 가지 부분이 있습니다.
클라이언트 클래스는 AFAS 커넥터를 호출하기 위해 독립형으로 사용될 수 있습니다. AFA가 REST 또는 SOAP API에 대해 기대하는 정확한 매개 변수를 알아야합니다. 둘 다를위한 클라이언트가 있습니다. AFA의 자신의 구조에 가까운 물건을 유지하려면 나머지 클라이언트가 가장 적합한 것 같습니다. RestCurlClient를 사용하고 (아래 예제 참조) 다른 클래스를 잊어 버리십시오. 당신이 알아야 할 것은 하나의 공개 메소드 인 Callafas ()가 있습니다. Callafas ()는 호출 결과가 성공적으로 (JSON) 문자열을 반환하거나 예외를 던지는 것입니다.
연결 클래스는 SOAP 또는 REST 클라이언트 주위를 감싸고 처리하기가 쉽지 않은 일부 매개 변수를 추상화합니다. 예를 들어 사용하십시오
UpdateObject (Child Classe)를 사용하여 업데이트 커넥터에 대한 XML 또는 JSON 페이로드를 생성하고 해당 내용을 검증 할 수 있습니다. 출력은 문자열이며 원하는 방식으로 사용할 수 있습니다 (예 : 클라이언트 클래스 또는 Connection :: sendData ()를 통해 문자열 데이터를 보내거나 자신의 사용자 정의 코드와 함께 updateObjects를 사용).
또한 일부 프로그래머에게 유용 할 수있는 여분의 정적 메소드가있는 도우미 클래스가 있지만 클라이언트 / 연결을 과부하시키고 싶지는 않습니다. (또한 IsoCountryTrait / KnbasicAddress / OrgpersonContact에는 프로그래머가 이러한 클래스의 주요 기능을 사용하지 않고 EG 주소의 사용자 정의 검증에 사용할 수있는 공개 방법이 포함되어 있습니다.이 클래스는 더 이상 문서화되지 않습니다.
먼저 고객을 논의하고 연결 목적으로 연결을 위해 전화 예제를 제공합니다. 차이점에 대해 궁금하지 않는 한 이것을 건너 뛸 수 있습니다.
통화 구조를 알고 있다면 AFA 이익에 비누 / 휴식을 취하기 위해 독립형으로 사용될 수 있습니다. 클라이언트 클래스는 다음과 같습니다.
연결 및 인증 설정이 생성자로 전달됩니다. 모든 개별 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."}}}} ' 아래는 위의 나머지 예제와 동일합니다 (JSON 문자열 대신 XML 문자열을 반환하는 것을 제외하고). 이것은 PHP '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>' ] );연결은 클라이언트를 둘러싼다고 클라이언트에 따라 다르지 않은 모든 인수 유효성 검사 / 데이터 처리를 추상화합니다. 필터에 대한 자체 구문이 있습니다. Afas의 업데이트 커넥터를 감싸는 SendData ()와 다른 모든 커넥터를 감싸는 getData ()라는 두 가지 중요한 방법이 있습니다. (다른 모든 방법은 필요하지 않을 수있는 getters and setter입니다.)
위의 예와 동등한 것은 다음과 같습니다.
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 클래스
개발자를위한 힌트
나는 오픈 소스 소프트웨어를 전 세계에 기여하는 것을 좋아하고 반 결국 문서화 된 시스템을 열는 것을 좋아합니다. (2012 년 AFA의 경우에도 더 나아졌지만 더 나아졌습니다.) 이것이 유용하거나 기여한 경우 소리를냅니다. 통합 작업이 필요한 경우 저에게 연락하십시오. (나는 다른 여러 시스템에 대한 경험이 있습니다.)
이 라이브러리는 MIT 라이센스에 따라 라이센스가 부여됩니다. 자세한 내용은 License.md 파일을 참조하십시오.
Philip Vergunst & Nathan Vergunst -Kolozsvári @ 소스에 대한 모자 팁 - 적어도 올바른 데이터를 교환 한 첫 번째 버전의 PHP 코드를 생성하는 것은 쉽지 않았을 것입니다.
전자 상거래 전략 / 마케팅 / 디자인의 전문가 인 YellowHrape에 외치는 소리. 이 소프트웨어를 내 자신의 무급 시간에 제작했지만 AFA 경험이 없으면 AFA 경험이 없습니다.