توفر ديموفنف إمكانية إضافة دوال يتم استدعاؤها من خلال الــ 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 |
|
الوصف | القيمة |
---|---|
نتيجة الاستدعاء - result | error |
رسالة الخطأ المعادة من الاستدعاء - data | Sorry, No Results |