4 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
5 * Copyright (C) 2002-2011 The Nucleus Group
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 * (see nucleus/documentation/index.html#license for more info)
14 * This file contains definitions for the methods in the Movable Type API
16 * Wouter Demuynck 2003-08-31
18 * @license http://nucleuscms.org/license.txt GNU General Public License
19 * @copyright Copyright (C) 2002-2011 The Nucleus Group
21 * * $NucleusJP: api_mt.inc.php,v 1.5 2006/07/17 20:03:45 kimitake Exp $
24 // mt.supportedMethods
25 $f_mt_supportedMethods_sig = array(array(
27 $xmlrpcArray // array of strings
29 $f_mt_supportedMethods_doc = 'returns an array of supported methods';
30 function f_mt_supportedMethods($m) {
31 $res = new xmlrpcresp(new xmlrpcval(
33 new xmlrpcval('mt.supportedMethods', 'string'),
34 new xmlrpcval('mt.supportedTextFilters', 'string'),
35 new xmlrpcval('mt.publishPost', 'string'),
36 new xmlrpcval('mt.getCategoryList', 'string'),
37 new xmlrpcval('mt.getPostCategories', 'string'),
38 new xmlrpcval('mt.setPostCategories', 'string'),
39 new xmlrpcval('mt.getRecentPostTitles', 'string'),
40 new xmlrpcval('mt.getTrackbackPings','string'),
46 // mt.supportedTextFilters
47 $f_mt_supportedTextFilters_sig = array(array(
49 $xmlrpcArray // array of structs
51 $f_mt_supportedTextFilters_doc = 'returns the supported text filters';
52 function f_mt_supportedTextFilters($m) {
53 $res = new xmlrpcresp(new xmlrpcval(
55 // no text filters in nucleus
62 $f_mt_getCategoryList_sig = array(array(
64 $xmlrpcArray, // array of structs
67 $xmlrpcString, // blogid
68 $xmlrpcString, // username
69 $xmlrpcString // password
72 $f_mt_getCategoryList_doc = 'Returns a list of all categories defined in the weblog';
73 function f_mt_getCategoryList($m) {
74 $blogid = _getScalar($m,0);
75 $username = _getScalar($m,1);
76 $password = _getScalar($m,2);
78 return _mt_categoryList($blogid, $username, $password);
82 $f_mt_publishPost_sig = array(array(
84 $xmlrpcBoolean, // true
87 $xmlrpcString, // itemid
88 $xmlrpcString, // username
89 $xmlrpcString // password
91 $f_mt_publishPost_doc = 'Transfers an item from the "draft" state to the "published" state. For items that were published earlier, does nothing.';
92 function f_mt_publishPost($m) {
93 $itemid = intval(_getScalar($m, 0));
94 $username = _getScalar($m, 1);
95 $password = _getScalar($m, 2);
97 return _mt_publishPost($itemid, $username, $password);
100 // mt.getPostCategories
101 $f_mt_getPostCategories_sig = array(array(
103 $xmlrpcArray, // array of structs
105 $xmlrpcString, // itemid
106 $xmlrpcString, // username
107 $xmlrpcString // password
109 $f_mt_getPostCategories_doc = 'Returns a list of all categories to which the post is assigned.';
110 function f_mt_getPostCategories($m) {
111 $itemid = intval(_getScalar($m, 0));
112 $username = _getScalar($m, 1);
113 $password = _getScalar($m, 2);
115 return _mt_getPostCategories($itemid, $username, $password);
118 // mt.setPostCategories
119 $f_mt_setPostCategories_sig = array(array(
121 $xmlrpcBoolean, // true
123 $xmlrpcString, // itemid
124 $xmlrpcString, // username
125 $xmlrpcString, // password
126 $xmlrpcArray // categories
128 $f_mt_setPostCategories_doc = 'Sets the categories for a post. Only the primary category will be stored';
129 function f_mt_setPostCategories($m) {
130 $itemid = intval(_getScalar($m, 0));
131 $username = _getScalar($m, 1);
132 $password = _getScalar($m, 2);
134 $categories = $m->getParam(3);
135 $iSize = $categories->arraysize();
138 for ($i=0;$i<$iSize;$i++) {
139 $struct = $categories->arraymem($i);
140 $bPrimary = $struct->structmem('isPrimary');
142 $bPrimary = $bPrimary->scalarval();
144 $bPrimary = 1; // "Using isPrimary to set the primary category is optional--
145 // in the absence of this flag, the first struct in the array
146 // will be assigned the primary category for the post." (MT doc)
148 $category = $struct->structmem('categoryId');
149 $category = $category->scalarval();
154 return _mt_setPostCategories($itemid, $username, $password, $category);
157 // mt.getRecentPostTitles
158 $f_mt_getRecentPostTitles_sig = array(array(
160 $xmlrpcArray, // array of structs
162 $xmlrpcString, // blogid
163 $xmlrpcString, // userid
164 $xmlrpcString, // password,
165 $xmlrpcInt // number of posts
167 $f_mt_getRecentPostTitles_doc = 'Returns a bandwidth-friendly list of the most recent posts in the system.';
168 function f_mt_getRecentPostTitles($m) {
169 $blogid = intval(_getScalar($m, 0));
170 $username = _getScalar($m, 1);
171 $password = _getScalar($m, 2);
172 $iAmount = intval(_getScalar($m, 3));
174 return _mt_getRecentPostTitles($blogid, $username, $password, $iAmount);
177 // mt.getTrackbackPings
178 $f_mt_getTrackbackPings_sig = array(array(
180 $xmlrpcArray, // array of structs
182 $xmlrpcString // postid
184 $f_mt_getTrackbackPings_doc = '(this is currently just a placeholder. It returns an empty array.)';
185 function f_mt_getTrackbackPings($m) {
188 $itemid = intval(_getScalar($m, 0));
190 $trackbacks = array ();
191 $tbstruct = array ();
193 $manager->notify('RetrieveTrackback', array ('tb_id' => $itemid, 'trackbacks' => & $trackbacks));
195 while (list(,$v) = each ($trackbacks)) {
196 $tbstruct[] = new xmlrpcval(
198 "pingTitle" => new xmlrpcval($v['title'], "string"),
199 "pingURL" => new xmlrpcval($v['url'], "string"),
200 "pingIP" => new xmlrpcval($v['ip'], "string")
205 return new xmlrpcresp(new xmlrpcval( $tbstruct , "array"));
208 $functionDefs = array_merge($functionDefs,
210 "mt.supportedMethods" =>
211 array( "function" => "f_mt_supportedMethods",
212 "signature" => $f_mt_supportedMethods_sig,
213 "docstring" => $f_mt_supportedMethods_doc),
215 "mt.supportedTextFilters" =>
216 array( "function" => "f_mt_supportedTextFilters",
217 "signature" => $f_mt_supportedTextFilters_sig,
218 "docstring" => $f_mt_supportedTextFilters_doc),
220 "mt.getCategoryList" =>
221 array( "function" => "f_mt_getCategoryList",
222 "signature" => $f_mt_getCategoryList_sig,
223 "docstring" => $f_mt_getCategoryList_doc),
226 array( "function" => "f_mt_publishPost",
227 "signature" => $f_mt_publishPost_sig,
228 "docstring" => $f_mt_publishPost_doc),
230 "mt.getPostCategories" =>
231 array( "function" => "f_mt_getPostCategories",
232 "signature" => $f_mt_getPostCategories_sig,
233 "docstring" => $f_mt_getPostCategories_doc),
235 "mt.setPostCategories" =>
236 array( "function" => "f_mt_setPostCategories",
237 "signature" => $f_mt_setPostCategories_sig,
238 "docstring" => $f_mt_setPostCategories_doc),
240 "mt.getRecentPostTitles" =>
241 array( "function" => "f_mt_getRecentPostTitles",
242 "signature" => $f_mt_getRecentPostTitles_sig,
243 "docstring" => $f_mt_getRecentPostTitles_doc),
245 "mt.getTrackbackPings" =>
246 array( "function" => "f_mt_getTrackbackPings",
247 "signature" => $f_mt_getTrackbackPings_sig,
248 "docstring" => $f_mt_getTrackbackPings_doc)
253 function _mt_setPostCategories($itemid, $username, $password, $category) {
258 if (!$mem->login($username, $password))
259 return _error(1,"Could not log in");
261 // check if item exists
262 if (!$manager->existsItem($itemid,1,1))
263 return _error(6,"No such item ($itemid)");
265 $blogid = getBlogIDFromItemID($itemid);
266 $blog = new BLOG($blogid);
268 if (!$mem->canAlterItem($itemid))
269 return _error(7,"Not allowed to alter item");
271 $old =& $manager->getItem($itemid,1,1);
273 $catid = $blog->getCategoryIdFromName($category);
276 if ($old['draft'] && $publish) {
283 return _edititem($itemid, $username, $password, $catid, $old['title'], $old['body'], $old['more'], $wasdraft, $publish, $old['closed']);
287 function _mt_getPostCategories($itemid, $username, $password) {
292 if (!$mem->login($username, $password))
293 return _error(1,"Could not log in");
295 // check if item exists
296 if (!$manager->existsItem($itemid,1,1))
297 return _error(6,"No such item ($itemid)");
299 $blogid = getBlogIDFromItemID($itemid);
300 $blog = new BLOG($blogid);
302 if (!$mem->canAlterItem($itemid))
303 return _error(7, 'You are not allowed to request this information');
305 $info =& $manager->getItem($itemid,1,1);
306 $catName = $blog->getCategoryName($info['catid']);
308 $struct = new xmlrpcval(
310 'categoryId' => new xmlrpcval($catName, 'string'),
311 'categoryName' => new xmlrpcval($catName, 'string'),
312 'isPrimary' => new xmlrpcval(1, 'boolean')
316 return new xmlrpcresp(new xmlrpcval(array($struct), 'array'));
320 function _mt_publishPost($itemid, $username, $password) {
323 if (!$manager->existsItem($itemid,1,1))
324 return _error(6,"No such item ($itemid)");
327 $blogid = getBlogIDFromItemID($itemid);
328 $blog = new BLOG($blogid);
329 $old =& $manager->getItem($itemid,1,1);
331 return _edititem($itemid, $username, $password, $old['catid'], $old['title'], $old['body'], $old['more'], $old['draft'], 1, $old['closed']);
335 function _mt_categoryList($blogid, $username, $password) {
338 if (!$mem->login($username, $password))
339 return _error(1,"Could not log in");
341 // check if on team and blog exists
342 if (!BLOG::existsID($blogid))
343 return _error(2,"No such blog ($blogid)");
344 if (!$mem->teamRights($blogid))
345 return _error(3,"Not a team member");
347 $b = new BLOG($blogid);
349 $categorystruct = array();
351 $query = "SELECT cname, cdesc, catid"
352 . ' FROM '.sql_table('category')
353 . " WHERE cblog=" . intval($blogid)
355 $r = sql_query($query);
357 while ($obj = sql_fetch_object($r)) {
359 $categorystruct[] = new xmlrpcval(
361 "categoryName" => new xmlrpcval($obj->cname,"string"),
362 "categoryId" => new xmlrpcval($obj->cname,"string")
369 return new xmlrpcresp(new xmlrpcval( $categorystruct , "array"));
373 function _mt_getRecentPostTitles($blogid, $username, $password, $iAmount)
375 $blogid = intval($blogid);
376 $iAmount = intval($iAmount);
380 if (!$mem->login($username, $password))
381 return _error(1,"Could not log in");
383 // 2. check if allowed
384 if (!BLOG::existsID($blogid))
385 return _error(2,"No such blog ($blogid)");
386 if (!$mem->teamRights($blogid))
387 return _error(3,"Not a team member");
388 $iAmount = intval($iAmount);
390 return _error(5,"Amount parameter must be positive");
392 // 3. create and return list of recent items
393 // Struct returned has dateCreated, userid, postid and title
395 $blog = new BLOG($blogid);
397 $structarray = array(); // the array in which the structs will be stored
399 $query = "SELECT inumber, ititle as title, itime, iauthor"
400 .' FROM '.sql_table('item')
401 ." WHERE iblog=$blogid"
402 ." ORDER BY itime DESC"
404 $r = sql_query($query);
406 while ($row = sql_fetch_assoc($r)) {
408 $newstruct = new xmlrpcval(array(
409 "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),
410 "postid" => new xmlrpcval($row['inumber'],"string"),
411 "title" => new xmlrpcval($row['title'],"string"),
412 "userid" => new xmlrpcval($row['iauthor'],"string")
415 array_push($structarray, $newstruct);
418 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));