4 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
\r
5 * Copyright (C) 2002-2004 The Nucleus Group
\r
7 * This program is free software; you can redistribute it and/or
\r
8 * modify it under the terms of the GNU General Public License
\r
9 * as published by the Free Software Foundation; either version 2
\r
10 * of the License, or (at your option) any later version.
\r
11 * (see nucleus/documentation/index.html#license for more info)
\r
13 * $Id: api_metaweblog.inc.php,v 1.1.1.1 2005-02-28 07:15:04 kimitake Exp $
\r
17 * This file contains definitions for the methods of the metaWeblog API
\r
21 // metaWeblog.newPost
\r
22 $f_metaWeblog_newPost_sig = array(array(
\r
24 $xmlrpcString, // itemid of the new item
\r
27 $xmlrpcString, // blogid
\r
28 $xmlrpcString, // username
\r
29 $xmlrpcString, // password
\r
30 $xmlrpcStruct, // content
\r
31 $xmlrpcBoolean, // publish boolean (set to false to create draft)
\r
34 $f_metaWeblog_newPost_doc = "Adds a new item to the given blog. Adds it as a draft when publish is false";
\r
35 function f_metaWeblog_newPost($m) {
\r
36 $blogid = _getScalar($m,0);
\r
37 $username = _getScalar($m,1);
\r
38 $password = _getScalar($m,2);
\r
39 $struct = $m->getParam(3);
\r
40 $content = _getStructVal($struct, 'description');
\r
41 $title = _getStructVal($struct, 'title');
\r
43 // category is optional (thus: be careful)!
\r
44 $catlist = $struct->structmem('categories');
\r
45 if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0))
\r
46 $category = _getArrayVal($catlist, 0);
\r
48 $publish = _getScalar($m,4);
\r
50 return _addItem($blogid, $username, $password, $title, $content, '', $publish, 0, $category);
\r
54 // metaWeblog.getCategories
\r
55 $f_metaWeblog_getCategories_sig = array(array(
\r
57 $xmlrpcStruct, // categories for blog
\r
60 $xmlrpcString, // blogid
\r
61 $xmlrpcString, // username
\r
62 $xmlrpcString, // password
\r
65 $f_metaWeblog_getCategories_doc = "Returns the categories for a given blog";
\r
66 function f_metaWeblog_getCategories($m) {
\r
67 $blogid = _getScalar($m,0);
\r
68 $username = _getScalar($m,1);
\r
69 $password = _getScalar($m,2);
\r
71 return _categoryList($blogid, $username, $password);
\r
75 // metaWeblog.getPost
\r
76 $f_metaWeblog_getPost_sig = array(array(
\r
78 $xmlrpcStruct, // the juice
\r
81 $xmlrpcString, // itemid
\r
82 $xmlrpcString, // username
\r
83 $xmlrpcString, // password
\r
86 $f_metaWeblog_getPost_doc = "Retrieves a post";
\r
87 function f_metaWeblog_getPost($m) {
\r
88 $itemid = _getScalar($m,0);
\r
89 $username = _getScalar($m,1);
\r
90 $password = _getScalar($m,2);
\r
92 return _mw_getPost($itemid, $username, $password);
\r
96 // metaWeblog.editPost
\r
97 $f_metaWeblog_editPost_sig = array(array(
\r
99 $xmlrpcBoolean, // true
\r
102 $xmlrpcString, // itemid
\r
103 $xmlrpcString, // username
\r
104 $xmlrpcString, // password
\r
105 $xmlrpcStruct, // content
\r
106 $xmlrpcBoolean, // publish boolean (set to false to create draft)
\r
109 $f_metaWeblog_editPost_doc = "Edits an item";
\r
110 function f_metaWeblog_editPost($m) {
\r
113 $itemid = _getScalar($m,0);
\r
114 $username = _getScalar($m,1);
\r
115 $password = _getScalar($m,2);
\r
118 $struct = $m->getParam(3);
\r
119 $content = _getStructVal($struct, 'description');
\r
120 $title = _getStructVal($struct, 'title');
\r
122 // category is optional (thus: be careful)!
\r
123 $catlist = $struct->structmem('categories');
\r
124 if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) {
\r
125 $category = _getArrayVal($catlist, 0);
\r
128 $publish = _getScalar($m,4);
\r
130 // get old title and extended part
\r
131 if (!$manager->existsItem($itemid,1,1))
\r
132 return _error(6,"No such item ($itemid)");
\r
133 $blogid = getBlogIDFromItemID($itemid);
\r
135 $old =& $manager->getItem($itemid,1,1);
\r
137 if ($category == '')
\r
139 // leave category unchanged when not present
\r
140 $catid = $old['catid'];
\r
144 $blog = new BLOG($blogid);
\r
145 $catid = $blog->getCategoryIdFromName($category);
\r
148 if ($old['draft'] && $publish) {
\r
155 return _edititem($itemid, $username, $password, $catid, $title, $content, $old['more'], $wasdraft, $publish, $old['closed']);
\r
159 // metaWeblog.newMediaObject
\r
160 $f_metaWeblog_newMediaObject_sig = array(array(
\r
162 $xmlrpcStruct, // "url" element
\r
165 $xmlrpcString, // blogid
\r
166 $xmlrpcString, // username
\r
167 $xmlrpcString, // password
\r
168 $xmlrpcStruct // 'name', 'type' and 'bits'
\r
170 $f_metaWeblog_newMediaObject_doc = 'Uploads a file to to the media library of the user';
\r
171 function f_metaWeblog_newMediaObject($m) {
\r
172 $blogid = _getScalar($m, 0);
\r
173 $username = _getScalar($m, 1);
\r
174 $password = _getScalar($m, 2);
\r
176 $struct = $m->getParam(3);
\r
177 $name = _getStructVal($struct, 'name');
\r
178 $type = _getStructVal($struct, 'type');
\r
179 $bits = _getStructVal($struct, 'bits');
\r
181 return _newMediaObject($blogid, $username, $password, array('name' => $name, 'type' => $type, 'bits' => $bits));
\r
184 // metaWeblog.getRecentPosts
\r
185 $f_metaWeblog_getRecentPosts_sig = array(array(
\r
187 $xmlrpcStruct, // array of structs
\r
190 $xmlrpcString, // blogid
\r
191 $xmlrpcString, // username
\r
192 $xmlrpcString, // password
\r
193 $xmlrpcInt // number of posts
\r
195 $f_metaWeblog_getRecentPosts_doc = 'Returns recent weblog items.';
\r
196 function f_metaWeblog_getRecentPosts($m) {
\r
197 $blogid = _getScalar($m, 0);
\r
198 $username = _getScalar($m, 1);
\r
199 $password = _getScalar($m, 2);
\r
200 $amount = intval(_getScalar($m, 3));
\r
202 return _getRecentItemsMetaWeblog($blogid, $username, $password, $amount);
\r
205 function _getRecentItemsMetaWeblog($blogid, $username, $password, $amount) {
\r
207 $blogid = intval($blogid);
\r
208 $amount = intval($amount);
\r
211 $mem = new MEMBER();
\r
212 if (!$mem->login($username, $password))
\r
213 return _error(1,"Could not log in");
\r
215 // 2. check if allowed
\r
216 if (!BLOG::existsID($blogid))
\r
217 return _error(2,"No such blog ($blogid)");
\r
218 if (!$mem->teamRights($blogid))
\r
219 return _error(3,"Not a team member");
\r
220 $amount = intval($amount);
\r
221 if (($amount < 1) or ($amount > 20))
\r
222 return _error(5,"Amount parameter must be in range 1..20");
\r
224 // 3. create and return list of recent items
\r
225 // Struct returned has dateCreated, userid, blogid and content
\r
227 $blog = new BLOG($blogid);
\r
229 $structarray = array(); // the array in which the structs will be stored
\r
231 $query = "SELECT mname, ibody, iauthor, ibody, inumber, ititle as title, itime, cname as category"
\r
232 .' FROM '.sql_table('item').', '.sql_table('category').', '.sql_table('member')
\r
233 ." WHERE iblog=$blogid and icat=catid and iauthor=mnumber"
\r
234 ." ORDER BY itime DESC"
\r
236 $r = sql_query($query);
\r
238 while ($row = mysql_fetch_assoc($r)) {
\r
240 // remove linebreaks if needed
\r
241 if ($blog->convertBreaks())
\r
242 $row['ibody'] = removeBreaks($row['ibody']);
\r
244 $newstruct = new xmlrpcval(array(
\r
245 "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),
\r
246 "userid" => new xmlrpcval($row['iauthor'],"string"),
\r
247 "blogid" => new xmlrpcval($blogid,"string"),
\r
248 "postid" => new xmlrpcval($row['inumber'],"string"),
\r
249 "description" => new xmlrpcval($row['ibody'],"string"),
\r
250 "title" => new xmlrpcval($row['title'],"string"),
\r
251 "categories" => new xmlrpcval(
\r
253 new xmlrpcval($row['category'], "string")
\r
258 //TODO: String link?
\r
259 //TODO: String permaLink?
\r
260 //TODO: String nucleus_more?
\r
263 array_push($structarray, $newstruct);
\r
266 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));
\r
269 function _newMediaObject($blogid, $username, $password, $info) {
\r
270 global $CONF, $DIR_MEDIA, $DIR_LIBS;
\r
273 $mem = new MEMBER();
\r
274 if (!$mem->login($username, $password))
\r
275 return _error(1,'Could not log in');
\r
277 // - check if team member
\r
278 if (!BLOG::existsID($blogid))
\r
279 return _error(2,"No such blog ($blogid)");
\r
280 if (!$mem->teamRights($blogid))
\r
281 return _error(3,'Not a team member');
\r
283 $b = new BLOG($blogid);
\r
286 $data = $info['bits']; // decoding was done transparantly by xmlrpclib
\r
288 // - check filesize
\r
289 if (strlen($data) > $CONF['MaxUploadSize'])
\r
290 return _error(9, 'filesize is too big');
\r
293 // - check if filetype is allowed (check filename)
\r
294 $filename = $info['name'];
\r
296 $allowedtypes = explode (',', $CONF['AllowedTypes']);
\r
297 foreach ( $allowedtypes as $type )
\r
298 if (eregi("\." .$type. "$",$filename)) $ok = 1;
\r
300 _error(8, 'Filetype is not allowed');
\r
302 // - add file to media library
\r
303 include_once($DIR_LIBS . 'MEDIA.php'); // media classes
\r
305 // always use private media library of member
\r
306 $collection = $mem->getID();
\r
308 // prefix filename with current date (YYYY-MM-DD-)
\r
309 // this to avoid nameclashes
\r
310 if ($CONF['MediaPrefix'])
\r
311 $filename = strftime("%Y%m%d-", time()) . $filename;
\r
313 $res = MEDIA::addMediaObjectRaw($collection, $filename, $data);
\r
315 return _error(10, $res);
\r
318 $urlstruct = new xmlrpcval(array(
\r
319 "url" => new xmlrpcval($CONF['MediaURL'] . $collection. '/' . $filename,'string')
\r
322 return new xmlrpcresp($urlstruct);
\r
325 function _categoryList($blogid, $username, $password) {
\r
327 $mem = new MEMBER();
\r
328 if (!$mem->login($username, $password))
\r
329 return _error(1,"Could not log in");
\r
331 // check if on team and blog exists
\r
332 if (!BLOG::existsID($blogid))
\r
333 return _error(2,"No such blog ($blogid)");
\r
334 if (!$mem->teamRights($blogid))
\r
335 return _error(3,"Not a team member");
\r
337 $b = new BLOG($blogid);
\r
339 $categorystruct = array();
\r
341 $query = "SELECT cname, cdesc, catid"
\r
342 . ' FROM '.sql_table('category')
\r
343 . " WHERE cblog=" . intval($blogid)
\r
344 . " ORDER BY cname";
\r
345 $r = sql_query($query);
\r
347 while ($obj = mysql_fetch_object($r)) {
\r
349 $categorystruct[$obj->cname] = new xmlrpcval(
\r
351 "description" => new xmlrpcval($obj->cdesc,"string"),
\r
352 "htmlUrl" => new xmlrpcval($b->getURL() . "?catid=" . $obj->catid ,"string"),
\r
353 "rssUrl" => new xmlrpcval("","string")
\r
359 return new xmlrpcresp(new xmlrpcval( $categorystruct , "struct"));
\r
364 function _mw_getPost($itemid, $username, $password) {
\r
368 $mem = new MEMBER();
\r
369 if (!$mem->login($username, $password))
\r
370 return _error(1,"Could not log in");
\r
372 // 2. check if allowed
\r
373 if (!$manager->existsItem($itemid,1,1))
\r
374 return _error(6,"No such item ($itemid)");
\r
375 $blogid = getBlogIDFromItemID($itemid);
\r
376 if (!$mem->teamRights($blogid))
\r
377 return _error(3,"Not a team member");
\r
379 // 3. return the item
\r
380 $item =& $manager->getItem($itemid,1,1); // (also allow drafts and future items)
\r
382 $b = new BLOG($blogid);
\r
383 if ($b->convertBreaks())
\r
384 $item['body'] = removeBreaks($item['body']);
\r
386 $categoryname = $b->getCategoryName($item['catid']);
\r
388 $newstruct = new xmlrpcval(array(
\r
389 "dateCreated" => new xmlrpcval(iso8601_encode($item['timestamp']),"dateTime.iso8601"),
\r
390 "userid" => new xmlrpcval($item['authorid'],"string"),
\r
391 "blogid" => new xmlrpcval($blogid,"string"),
\r
392 "postid" => new xmlrpcval($itemid, "string"),
\r
393 "description" => new xmlrpcval($item['body'],"string"),
\r
394 "title" => new xmlrpcval($item['title'],"string"),
\r
395 "categories" => new xmlrpcval(
\r
397 new xmlrpcval($categoryname, "string")
\r
402 //TODO: add "String link" to struct?
\r
403 //TODO: add "String permaLink" to struct?
\r
404 //TODO: add "String nucleus_more" to struct?
\r
406 return new xmlrpcresp($newstruct);
\r
410 $functionDefs = array_merge($functionDefs,
\r
412 "metaWeblog.newPost" =>
\r
414 "function" => "f_metaWeblog_newPost",
\r
415 "signature" => $f_metaWeblog_newPost_sig,
\r
416 "docstring" => $f_metaWeblog_newPost_doc
\r
419 "metaWeblog.getCategories" =>
\r
421 "function" => "f_metaWeblog_getCategories",
\r
422 "signature" => $f_metaWeblog_getCategories_sig,
\r
423 "docstring" => $f_metaWeblog_getCategories_doc
\r
426 "metaWeblog.getPost" =>
\r
428 "function" => "f_metaWeblog_getPost",
\r
429 "signature" => $f_metaWeblog_getPost_sig,
\r
430 "docstring" => $f_metaWeblog_getPost_doc
\r
433 "metaWeblog.editPost" =>
\r
435 "function" => "f_metaWeblog_editPost",
\r
436 "signature" => $f_metaWeblog_editPost_sig,
\r
437 "docstring" => $f_metaWeblog_editPost_doc
\r
440 'metaWeblog.newMediaObject' =>
\r
442 'function' => 'f_metaWeblog_newMediaObject',
\r
443 'signature' => $f_metaWeblog_newMediaObject_sig,
\r
444 'docstring' => $f_metaWeblog_newMediaObject_doc
\r
447 'metaWeblog.getRecentPosts' =>
\r
449 'function' => 'f_metaWeblog_getRecentPosts',
\r
450 'signature' => $f_metaWeblog_getRecentPosts_sig,
\r
451 'docstring' => $f_metaWeblog_getRecentPosts_doc
\r