ห้องสมุด PHP สำหรับการสื่อสารกับกำไร AFAS ในทางปฏิบัติโดยใช้สบู่หรือพักผ่อน
นี่คือรหัสห้องสมุดสำหรับใช้ด้วยรหัสของคุณเอง/โครงการอื่น ใครก็ตามที่กำลังอ่านสิ่งนี้คาดว่าจะมีความคิดเกี่ยวกับสิ่งที่พวกเขาต้องการที่จะบรรลุและสิ่งที่ AFAS คืออะไรดังนั้นเราจะไม่กล่าวถึงที่นี่ (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
คลาสไคลเอ็นต์สำหรับการพักผ่อนและสบู่ใช้ส่วนขยายมาตรฐานของ PHP และ SOAP + SimpleXML หากสิ่งเหล่านี้ไม่ได้ผลสำหรับคุณ PRS กับลูกค้าใหม่ / แก้ไข
การทดสอบอัตโนมัติจะทำใน Php5.6, 7.1 และ 7.2 สำหรับคลาส Updateconnector (ขณะนี้ฉันไม่พิจารณาคลาสไคลเอนต์ที่ต้องการการทดสอบอาจมีการทดสอบเบา ๆ สำหรับการเชื่อมต่อในอนาคต แต่ไม่ได้อยู่ในรายการของฉัน)
แม้ว่า PHP5.6 จะไม่ได้รับการสนับสนุนอย่างเป็นทางการอีกต่อไปห้องสมุดนี้จะยังคงเข้ากันได้จนกว่าจะมีเหตุผลที่แท้จริงในการแนะนำการสร้างภาษา PHP7 เท่านั้น
มีบางส่วนของไลบรารีนี้ซึ่งไม่ได้เป็นคู่กันทั้งหมด:
คลาสไคลเอนต์สามารถใช้สแตนด์อโลนเพื่อโทรไปยังตัวเชื่อมต่อ AFAS คุณจะต้องรู้พารามิเตอร์ที่แน่นอนที่ AFAS คาดหวังสำหรับการพักผ่อนหรือ API ของพวกเขา มีลูกค้าสำหรับทั้งคู่ หากคุณต้องการให้สิ่งต่าง ๆ อยู่ใกล้กับโครงสร้างของ AFAS ลูกค้าที่เหลือดูเหมือนจะเหมาะสมที่สุด ใช้ retcurlClient (ดูตัวอย่างด้านล่าง) และลืมเกี่ยวกับคลาสอื่น ๆ สิ่งที่คุณต้องรู้คือมีวิธีการสาธารณะหนึ่งวิธีคือ Callafas () ซึ่งส่งคืนสตริง (JSON) ที่มีผลการโทรที่ประสบความสำเร็จหรือโยนข้อยกเว้น
คลาสการเชื่อมต่อล้อมรอบสบู่หรือส่วนที่เหลือและนามธรรมออกไปพารามิเตอร์บางอย่างที่ไม่ง่ายต่อการจัดการ ใช้ถ้าคุณเช่น
UpdateObject (รวมถึงคลาสเด็ก) สามารถใช้เพื่อสร้าง XML หรือ JSON Payloads สำหรับตัวเชื่อมต่ออัปเดตและตรวจสอบเนื้อหาของพวกเขา เอาต์พุตของพวกเขาคือสตริงซึ่งสามารถใช้งานได้ในแบบที่คุณต้องการ (เช่นส่งข้อมูลสตริงผ่านคลาสไคลเอนต์หรือผ่านการเชื่อมต่อ :: senddata () หรือใช้ updateObjects ด้วยรหัสที่กำหนดเองของคุณเอง)
นอกจากนี้ยังมีคลาส Helper ที่มีวิธีการคงที่บางอย่างซึ่งอาจเป็นประโยชน์สำหรับโปรแกรมเมอร์บางตัว แต่ฉันไม่ต้องการให้ลูกค้า / การเชื่อมต่อมากเกินไป (เช่นเดียวกับ isocountryTrait / knbasicaddress / orgpersonContact มีวิธีการสาธารณะบางอย่างที่โปรแกรมเมอร์สามารถใช้สำหรับการตรวจสอบความถูกต้องของที่อยู่เช่นของตนเองโดยไม่ต้องใช้ฟังก์ชันการทำงานหลักของคลาสเหล่านี้
ก่อนอื่นเราจะหารือเกี่ยวกับลูกค้าและให้ตัวอย่างการโทรเพื่อการเปรียบเทียบกับการเชื่อมต่อ คุณสามารถข้ามสิ่งเหล่านี้ได้เว้นแต่คุณจะอยากรู้เกี่ยวกับความแตกต่าง
สิ่งเหล่านี้สามารถใช้แบบสแตนด์อโลนเพื่อโทรหาสบู่ / ส่วนที่เหลือเพื่อทำกำไร AFAS หากคุณรู้โครงสร้างของการโทร คลาสลูกค้าเกี่ยวข้องกับ:
การตั้งค่าการเชื่อมต่อและการรับรองความถูกต้องจะถูกส่งผ่านเข้าไปในตัวสร้าง ไม่เรียก AFAS ทุกคน
คุณจะใช้วิธีการสาธารณะเพียงวิธีเดียว: 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'; มันเป็นเสื้อคลุมรอบสบู่
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>' ] );การเชื่อมต่อล้อมรอบไคลเอนต์และเป็นนามธรรมออกไปข้างนอกการตรวจสอบความถูกต้องของอาร์กิวเมนต์ / การประมวลผลข้อมูลที่ไม่เฉพาะลูกค้า มันมีไวยากรณ์ของ AO สำหรับตัวกรอง มันมีสองวิธีที่สำคัญ: 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 จะได้รับการถอดรหัสสำหรับคุณ)
รับตัวเชื่อมต่อ
อัปเดตคลาส Connectors / UpdateObject
คำแนะนำสำหรับนักพัฒนา
ฉันชอบการสนับสนุนซอฟต์แวร์โอเพ่นซอร์สให้กับโลกและฉันชอบเปิดระบบกึ่งคลอด (ซึ่งเป็นกรณีของ AFAS ในปี 2012 แต่มันก็ดีขึ้น) ให้ฉันตะโกนออกมาถ้าสิ่งนี้มีประโยชน์หรือถ้าคุณมีส่วนร่วม ติดต่อฉันหากคุณต้องการงานรวม (ฉันมีประสบการณ์กับระบบอื่น ๆ อีกหลายระบบ)
ไลบรารีนี้ได้รับอนุญาตภายใต้ใบอนุญาต MIT - ดูไฟล์ License.md สำหรับรายละเอียด
เคล็ดลับหมวกไปยัง Philip Vergunst & Nathan Vergunst -Kolozsvári @ แหล่งที่มาของคุณ - การผลิตรหัส PHP รุ่นแรกที่อย่างน้อยก็แลกเปลี่ยนข้อมูลที่ถูกต้องต้องไม่ง่าย
ตะโกนออกไปที่ Yellowgrape มืออาชีพในกลยุทธ์อีคอมเมิร์ซ / การตลาด / การออกแบบ ในขณะที่ฉันผลิตซอฟต์แวร์ชิ้นนี้ในเวลาที่ยังไม่ได้ชำระฉันฉันจะไม่มีประสบการณ์ AFAS หากไม่มีพวกเขา