4 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
\r
5 * Copyright (C) 2002-2005 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.3 2005-03-16 08:12:06 kimitake Exp $
\r
14 * $NucleusJP: api_metaweblog.inc.php,v 1.3 2005/03/12 06:19:06 kimitake Exp $
\r
18 * This file contains definitions for the methods of the metaWeblog API
\r
22 // metaWeblog.newPost
\r
23 $f_metaWeblog_newPost_sig = array(array(
\r
25 $xmlrpcString, // itemid of the new item
\r
28 $xmlrpcString, // blogid
\r
29 $xmlrpcString, // username
\r
30 $xmlrpcString, // password
\r
31 $xmlrpcStruct, // content
\r
32 $xmlrpcBoolean, // publish boolean (set to false to create draft)
\r
35 $f_metaWeblog_newPost_doc = "Adds a new item to the given blog. Adds it as a draft when publish is false";
\r
36 function f_metaWeblog_newPost($m) {
\r
37 $blogid = _getScalar($m,0);
\r
38 $username = _getScalar($m,1);
\r
39 $password = _getScalar($m,2);
\r
40 $struct = $m->getParam(3);
\r
41 $content = _getStructVal($struct, 'description');
\r
42 $title = _getStructVal($struct, 'title');
\r
44 // category is optional (thus: be careful)!
\r
45 $catlist = $struct->structmem('categories');
\r
46 if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0))
\r
47 $category = _getArrayVal($catlist, 0);
\r
49 $publish = _getScalar($m,4);
\r
51 return _addItem($blogid, $username, $password, $title, $content, '', $publish, 0, $category);
\r
55 // metaWeblog.getCategories
\r
56 $f_metaWeblog_getCategories_sig = array(array(
\r
58 $xmlrpcStruct, // categories for blog
\r
61 $xmlrpcString, // blogid
\r
62 $xmlrpcString, // username
\r
63 $xmlrpcString, // password
\r
66 $f_metaWeblog_getCategories_doc = "Returns the categories for a given blog";
\r
67 function f_metaWeblog_getCategories($m) {
\r
68 $blogid = _getScalar($m,0);
\r
69 $username = _getScalar($m,1);
\r
70 $password = _getScalar($m,2);
\r
72 return _categoryList($blogid, $username, $password);
\r
76 // metaWeblog.getPost
\r
77 $f_metaWeblog_getPost_sig = array(array(
\r
79 $xmlrpcStruct, // the juice
\r
82 $xmlrpcString, // itemid
\r
83 $xmlrpcString, // username
\r
84 $xmlrpcString, // password
\r
87 $f_metaWeblog_getPost_doc = "Retrieves a post";
\r
88 function f_metaWeblog_getPost($m) {
\r
89 $itemid = _getScalar($m,0);
\r
90 $username = _getScalar($m,1);
\r
91 $password = _getScalar($m,2);
\r
93 return _mw_getPost($itemid, $username, $password);
\r
97 // metaWeblog.editPost
\r
98 $f_metaWeblog_editPost_sig = array(array(
\r
100 $xmlrpcBoolean, // true
\r
103 $xmlrpcString, // itemid
\r
104 $xmlrpcString, // username
\r
105 $xmlrpcString, // password
\r
106 $xmlrpcStruct, // content
\r
107 $xmlrpcBoolean, // publish boolean (set to false to create draft)
\r
110 $f_metaWeblog_editPost_doc = "Edits an item";
\r
111 function f_metaWeblog_editPost($m) {
\r
114 $itemid = _getScalar($m,0);
\r
115 $username = _getScalar($m,1);
\r
116 $password = _getScalar($m,2);
\r
119 $struct = $m->getParam(3);
\r
120 $content = _getStructVal($struct, 'description');
\r
121 $title = _getStructVal($struct, 'title');
\r
123 // category is optional (thus: be careful)!
\r
124 $catlist = $struct->structmem('categories');
\r
125 if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) {
\r
126 $category = _getArrayVal($catlist, 0);
\r
129 $publish = _getScalar($m,4);
\r
131 // get old title and extended part
\r
132 if (!$manager->existsItem($itemid,1,1))
\r
133 return _error(6,"No such item ($itemid)");
\r
134 $blogid = getBlogIDFromItemID($itemid);
\r
136 $old =& $manager->getItem($itemid,1,1);
\r
138 if ($category == '')
\r
140 // leave category unchanged when not present
\r
141 $catid = $old['catid'];
\r
145 $blog = new BLOG($blogid);
\r
146 $catid = $blog->getCategoryIdFromName($category);
\r
149 if ($old['draft'] && $publish) {
\r
156 return _edititem($itemid, $username, $password, $catid, $title, $content, $old['more'], $wasdraft, $publish, $old['closed']);
\r
160 // metaWeblog.newMediaObject
\r
161 $f_metaWeblog_newMediaObject_sig = array(array(
\r
163 $xmlrpcStruct, // "url" element
\r
166 $xmlrpcString, // blogid
\r
167 $xmlrpcString, // username
\r
168 $xmlrpcString, // password
\r
169 $xmlrpcStruct // 'name', 'type' and 'bits'
\r
171 $f_metaWeblog_newMediaObject_doc = 'Uploads a file to to the media library of the user';
\r
172 function f_metaWeblog_newMediaObject($m) {
\r
173 $blogid = _getScalar($m, 0);
\r
174 $username = _getScalar($m, 1);
\r
175 $password = _getScalar($m, 2);
\r
177 $struct = $m->getParam(3);
\r
178 $name = _getStructVal($struct, 'name');
\r
179 $type = _getStructVal($struct, 'type');
\r
180 $bits = _getStructVal($struct, 'bits');
\r
182 return _newMediaObject($blogid, $username, $password, array('name' => $name, 'type' => $type, 'bits' => $bits));
\r
185 // metaWeblog.getRecentPosts
\r
186 $f_metaWeblog_getRecentPosts_sig = array(array(
\r
188 $xmlrpcStruct, // array of structs
\r
191 $xmlrpcString, // blogid
\r
192 $xmlrpcString, // username
\r
193 $xmlrpcString, // password
\r
194 $xmlrpcInt // number of posts
\r
196 $f_metaWeblog_getRecentPosts_doc = 'Returns recent weblog items.';
\r
197 function f_metaWeblog_getRecentPosts($m) {
\r
198 $blogid = _getScalar($m, 0);
\r
199 $username = _getScalar($m, 1);
\r
200 $password = _getScalar($m, 2);
\r
201 $amount = intval(_getScalar($m, 3));
\r
203 return _getRecentItemsMetaWeblog($blogid, $username, $password, $amount);
\r
206 function _getRecentItemsMetaWeblog($blogid, $username, $password, $amount) {
\r
208 $blogid = intval($blogid);
\r
209 $amount = intval($amount);
\r
212 $mem = new MEMBER();
\r
213 if (!$mem->login($username, $password))
\r
214 return _error(1,"Could not log in");
\r
216 // 2. check if allowed
\r
217 if (!BLOG::existsID($blogid))
\r
218 return _error(2,"No such blog ($blogid)");
\r
219 if (!$mem->teamRights($blogid))
\r
220 return _error(3,"Not a team member");
\r
221 $amount = intval($amount);
\r
222 if (($amount < 1) or ($amount > 20))
\r
223 return _error(5,"Amount parameter must be in range 1..20");
\r
225 // 3. create and return list of recent items
\r
226 // Struct returned has dateCreated, userid, blogid and content
\r
228 $blog = new BLOG($blogid);
\r
230 $structarray = array(); // the array in which the structs will be stored
\r
232 $query = "SELECT mname, ibody, iauthor, ibody, inumber, ititle as title, itime, cname as category"
\r
233 .' FROM '.sql_table('item').', '.sql_table('category').', '.sql_table('member')
\r
234 ." WHERE iblog=$blogid and icat=catid and iauthor=mnumber"
\r
235 ." ORDER BY itime DESC"
\r
237 $r = sql_query($query);
\r
239 while ($row = mysql_fetch_assoc($r)) {
\r
241 // remove linebreaks if needed
\r
242 if ($blog->convertBreaks())
\r
243 $row['ibody'] = removeBreaks($row['ibody']);
\r
245 $newstruct = new xmlrpcval(array(
\r
246 "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),
\r
247 "userid" => new xmlrpcval($row['iauthor'],"string"),
\r
248 "blogid" => new xmlrpcval($blogid,"string"),
\r
249 "postid" => new xmlrpcval($row['inumber'],"string"),
\r
250 "description" => new xmlrpcval($row['ibody'],"string"),
\r
251 "title" => new xmlrpcval($row['title'],"string"),
\r
252 "categories" => new xmlrpcval(
\r
254 new xmlrpcval($row['category'], "string")
\r
259 //TODO: String link?
\r
260 //TODO: String permaLink?
\r
261 //TODO: String nucleus_more?
\r
264 array_push($structarray, $newstruct);
\r
267 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));
\r
270 function _newMediaObject($blogid, $username, $password, $info) {
\r
271 global $CONF, $DIR_MEDIA, $DIR_LIBS;
\r
274 $mem = new MEMBER();
\r
275 if (!$mem->login($username, $password))
\r
276 return _error(1,'Could not log in');
\r
278 // - check if team member
\r
279 if (!BLOG::existsID($blogid))
\r
280 return _error(2,"No such blog ($blogid)");
\r
281 if (!$mem->teamRights($blogid))
\r
282 return _error(3,'Not a team member');
\r
284 $b = new BLOG($blogid);
\r
287 $data = $info['bits']; // decoding was done transparantly by xmlrpclib
\r
289 // - check filesize
\r
290 if (strlen($data) > $CONF['MaxUploadSize'])
\r
291 return _error(9, 'filesize is too big');
\r
294 // - check if filetype is allowed (check filename)
\r
295 $filename = $info['name'];
\r
297 $allowedtypes = explode (',', $CONF['AllowedTypes']);
\r
298 foreach ( $allowedtypes as $type )
\r
299 if (eregi("\." .$type. "$",$filename)) $ok = 1;
\r
301 _error(8, 'Filetype is not allowed');
\r
303 // - add file to media library
\r
304 include_once($DIR_LIBS . 'MEDIA.php'); // media classes
\r
306 // always use private media library of member
\r
307 $collection = $mem->getID();
\r
309 // prefix filename with current date (YYYY-MM-DD-)
\r
310 // this to avoid nameclashes
\r
311 if ($CONF['MediaPrefix'])
\r
312 $filename = strftime("%Y%m%d-", time()) . $filename;
\r
314 $res = MEDIA::addMediaObjectRaw($collection, $filename, $data);
\r
316 return _error(10, $res);
\r
319 $urlstruct = new xmlrpcval(array(
\r
320 "url" => new xmlrpcval($CONF['MediaURL'] . $collection. '/' . $filename,'string')
\r
323 return new xmlrpcresp($urlstruct);
\r
326 function _categoryList($blogid, $username, $password) {
\r
328 $mem = new MEMBER();
\r
329 if (!$mem->login($username, $password))
\r
330 return _error(1,"Could not log in");
\r
332 // check if on team and blog exists
\r
333 if (!BLOG::existsID($blogid))
\r
334 return _error(2,"No such blog ($blogid)");
\r
335 if (!$mem->teamRights($blogid))
\r
336 return _error(3,"Not a team member");
\r
338 $b = new BLOG($blogid);
\r
340 $categorystruct = array();
\r
342 $query = "SELECT cname, cdesc, catid"
\r
343 . ' FROM '.sql_table('category')
\r
344 . " WHERE cblog=" . intval($blogid)
\r
345 . " ORDER BY cname";
\r
346 $r = sql_query($query);
\r
348 while ($obj = mysql_fetch_object($r)) {
\r
350 $categorystruct[$obj->cname] = new xmlrpcval(
\r
352 "description" => new xmlrpcval($obj->cdesc,"string"),
\r
353 "htmlUrl" => new xmlrpcval($b->getURL() . "?catid=" . $obj->catid ,"string"),
\r
354 "rssUrl" => new xmlrpcval("","string")
\r
360 return new xmlrpcresp(new xmlrpcval( $categorystruct , "struct"));
\r
365 function _mw_getPost($itemid, $username, $password) {
\r
369 $mem = new MEMBER();
\r
370 if (!$mem->login($username, $password))
\r
371 return _error(1,"Could not log in");
\r
373 // 2. check if allowed
\r
374 if (!$manager->existsItem($itemid,1,1))
\r
375 return _error(6,"No such item ($itemid)");
\r
376 $blogid = getBlogIDFromItemID($itemid);
\r
377 if (!$mem->teamRights($blogid))
\r
378 return _error(3,"Not a team member");
\r
380 // 3. return the item
\r
381 $item =& $manager->getItem($itemid,1,1); // (also allow drafts and future items)
\r
383 $b = new BLOG($blogid);
\r
384 if ($b->convertBreaks())
\r
385 $item['body'] = removeBreaks($item['body']);
\r
387 $categoryname = $b->getCategoryName($item['catid']);
\r
389 $newstruct = new xmlrpcval(array(
\r
390 "dateCreated" => new xmlrpcval(iso8601_encode($item['timestamp']),"dateTime.iso8601"),
\r
391 "userid" => new xmlrpcval($item['authorid'],"string"),
\r
392 "blogid" => new xmlrpcval($blogid,"string"),
\r
393 "postid" => new xmlrpcval($itemid, "string"),
\r
394 "description" => new xmlrpcval($item['body'],"string"),
\r
395 "title" => new xmlrpcval($item['title'],"string"),
\r
396 "categories" => new xmlrpcval(
\r
398 new xmlrpcval($categoryname, "string")
\r
403 //TODO: add "String link" to struct?
\r
404 //TODO: add "String permaLink" to struct?
\r
405 //TODO: add "String nucleus_more" to struct?
\r
407 return new xmlrpcresp($newstruct);
\r
411 $functionDefs = array_merge($functionDefs,
\r
413 "metaWeblog.newPost" =>
\r
415 "function" => "f_metaWeblog_newPost",
\r
416 "signature" => $f_metaWeblog_newPost_sig,
\r
417 "docstring" => $f_metaWeblog_newPost_doc
\r
420 "metaWeblog.getCategories" =>
\r
422 "function" => "f_metaWeblog_getCategories",
\r
423 "signature" => $f_metaWeblog_getCategories_sig,
\r
424 "docstring" => $f_metaWeblog_getCategories_doc
\r
427 "metaWeblog.getPost" =>
\r
429 "function" => "f_metaWeblog_getPost",
\r
430 "signature" => $f_metaWeblog_getPost_sig,
\r
431 "docstring" => $f_metaWeblog_getPost_doc
\r
434 "metaWeblog.editPost" =>
\r
436 "function" => "f_metaWeblog_editPost",
\r
437 "signature" => $f_metaWeblog_editPost_sig,
\r
438 "docstring" => $f_metaWeblog_editPost_doc
\r
441 'metaWeblog.newMediaObject' =>
\r
443 'function' => 'f_metaWeblog_newMediaObject',
\r
444 'signature' => $f_metaWeblog_newMediaObject_sig,
\r
445 'docstring' => $f_metaWeblog_newMediaObject_doc
\r
448 'metaWeblog.getRecentPosts' =>
\r
450 'function' => 'f_metaWeblog_getRecentPosts',
\r
451 'signature' => $f_metaWeblog_getRecentPosts_sig,
\r
452 'docstring' => $f_metaWeblog_getRecentPosts_doc
\r