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
15 * This file contains definitions for the methods of the metaWeblog API
\r
19 // metaWeblog.newPost
\r
20 $f_metaWeblog_newPost_sig = array(array(
\r
22 $xmlrpcString, // itemid of the new item
\r
25 $xmlrpcString, // blogid
\r
26 $xmlrpcString, // username
\r
27 $xmlrpcString, // password
\r
28 $xmlrpcStruct, // content
\r
29 $xmlrpcBoolean, // publish boolean (set to false to create draft)
\r
32 $f_metaWeblog_newPost_doc = "Adds a new item to the given blog. Adds it as a draft when publish is false";
\r
33 function f_metaWeblog_newPost($m) {
\r
34 $blogid = _getScalar($m,0);
\r
35 $username = _getScalar($m,1);
\r
36 $password = _getScalar($m,2);
\r
37 $struct = $m->getParam(3);
\r
38 $content = _getStructVal($struct, 'description');
\r
39 $title = _getStructVal($struct, 'title');
\r
41 // category is optional (thus: be careful)!
\r
42 $catlist = $struct->structmem('categories');
\r
43 if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0))
\r
44 $category = _getArrayVal($catlist, 0);
\r
46 $publish = _getScalar($m,4);
\r
48 return _addItem($blogid, $username, $password, $title, $content, '', $publish, 0, $category);
\r
52 // metaWeblog.getCategories
\r
53 $f_metaWeblog_getCategories_sig = array(array(
\r
55 $xmlrpcStruct, // categories for blog
\r
58 $xmlrpcString, // blogid
\r
59 $xmlrpcString, // username
\r
60 $xmlrpcString, // password
\r
63 $f_metaWeblog_getCategories_doc = "Returns the categories for a given blog";
\r
64 function f_metaWeblog_getCategories($m) {
\r
65 $blogid = _getScalar($m,0);
\r
66 $username = _getScalar($m,1);
\r
67 $password = _getScalar($m,2);
\r
69 return _categoryList($blogid, $username, $password);
\r
73 // metaWeblog.getPost
\r
74 $f_metaWeblog_getPost_sig = array(array(
\r
76 $xmlrpcStruct, // the juice
\r
79 $xmlrpcString, // itemid
\r
80 $xmlrpcString, // username
\r
81 $xmlrpcString, // password
\r
84 $f_metaWeblog_getPost_doc = "Retrieves a post";
\r
85 function f_metaWeblog_getPost($m) {
\r
86 $itemid = _getScalar($m,0);
\r
87 $username = _getScalar($m,1);
\r
88 $password = _getScalar($m,2);
\r
90 return _mw_getPost($itemid, $username, $password);
\r
94 // metaWeblog.editPost
\r
95 $f_metaWeblog_editPost_sig = array(array(
\r
97 $xmlrpcBoolean, // true
\r
100 $xmlrpcString, // itemid
\r
101 $xmlrpcString, // username
\r
102 $xmlrpcString, // password
\r
103 $xmlrpcStruct, // content
\r
104 $xmlrpcBoolean, // publish boolean (set to false to create draft)
\r
107 $f_metaWeblog_editPost_doc = "Edits an item";
\r
108 function f_metaWeblog_editPost($m) {
\r
111 $itemid = _getScalar($m,0);
\r
112 $username = _getScalar($m,1);
\r
113 $password = _getScalar($m,2);
\r
116 $struct = $m->getParam(3);
\r
117 $content = _getStructVal($struct, 'description');
\r
118 $title = _getStructVal($struct, 'title');
\r
120 // category is optional (thus: be careful)!
\r
121 $catlist = $struct->structmem('categories');
\r
122 if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) {
\r
123 $category = _getArrayVal($catlist, 0);
\r
126 $publish = _getScalar($m,4);
\r
128 // get old title and extended part
\r
129 if (!$manager->existsItem($itemid,1,1))
\r
130 return _error(6,"No such item ($itemid)");
\r
131 $blogid = getBlogIDFromItemID($itemid);
\r
133 $old =& $manager->getItem($itemid,1,1);
\r
135 if ($category == '')
\r
137 // leave category unchanged when not present
\r
138 $catid = $old['catid'];
\r
142 $blog = new BLOG($blogid);
\r
143 $catid = $blog->getCategoryIdFromName($category);
\r
146 if ($old['draft'] && $publish) {
\r
153 return _edititem($itemid, $username, $password, $catid, $title, $content, $old['more'], $wasdraft, $publish, $old['closed']);
\r
157 // metaWeblog.newMediaObject
\r
158 $f_metaWeblog_newMediaObject_sig = array(array(
\r
160 $xmlrpcStruct, // "url" element
\r
163 $xmlrpcString, // blogid
\r
164 $xmlrpcString, // username
\r
165 $xmlrpcString, // password
\r
166 $xmlrpcStruct // 'name', 'type' and 'bits'
\r
168 $f_metaWeblog_newMediaObject_doc = 'Uploads a file to to the media library of the user';
\r
169 function f_metaWeblog_newMediaObject($m) {
\r
170 $blogid = _getScalar($m, 0);
\r
171 $username = _getScalar($m, 1);
\r
172 $password = _getScalar($m, 2);
\r
174 $struct = $m->getParam(3);
\r
175 $name = _getStructVal($struct, 'name');
\r
176 $type = _getStructVal($struct, 'type');
\r
177 $bits = _getStructVal($struct, 'bits');
\r
179 return _newMediaObject($blogid, $username, $password, array('name' => $name, 'type' => $type, 'bits' => $bits));
\r
182 // metaWeblog.getRecentPosts
\r
183 $f_metaWeblog_getRecentPosts_sig = array(array(
\r
185 $xmlrpcStruct, // array of structs
\r
188 $xmlrpcString, // blogid
\r
189 $xmlrpcString, // username
\r
190 $xmlrpcString, // password
\r
191 $xmlrpcInt // number of posts
\r
193 $f_metaWeblog_getRecentPosts_doc = 'Returns recent weblog items.';
\r
194 function f_metaWeblog_getRecentPosts($m) {
\r
195 $blogid = _getScalar($m, 0);
\r
196 $username = _getScalar($m, 1);
\r
197 $password = _getScalar($m, 2);
\r
198 $amount = intval(_getScalar($m, 3));
\r
200 return _getRecentItemsMetaWeblog($blogid, $username, $password, $amount);
\r
203 function _getRecentItemsMetaWeblog($blogid, $username, $password, $amount) {
\r
205 $blogid = intval($blogid);
\r
206 $amount = intval($amount);
\r
209 $mem = new MEMBER();
\r
210 if (!$mem->login($username, $password))
\r
211 return _error(1,"Could not log in");
\r
213 // 2. check if allowed
\r
214 if (!BLOG::existsID($blogid))
\r
215 return _error(2,"No such blog ($blogid)");
\r
216 if (!$mem->teamRights($blogid))
\r
217 return _error(3,"Not a team member");
\r
218 $amount = intval($amount);
\r
219 if (($amount < 1) or ($amount > 20))
\r
220 return _error(5,"Amount parameter must be in range 1..20");
\r
222 // 3. create and return list of recent items
\r
223 // Struct returned has dateCreated, userid, blogid and content
\r
225 $blog = new BLOG($blogid);
\r
227 $structarray = array(); // the array in which the structs will be stored
\r
229 $query = "SELECT mname, ibody, iauthor, ibody, inumber, ititle as title, itime, cname as category"
\r
230 .' FROM '.sql_table('item').', '.sql_table('category').', '.sql_table('member')
\r
231 ." WHERE iblog=$blogid and icat=catid and iauthor=mnumber"
\r
232 ." ORDER BY itime DESC"
\r
234 $r = sql_query($query);
\r
236 while ($row = mysql_fetch_assoc($r)) {
\r
238 // remove linebreaks if needed
\r
239 if ($blog->convertBreaks())
\r
240 $row['ibody'] = removeBreaks($row['ibody']);
\r
242 $newstruct = new xmlrpcval(array(
\r
243 "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),
\r
244 "userid" => new xmlrpcval($row['iauthor'],"string"),
\r
245 "blogid" => new xmlrpcval($blogid,"string"),
\r
246 "postid" => new xmlrpcval($row['inumber'],"string"),
\r
247 "description" => new xmlrpcval($row['ibody'],"string"),
\r
248 "title" => new xmlrpcval($row['title'],"string"),
\r
249 "categories" => new xmlrpcval(
\r
251 new xmlrpcval($row['category'], "string")
\r
256 //TODO: String link?
\r
257 //TODO: String permaLink?
\r
258 //TODO: String nucleus_more?
\r
261 array_push($structarray, $newstruct);
\r
264 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));
\r
267 function _newMediaObject($blogid, $username, $password, $info) {
\r
268 global $CONF, $DIR_MEDIA, $DIR_LIBS;
\r
271 $mem = new MEMBER();
\r
272 if (!$mem->login($username, $password))
\r
273 return _error(1,'Could not log in');
\r
275 // - check if team member
\r
276 if (!BLOG::existsID($blogid))
\r
277 return _error(2,"No such blog ($blogid)");
\r
278 if (!$mem->teamRights($blogid))
\r
279 return _error(3,'Not a team member');
\r
281 $b = new BLOG($blogid);
\r
284 $data = $info['bits']; // decoding was done transparantly by xmlrpclib
\r
286 // - check filesize
\r
287 if (strlen($data) > $CONF['MaxUploadSize'])
\r
288 return _error(9, 'filesize is too big');
\r
291 // - check if filetype is allowed (check filename)
\r
292 $filename = $info['name'];
\r
294 $allowedtypes = explode (',', $CONF['AllowedTypes']);
\r
295 foreach ( $allowedtypes as $type )
\r
296 if (eregi("\." .$type. "$",$filename)) $ok = 1;
\r
298 _error(8, 'Filetype is not allowed');
\r
300 // - add file to media library
\r
301 include_once($DIR_LIBS . 'MEDIA.php'); // media classes
\r
303 // always use private media library of member
\r
304 $collection = $mem->getID();
\r
306 // prefix filename with current date (YYYY-MM-DD-)
\r
307 // this to avoid nameclashes
\r
308 if ($CONF['MediaPrefix'])
\r
309 $filename = strftime("%Y%m%d-", time()) . $filename;
\r
311 $res = MEDIA::addMediaObjectRaw($collection, $filename, $data);
\r
313 return _error(10, $res);
\r
316 $urlstruct = new xmlrpcval(array(
\r
317 "url" => new xmlrpcval($CONF['MediaURL'] . $collection. '/' . $filename,'string')
\r
320 return new xmlrpcresp($urlstruct);
\r
323 function _categoryList($blogid, $username, $password) {
\r
325 $mem = new MEMBER();
\r
326 if (!$mem->login($username, $password))
\r
327 return _error(1,"Could not log in");
\r
329 // check if on team and blog exists
\r
330 if (!BLOG::existsID($blogid))
\r
331 return _error(2,"No such blog ($blogid)");
\r
332 if (!$mem->teamRights($blogid))
\r
333 return _error(3,"Not a team member");
\r
335 $b = new BLOG($blogid);
\r
337 $categorystruct = array();
\r
339 $query = "SELECT cname, cdesc, catid"
\r
340 . ' FROM '.sql_table('category')
\r
341 . " WHERE cblog=" . intval($blogid)
\r
342 . " ORDER BY cname";
\r
343 $r = sql_query($query);
\r
345 while ($obj = mysql_fetch_object($r)) {
\r
347 $categorystruct[$obj->cname] = new xmlrpcval(
\r
349 "description" => new xmlrpcval($obj->cdesc,"string"),
\r
350 "htmlUrl" => new xmlrpcval($b->getURL() . "?catid=" . $obj->catid ,"string"),
\r
351 "rssUrl" => new xmlrpcval("","string")
\r
357 return new xmlrpcresp(new xmlrpcval( $categorystruct , "struct"));
\r
362 function _mw_getPost($itemid, $username, $password) {
\r
366 $mem = new MEMBER();
\r
367 if (!$mem->login($username, $password))
\r
368 return _error(1,"Could not log in");
\r
370 // 2. check if allowed
\r
371 if (!$manager->existsItem($itemid,1,1))
\r
372 return _error(6,"No such item ($itemid)");
\r
373 $blogid = getBlogIDFromItemID($itemid);
\r
374 if (!$mem->teamRights($blogid))
\r
375 return _error(3,"Not a team member");
\r
377 // 3. return the item
\r
378 $item =& $manager->getItem($itemid,1,1); // (also allow drafts and future items)
\r
380 $b = new BLOG($blogid);
\r
381 if ($b->convertBreaks())
\r
382 $item['body'] = removeBreaks($item['body']);
\r
384 $categoryname = $b->getCategoryName($item['catid']);
\r
386 $newstruct = new xmlrpcval(array(
\r
387 "dateCreated" => new xmlrpcval(iso8601_encode($item['timestamp']),"dateTime.iso8601"),
\r
388 "userid" => new xmlrpcval($item['authorid'],"string"),
\r
389 "blogid" => new xmlrpcval($blogid,"string"),
\r
390 "postid" => new xmlrpcval($itemid, "string"),
\r
391 "description" => new xmlrpcval($item['body'],"string"),
\r
392 "title" => new xmlrpcval($item['title'],"string"),
\r
393 "categories" => new xmlrpcval(
\r
395 new xmlrpcval($categoryname, "string")
\r
400 //TODO: add "String link" to struct?
\r
401 //TODO: add "String permaLink" to struct?
\r
402 //TODO: add "String nucleus_more" to struct?
\r
404 return new xmlrpcresp($newstruct);
\r
408 $functionDefs = array_merge($functionDefs,
\r
410 "metaWeblog.newPost" =>
\r
412 "function" => "f_metaWeblog_newPost",
\r
413 "signature" => $f_metaWeblog_newPost_sig,
\r
414 "docstring" => $f_metaWeblog_newPost_doc
\r
417 "metaWeblog.getCategories" =>
\r
419 "function" => "f_metaWeblog_getCategories",
\r
420 "signature" => $f_metaWeblog_getCategories_sig,
\r
421 "docstring" => $f_metaWeblog_getCategories_doc
\r
424 "metaWeblog.getPost" =>
\r
426 "function" => "f_metaWeblog_getPost",
\r
427 "signature" => $f_metaWeblog_getPost_sig,
\r
428 "docstring" => $f_metaWeblog_getPost_doc
\r
431 "metaWeblog.editPost" =>
\r
433 "function" => "f_metaWeblog_editPost",
\r
434 "signature" => $f_metaWeblog_editPost_sig,
\r
435 "docstring" => $f_metaWeblog_editPost_doc
\r
438 'metaWeblog.newMediaObject' =>
\r
440 'function' => 'f_metaWeblog_newMediaObject',
\r
441 'signature' => $f_metaWeblog_newMediaObject_sig,
\r
442 'docstring' => $f_metaWeblog_newMediaObject_doc
\r
445 'metaWeblog.getRecentPosts' =>
\r
447 'function' => 'f_metaWeblog_getRecentPosts',
\r
448 'signature' => $f_metaWeblog_getRecentPosts_sig,
\r
449 'docstring' => $f_metaWeblog_getRecentPosts_doc
\r