طريقة برمجة دالة API

توفر ديموفنف إمكانية إضافة دوال يتم استدعاؤها من خلال الــ API وذلك بإضافتها للموديول نفسه , وبذلك تصبح عملية توسيع إمكانيات الموديول مفتوحة لجميع المطورين

يجب في كل الأحوال أن يكون للمستخدم الذي سيتصل بالــ API صلاحية :

- يمكنه الاتصال بالـ API وذلك من خلال صلاحيات مجموعة عضويته

ثوابت عامة - مكان الملف واسمه

عند إنشاء ملف PHP يحتوي على دالة يتم استدعاؤها من خلال الــ API يجب أن يتم وضع الملف داخل مجلد الموديول أو البلجن
( نفترض -على سبيل المثال- أن الموديول المطلوب باسم news والدالة التي ترغب بتوفيرها هي getLatest لجلب آخر الأخبار)

الوصف مكان الملف
مجلد الموديول /include/plugins/news
المجلد الخاص بملفات الــ API وهو ثابت في كل البلجنات /include/plugins/news/api
ملف الدالة التي سيتم إنشاؤها ، ويجب أن يكون اسمه باسم الدالة /include/plugins/news/api/getLatest.php

ثوابت عامة - الكلاس والدالة

يجب أن تقوم بعمل كلاس باسم الموديول يكون امتدادًا لكلاس DIM_Api_Actions ثم تقوم بعد ذلك بوضع دالة داخله وتسميها بالاسم المطلوب استدعاؤه

الوصف اسم الكلاس أو الدالة
اسم كلاسك للبلجن news_api
اسم الدالة getLatest
البارميترز $page = 1, $limit = 10, $sections = ""

- في حالة لم تقم بوضع قيمة افتراضية لأي بارام ، فإنه سيكون مطلوبًا في الاستدعاء ، وسيقوم الــ API بإعادة خطأ في النتيجة للمطالبة بوضع قيمة لهذا البارام
- عند إرسال قيمة بارام بشكل array فيجب أن يتم إرسالها بعد تحويلها إلى json_encode ثم -ومن خلال استقبال البارام- قم بفكه باستخدام json_decode حيث إن ال curl لا يقوم بإرسال مصفوفات متعمقة

المتغيرات العامة

هي متغيرات يتم استخدامها في نظام ديموفنف ، مثل dimofinf, $dimphrase$ حيث يمكننا استخدامها في الملف (يمكنك الرجوع للشروحات البرمجية للتعرف عليها بشكل أعمق ومفصل)

مثال تطبيقي

من خلال المثال التالي يمكنك بناء أي دالة تعطيك النتائج التي ترغب بها , وفي مثالنا التالي سنقوم بتوفير آخر الأخبار من خلال ملف getLatest.php للتطبيق الذي يطلبه ، مع إمكانية تحديد الأقسام المطلوب أن يأتي بمحتوياتها و/أو الصفحات التي نرغب بها ، واللمت لكل صفحة


						
						class news_api extends DIM_Api_Actions
    {
        function getLatest($page = 1, $limit = 10, $sections = "")
            {
                global $dimofinf, $dimphrase;

                if (!is_permissioned_to("news", 'cvcontent'))
                    {
                        return $this->error("Sorry, you do not have permission to view contents");
                    }

                if ($sections)
                    {
                        $sections = json_decode($sections, true);
                    }

                if (is_array($sections) && !empty($sections))
                    {
                        $sectionsq = " AND newsm.mother_id IN (0" . implode(',', $sections) . ") ";
                    }

                $count = $dimofinf->db->query_first_slave("SELECT COUNT(*) AS total 
                FROM " . TABLE_PREFIX . "newsm AS newsm
                WHERE newsm.status = 'Published' 
                " . $sectionsq . " 
                ");

                #we don't want to exhaust the server
                if ($limit > 100)
                    {
                        $limit = 100;
                    }

                $perpage = $limit;

                if ($page < 1)
                    {
                        $page = 1;
                    }
                elseif($page > ceil(($count['total'] + 1) / $perpage))
                    {
                        $page = ceil(($count['total'] + 1) / $perpage);
                    }

                $limit = ($page - 1) * $perpage;

                $result = $dimofinf->db->query_read_slave("SELECT newsm.*,newspic.picture_type    
                                FROM " . TABLE_PREFIX . "newsm AS newsm
                                LEFT JOIN " . TABLE_PREFIX . "newspic AS newspic ON (newspic.id=newsm.dpic)
		                            WHERE newsm.status = 'Published' 
		                            " . $sectionsq . " 
		                            ORDER BY newsm.date DESC 
		                            LIMIT " . intval($limit) . "," . intval($perpage));

                $num_rows = $dimofinf->db->num_rows($result);

                if ($num_rows)
                    {
                        $key = 1;
                        $return = array();

                        while($row = $dimofinf->db->fetch_array($result))
                            {
                            		#perform permission check
                                if (execute_permission(array
                                    (
                                    "cvsection",
                                    "cvcontent",
                                    "cvothcontent",
                                    "casection",
                                    "cpcontent",
                                    "cpocontent"
                                    ), 'news', $row, false, false))
                                    {
                                        continue;
                                    }
                                    
                                #get rid of bbcode and html tags    
                                $row['brief'] = bbcodeparse_for_display($row['brief']);

                                if ($row['brief'] AND mb_strlen($row['brief'], "UTF-8") < $dimofinf->options['newssmxst'])
                                    {
                                        $row['truncatedtext'] = $row['brief'];
                                    }
                                elseif(mb_strlen($row['brief'], "UTF-8") > $dimofinf->options['newssmxst'])
                                    {
                                        $row['truncatedtext'] = bbcodeparse_for_display($row['brief'], $dimofinf->options['newssmxst']) . ".. " . $dimphrase['read_more'] . "";
                                    }
                                else
                                    {
                                        $row['truncatedtext'] = bbcodeparse_for_display($row['text'], $dimofinf->options['newssmxst']);
                                    }
                                    
                                #extract images    
                                $img = unserialize($row['picture_array']);
                                
                                $return[] = array
                                    (
                                    "total" => $count['total'],
                                    "id" => $row['id'],
                                    "caption" => htmlspecialchars_uni(fetch_censored_text($row['caption'])),
                                    "catname" => $dimofinf->modulesections['news'][$row['mother_id']]['name'],
                                    "catid" => $row['mother_id'],
                                    "totalkeys" => $num_rows,
                                    "key" => $key,
                                    "comnum" => $row['comnum'],
                                    "greet" => $row['greet'],
                                    "views" => $row['views'],
                                    "date" => DIM_date($dimofinf->options['dateformat'], $row['date'], 2),
                                    "img" => $img[0]['name'],
                                    "dpic" => ($row['dpic']) ? $row['dpic'] : "",
                                    "picture_type" => ($row['picture_type']) ? $row['picture_type'] : "",
                                    "videoin" => $row['videoin'],
                                    "audioin" => $row['audioin'],
                                    "description" => $row['truncatedtext'],
                                    "picin" => $row['picin'],
                                    "updated" => $row['updated']
                                    );

                                $key++;
                            }
                            
                        #let's keep the server happy
                        $dimofinf->db->free_result($result);
                        unset($row, $result, $count, $limit, $page, $perpage, $num_rows);

                        #return the results
                        return $return;
                    }
                else
                    {
                        return $this->error("Sorry, No Results");
                    }
            }
    }
	
						
					

مثال للاستدعاء الخارجي

سنقوم باستدعاء الدالة getLatest من خلال الــ API

البارميترز المطلوبة :
الوصف البارام
رقم الصفحة المطلوبة (اختياري) page
أقصى عدد محتويات للصفحة (اختياري) limit
تحديد أرقام الأقسام المطلوب عرض محتوياتها (اختياري) sections

						
							/* JSON API Sample Code */

# URL to DIMOFINF CMS site API file
$url = "http://www.yourdomain.com/api.php";

$postfields = array();
$postfields["username"] = "admin"; #username goes here
$postfields["password"] = "123"; #password goes here
$postfields["action"] = "getLatest"; #action performed by the API:Functions
$postfields["datatype"] = "json";
$postfields["module"] = "news";
$postfields["page"] = 1; # optional
$postfields["limit"] = 10; # optional
$postfields["sections"] = json_encode(array(1,3,4,9)); # optional

// use curl to connect
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_POST, 1); # only post method allowed
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$data = curl_exec($ch);

if (curl_error($ch))
    {
        die("Connection Error: " . curl_errno($ch) . ' - ' . curl_error($ch));
    }
curl_close($ch);

$results = json_decode($data, true); # Decode JSON String

#print_r($results);	# Output json Response as Array

if ($results["result"] == "success")
    {
    /* Result was OK!
    YOUR ACTION HERE
    */
    }
else
    {
        # An error occured
        echo "The following error occured: " . $results["data"];
    }

# Debug Output - Uncomment if needed to troubleshoot problems
/* echo "";
*/
						
					

مثال الاستدعاء الداخلي

						
$action = "getLatest";
$values = array();
$values["datatype"] = "json";
$values["module"] = "news";
$values["page"] = 1; # optional
$values["limit"] = 10; # optional
$values["sections"] = json_encode(array(1,3,4,9)); # optional

$data = localAPI($action, $values);
						
					

القيمة الناتجة في حالة النجاح

الوصف القيمة
نتيجة الاستدعاء - result success
مصفوفة من المحتويات - data
						
						array(
								0 => array
									(
										[total] => 142
                    [id] => 105
                    [caption] => الفيصل خلال تسلّمه "جائزة مكة"
                    [catname] => أخبار عربية
                    [catid] => 1
                    [totalkeys] => 10
                    [key] => 1
                    [comnum] => 3
                    [greet] => 0
                    [views] => 270
                    [date] => منذ 3 يوم
                    [img] => 105_0.png
                    [dpic] => 
                    [picture_type] => 
                    [videoin] => 0
                    [audioin] => 0
                    [description] => كرم أمير منطقة مكة الأمير مشعل بن عبدالله مساء اليوم (الثلاثاء) بفندق هيلتون جدة وزير التربية والتعليم الأمير خالد الفيصل بجائزة مكة للتميز بفروعها الثمانية، تقديرًا لعطائه للمنطقة.
                    [picin] => 1
                    [updated] => 0
									),
								1 => array
									(
										[total] => 142
                    [id] => 148
                    [caption] => تسريب جديد عن مواصفات وسعر هاتف سوني إكسبيريا زد 3
                    [catname] => أخبار تقنية
                    [catid] => 4
                    [totalkeys] => 10
                    [key] => 2
                    [comnum] => 5
                    [greet] => 0
                    [views] => 379
                    [date] => 08-30-2014
                    [img] => 148_0.jpg
                    [dpic] => 
                    [picture_type] => 
                    [videoin] => 0
                    [audioin] => 0
                    [description] => في ظلِّ التسريبات الجديدة، بات من المتوقع قدوم هاتف سوني إكسبيريا زد 3 في وقتٍ لاحق من شهر سبتمبر، على أن يكون الإطلاق الفعلي قبل نهاية العام الجاري.
سيأتي إكسبيريا زد 3 مع تصميم نحيف وحواف أصغر، وربما سيحتوي على سماعتين في واجهة الهاتف. وكما كان الأمر مع زد 1 من قبل، فإن إكسبيريا زد 3 سيكون ضد الماء والأتربة. كذلك سيحمل شاشة صغيرة مقاس 4.6 بوصة فقط، مع دقة عرض 1280 
                    [picin] => 1
                    [updated] => 0
									)
							 )

القيمة الناتجة في حالة الفشل

الوصف القيمة
نتيجة الاستدعاء - result error
رسالة الخطأ المعادة من الاستدعاء - data Sorry, No Results




للأعلى | العودة