مكتبة PHP للتواصل مع ربح AFAS بطريقة عملية ، باستخدام إما الصابون أو الراحة.
هذا هو رمز المكتبة ، للاستخدام من قبل الرمز الخاص بك/مشروع آخر. من يقرأ هذا ، من المفترض أن لديه بالفعل فكرة عما يريدون تحقيقه وما هو AFAS ، لذلك لن نتناول ذلك هنا. (http://www.afas.nl/ - توثيقهم الحالية في https://static-kb.afas.nl/datafiles/help/2_9_7/se/en/index.htm على الرغم من أن عنوان URL سيتغير بلا شك.)
تم تشكيل هذا الرمز من خلال ثلاثة مبادئ:
يعني المبدأ الأول (والثالث) أن التعليمات البرمجية المفهومة مفضلة على قابلية المقاومة المستقبلية التي تنشئ فئات منفصلة لكل شيء صغير ويقدم الكثير من رمز لوحة الغلاية. وهذا يعني رمز تعلق جيدا. وهذا يعني عدم وجود سلوك غير متوقع / غير موثق. (إن التحقق من صحة وسيطات الإدخال ، والنتائج المستلمة من النظام البعيد ، يغطي المواقف غير المتوقعة للمبرمج ، ورمي استثناءات موثقة.)
ومع ذلك ، فإن المبدأ الثاني / الثالث ، بالإضافة إلى تطوير وظائف AFAS بالإضافة إلى اعتبارات التوافق المتخلف ، جعل Connection :: getData () غير منطقي في بعض الجوانب. لكن الكود لا يزال قابلاً للقراءة بسهولة إلى حد ما (لأنه لا يوجد العديد من الطرق المختلفة) وسهلة الاستدعاء لحالات الاستخدام "البسيطة".
الإصدار 2 من المكتبة يعمل مع PHP5 (5.4 وما فوق) و PHP7.
فئات العميل للراحة والصابون تستخدم امتدادات PHP القياسية + JSON و SOAP + SimpleXML ؛ إذا كانت هذه لا تعمل من أجلك ، فإن PRS مع عملاء جدد / معدلين مرحب بهم.
يتم الاختبار التلقائي على PHP5.6 و 7.1 و 7.2 لفئات UpdateConnector. (لا أعتبر حاليًا فئات العميل التي تحتاج إلى اختبارات. قد يكون هناك بعض اختبارات الضوء للاتصال في المستقبل ولكنها ليست مدرجة في قائمتي.)
على الرغم من أن PHP5.6 لم يعد مدعومًا رسميًا ، إلا أن هذه المكتبة ستبقى متوافقة معها حتى يكون هناك سبب حقيقي لتقديم بنيات لغة PHP7 فقط.
هناك بعض أجزاء هذه المكتبة التي لا تقترن جميعها بإحكام:
يمكن استخدام فئات العميل المستقلة لإجراء مكالمات إلى موصلات AFAS. ستحتاج إلى معرفة المعلمات الدقيقة التي تتوقعها AFAS لراحة أو صابون واجهة برمجة تطبيقات ؛ هناك عميل لكليهما. إذا كنت ترغب في إبقاء الأمور قريبة من بنية AFAS الخاصة ، فإن عميل REST يبدو أكثر ملاءمة. استخدم RestCurlClient (انظر المثال أدناه) ونسيان الفصول الأخرى. كل ما تحتاج إلى معرفته هو أن هناك طريقة عامة واحدة ، Callafas () ، والتي إما إرجاع سلسلة (JSON) مع نتيجة مكالمة ناجحة ، أو استثناءات.
تلتف فئة الاتصال حول عميل الصابون أو الراحة والملخصات بعض المعلمات التي ليس من السهل التعامل معها. استخدمه إذا كنت على سبيل المثال
يمكن استخدام UpdateBject (بالإضافة إلى فئات الأطفال) لإنشاء حمولات XML أو JSON لموصلات التحديث ، والتحقق من محتوياتها. إخراجهم هو سلاسل ، والتي يمكن استخدامها بأي طريقة تريدها (على سبيل المثال ، أرسل بيانات السلسلة من خلال فئة عميل ، أو من خلال الاتصال :: sendData () ، أو استخدام updateObjects مع الرمز المخصص الخاص بك).
هناك أيضًا فئة مساعد مع بعض الأساليب الثابتة الإضافية التي قد تكون مفيدة لبعض المبرمجين ، لكنني لم أرغب في زيادة تحميل العملاء / التواصل معهم. (أيضًا ، يحتوي isocountrytrait / knbasicaddress / orgpersonContact على بعض الأساليب العامة التي يمكن للمبرمجين استخدامها للتحقق من صحة العناوين المخصصة الخاصة بهم ، دون استخدام الوظيفة الرئيسية لهذه الفئات. لا يتم توثيقها بشكل أكبر.)
سنناقش العملاء أولاً ونقدم أمثلة لأغراض المقارنة مع الاتصال. يمكنك تخطيها ، إلا إذا كنت مهتمًا بالاختلافات.
يمكن استخدامها المستقلة لإجراء مكالمات الصابون / الراحة إلى ربح AFAS ، إذا كنت تعرف هيكل المكالمات. يتعامل فئة العميل فقط مع:
يتم تمرير إعدادات الاتصال والمصادقة إلى المنشئ ؛ ليس لكل دعوة AFAS فرد.
سوف تستخدم طريقة عامة واحدة فقط: callafas (). (هناك طريقة عامة ثانية: 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."}}}} ' ما يلي (تقريبًا) يعادل مثال الراحة أعلاه (باستثناء أنه يعيد سلسلة 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 والمستقبين الذين قد لا تحتاجهم أبدًا.)
ما يعادل المثال أعلاه هو:
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 ، لكنه أصبح أفضل.) أعطني صيحة إذا كان هذا مفيدًا أو إذا كان لديك مساهمة. اتصل بي إذا كنت بحاجة إلى عمل التكامل. (لدي خبرة مع العديد من الأنظمة الأخرى.)
هذه المكتبة مرخصة بموجب ترخيص معهد ماساتشوستس للتكنولوجيا - راجع ملف الترخيص.
نصيحة القبعة إلى Philip Vergunst و Nathan Vergunst -Kolozsvári @ مصدرك - أنتج الإصدار الأول من رمز PHP الذي تبادل على الأقل البيانات الصحيحة ، يجب ألا يكون سهلاً.
الصراخ إلى Yellowgrape ، المحترفين في استراتيجية التجارة الإلكترونية / التسويق / التصميم. على الرغم من أنني أنتجت هذا البرنامج في الوقت الخاص بي غير مدفوع الأجر ، إلا أنني لن أحصل على تجربة AFAS بدونها.