4 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
5 * Copyright (C) 2002-2012 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-2012 The Nucleus Group
20 * @version $Id: api_mt.inc.php 1388 2009-07-18 06:31:28Z shizuki $
23 // mt.supportedMethods
24 $f_mt_supportedMethods_sig = array(array(
26 $xmlrpcArray // array of strings
28 $f_mt_supportedMethods_doc = 'returns an array of supported methods';
29 function f_mt_supportedMethods($m) {
30 $res = new xmlrpcresp(new xmlrpcval(
32 new xmlrpcval('mt.supportedMethods', 'string'),
33 new xmlrpcval('mt.supportedTextFilters', 'string'),
34 new xmlrpcval('mt.publishPost', 'string'),
35 new xmlrpcval('mt.getCategoryList', 'string'),
36 new xmlrpcval('mt.getPostCategories', 'string'),
37 new xmlrpcval('mt.setPostCategories', 'string'),
38 new xmlrpcval('mt.getRecentPostTitles', 'string'),
39 new xmlrpcval('mt.getTrackbackPings','string'),
45 // mt.supportedTextFilters
46 $f_mt_supportedTextFilters_sig = array(array(
48 $xmlrpcArray // array of structs
50 $f_mt_supportedTextFilters_doc = 'returns the supported text filters';
51 function f_mt_supportedTextFilters($m) {
52 $res = new xmlrpcresp(new xmlrpcval(
54 // no text filters in nucleus
61 $f_mt_getCategoryList_sig = array(array(
63 $xmlrpcArray, // array of structs
66 $xmlrpcString, // blogid
67 $xmlrpcString, // username
68 $xmlrpcString // password
71 $f_mt_getCategoryList_doc = 'Returns a list of all categories defined in the weblog';
72 function f_mt_getCategoryList($m) {
73 $blogid = _getScalar($m,0);
74 $username = _getScalar($m,1);
75 $password = _getScalar($m,2);
77 return _mt_categoryList($blogid, $username, $password);
81 $f_mt_publishPost_sig = array(array(
83 $xmlrpcBoolean, // true
86 $xmlrpcString, // itemid
87 $xmlrpcString, // username
88 $xmlrpcString // password
90 $f_mt_publishPost_doc = 'Transfers an item from the "draft" state to the "published" state. For items that were published earlier, does nothing.';
91 function f_mt_publishPost($m) {
92 $itemid = intval(_getScalar($m, 0));
93 $username = _getScalar($m, 1);
94 $password = _getScalar($m, 2);
96 return _mt_publishPost($itemid, $username, $password);
99 // mt.getPostCategories
100 $f_mt_getPostCategories_sig = array(array(
102 $xmlrpcArray, // array of structs
104 $xmlrpcString, // itemid
105 $xmlrpcString, // username
106 $xmlrpcString // password
108 $f_mt_getPostCategories_doc = 'Returns a list of all categories to which the post is assigned.';
109 function f_mt_getPostCategories($m) {
110 $itemid = intval(_getScalar($m, 0));
111 $username = _getScalar($m, 1);
112 $password = _getScalar($m, 2);
114 return _mt_getPostCategories($itemid, $username, $password);
117 // mt.setPostCategories
118 $f_mt_setPostCategories_sig = array(array(
120 $xmlrpcBoolean, // true
122 $xmlrpcString, // itemid
123 $xmlrpcString, // username
124 $xmlrpcString, // password
125 $xmlrpcArray // categories
127 $f_mt_setPostCategories_doc = 'Sets the categories for a post. Only the primary category will be stored';
128 function f_mt_setPostCategories($m) {
129 $itemid = intval(_getScalar($m, 0));
130 $username = _getScalar($m, 1);
131 $password = _getScalar($m, 2);
133 $categories = $m->getParam(3);
134 $iSize = $categories->arraysize();
137 for ($i=0;$i<$iSize;$i++) {
138 $struct = $categories->arraymem($i);
139 $bPrimary = $struct->structmem('isPrimary');
141 $bPrimary = $bPrimary->scalarval();
143 $bPrimary = 1; // "Using isPrimary to set the primary category is optional--
144 // in the absence of this flag, the first struct in the array
145 // will be assigned the primary category for the post." (MT doc)
147 $category = $struct->structmem('categoryId');
148 $category = $category->scalarval();
153 return _mt_setPostCategories($itemid, $username, $password, $category);
156 // mt.getRecentPostTitles
157 $f_mt_getRecentPostTitles_sig = array(array(
159 $xmlrpcArray, // array of structs
161 $xmlrpcString, // blogid
162 $xmlrpcString, // userid
163 $xmlrpcString, // password,
164 $xmlrpcInt // number of posts
166 $f_mt_getRecentPostTitles_doc = 'Returns a bandwidth-friendly list of the most recent posts in the system.';
167 function f_mt_getRecentPostTitles($m) {
168 $blogid = intval(_getScalar($m, 0));
169 $username = _getScalar($m, 1);
170 $password = _getScalar($m, 2);
171 $iAmount = intval(_getScalar($m, 3));
173 return _mt_getRecentPostTitles($blogid, $username, $password, $iAmount);
176 // mt.getTrackbackPings
177 $f_mt_getTrackbackPings_sig = array(array(
179 $xmlrpcArray, // array of structs
181 $xmlrpcString // postid
183 $f_mt_getTrackbackPings_doc = '(this is currently just a placeholder. It returns an empty array.)';
184 function f_mt_getTrackbackPings($m) {
187 $itemid = intval(_getScalar($m, 0));
189 $trackbacks = array ();
190 $tbstruct = array ();
192 $manager->notify('RetrieveTrackback', array ('tb_id' => $itemid, 'trackbacks' => & $trackbacks));
194 while (list(,$v) = each ($trackbacks)) {
195 $tbstruct[] = new xmlrpcval(
197 "pingTitle" => new xmlrpcval($v['title'], "string"),
198 "pingURL" => new xmlrpcval($v['url'], "string"),
199 "pingIP" => new xmlrpcval($v['ip'], "string")
204 return new xmlrpcresp(new xmlrpcval( $tbstruct , "array"));
207 $functionDefs = array_merge($functionDefs,
209 "mt.supportedMethods" =>
210 array( "function" => "f_mt_supportedMethods",
211 "signature" => $f_mt_supportedMethods_sig,
212 "docstring" => $f_mt_supportedMethods_doc),
214 "mt.supportedTextFilters" =>
215 array( "function" => "f_mt_supportedTextFilters",
216 "signature" => $f_mt_supportedTextFilters_sig,
217 "docstring" => $f_mt_supportedTextFilters_doc),
219 "mt.getCategoryList" =>
220 array( "function" => "f_mt_getCategoryList",
221 "signature" => $f_mt_getCategoryList_sig,
222 "docstring" => $f_mt_getCategoryList_doc),
225 array( "function" => "f_mt_publishPost",
226 "signature" => $f_mt_publishPost_sig,
227 "docstring" => $f_mt_publishPost_doc),
229 "mt.getPostCategories" =>
230 array( "function" => "f_mt_getPostCategories",
231 "signature" => $f_mt_getPostCategories_sig,
232 "docstring" => $f_mt_getPostCategories_doc),
234 "mt.setPostCategories" =>
235 array( "function" => "f_mt_setPostCategories",
236 "signature" => $f_mt_setPostCategories_sig,
237 "docstring" => $f_mt_setPostCategories_doc),
239 "mt.getRecentPostTitles" =>
240 array( "function" => "f_mt_getRecentPostTitles",
241 "signature" => $f_mt_getRecentPostTitles_sig,
242 "docstring" => $f_mt_getRecentPostTitles_doc),
244 "mt.getTrackbackPings" =>
245 array( "function" => "f_mt_getTrackbackPings",
246 "signature" => $f_mt_getTrackbackPings_sig,
247 "docstring" => $f_mt_getTrackbackPings_doc)
252 function _mt_setPostCategories($itemid, $username, $password, $category) {
257 if (!$mem->login($username, $password))
258 return _error(1,"Could not log in");
260 // check if item exists
261 if (!$manager->existsItem($itemid,1,1))
262 return _error(6,"No such item ($itemid)");
264 $blogid = getBlogIDFromItemID($itemid);
265 $blog =& $manager->getBlog($blogid);
267 if (!$mem->canAlterItem($itemid))
268 return _error(7,"Not allowed to alter item");
270 $old =& $manager->getItem($itemid,1,1);
272 $catid = $blog->getCategoryIdFromName($category);
275 if ($old['draft'] && $publish) {
282 return _edititem($itemid, $username, $password, $catid, $old['title'], $old['body'], $old['more'], $wasdraft, $publish, $old['closed']);
286 function _mt_getPostCategories($itemid, $username, $password) {
291 if (!$mem->login($username, $password))
292 return _error(1,"Could not log in");
294 // check if item exists
295 if (!$manager->existsItem($itemid,1,1))
296 return _error(6,"No such item ($itemid)");
298 $blogid = getBlogIDFromItemID($itemid);
299 $blog =& $manager->getBlog($blogid);
301 if (!$mem->canAlterItem($itemid))
302 return _error(7, 'You are not allowed to request this information');
304 $info =& $manager->getItem($itemid,1,1);
305 $catName = $blog->getCategoryName($info['catid']);
307 $struct = new xmlrpcval(
309 'categoryId' => new xmlrpcval($catName, 'string'),
310 'categoryName' => new xmlrpcval($catName, 'string'),
311 'isPrimary' => new xmlrpcval(1, 'boolean')
315 return new xmlrpcresp(new xmlrpcval(array($struct), 'array'));
319 function _mt_publishPost($itemid, $username, $password) {
322 if (!$manager->existsItem($itemid,1,1))
323 return _error(6,"No such item ($itemid)");
326 $blogid = getBlogIDFromItemID($itemid);
327 $blog =& $manager->getBlog($blogid);
328 $old =& $manager->getItem($itemid,1,1);
330 return _edititem($itemid, $username, $password, $old['catid'], $old['title'], $old['body'], $old['more'], $old['draft'], 1, $old['closed']);
334 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 =& $manager->getBlog($blogid);
349 $categorystruct = array();
351 $query = "SELECT cname, cdesc, catid"
352 . ' FROM '.sql_table('category')
353 . " WHERE cblog=" . intval($blogid)
355 $r = DB::getResult($query);
357 foreach ( $r as $row ) {
359 $categorystruct[] = new xmlrpcval(
361 "categoryName" => new xmlrpcval($row['cname'],"string"),
362 "categoryId" => new xmlrpcval($row['cname'],"string")
369 return new xmlrpcresp(new xmlrpcval( $categorystruct , "array"));
373 function _mt_getRecentPostTitles($blogid, $username, $password, $iAmount)
377 $blogid = intval($blogid);
378 $iAmount = intval($iAmount);
382 if (!$mem->login($username, $password))
383 return _error(1,"Could not log in");
385 // 2. check if allowed
386 if (!Blog::existsID($blogid))
387 return _error(2,"No such blog ($blogid)");
388 if (!$mem->teamRights($blogid))
389 return _error(3,"Not a team member");
390 $iAmount = intval($iAmount);
392 return _error(5,"Amount parameter must be positive");
394 // 3. create and return list of recent items
395 // Struct returned has dateCreated, userid, postid and title
397 $blog =& $manager->getBlog($blogid);
399 $structarray = array(); // the array in which the structs will be stored
401 $query = "SELECT inumber, ititle as title, itime, iauthor"
402 .' FROM '.sql_table('item')
403 ." WHERE iblog=$blogid"
404 ." ORDER BY itime DESC"
406 $r = DB::getResult($query);
408 foreach ( $r as $row ) {
410 $newstruct = new xmlrpcval(array(
411 "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),
412 "postid" => new xmlrpcval($row['inumber'],"string"),
413 "title" => new xmlrpcval($row['title'],"string"),
414 "userid" => new xmlrpcval($row['iauthor'],"string")
417 array_push($structarray, $newstruct);
420 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));