OSDN Git Service

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/nucleus-jp/trunk@1211 1ca29...
[nucleus-jp/nucleus-jp-ancient.git] / master / nucleus / xmlrpc / api_mt.inc.php
1 <?php
2
3 /*
4  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
5  * Copyright (C) 2002-2011 The Nucleus Group
6  *
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)
12  */
13 /**
14  * This file contains definitions for the methods in the Movable Type API
15  *
16  * Wouter Demuynck 2003-08-31
17  *
18  * @license http://nucleuscms.org/license.txt GNU General Public License
19  * @copyright Copyright (C) 2002-2011 The Nucleus Group
20  * @version $Id$
21  *  * $NucleusJP: api_mt.inc.php,v 1.5 2006/07/17 20:03:45 kimitake Exp $
22  */
23
24         // mt.supportedMethods
25         $f_mt_supportedMethods_sig = array(array(
26                         // return type
27                         $xmlrpcArray // array of strings
28                 ));
29         $f_mt_supportedMethods_doc = 'returns an array of supported methods';
30         function f_mt_supportedMethods($m) {
31                 $res = new xmlrpcresp(new xmlrpcval(
32                         array(
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'),
41                         ), 'array')
42                 );
43                 return $res;
44         }
45
46         // mt.supportedTextFilters
47         $f_mt_supportedTextFilters_sig = array(array(
48                         // return type
49                         $xmlrpcArray    // array of structs
50                 ));
51         $f_mt_supportedTextFilters_doc = 'returns the supported text filters';
52         function f_mt_supportedTextFilters($m) {
53                 $res = new xmlrpcresp(new xmlrpcval(
54                         array(
55                                 // no text filters in nucleus
56                         ), 'array')
57                 );
58                 return $res;
59         }
60
61         // mt.getCategoryList
62         $f_mt_getCategoryList_sig = array(array(
63                         // return type
64                         $xmlrpcArray,           // array of structs
65
66                         // params
67                         $xmlrpcString,          // blogid
68                         $xmlrpcString,          // username
69                         $xmlrpcString           // password
70
71                 ));
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);
77
78                 return _mt_categoryList($blogid, $username, $password);
79         }
80
81         // mt.publishPost
82         $f_mt_publishPost_sig = array(array(
83                         // return type
84                         $xmlrpcBoolean,         // true
85
86                         // params
87                         $xmlrpcString,          // itemid
88                         $xmlrpcString,          // username
89                         $xmlrpcString           // password
90                 ));
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);
96
97                 return _mt_publishPost($itemid, $username, $password);
98         }
99
100         // mt.getPostCategories
101         $f_mt_getPostCategories_sig = array(array(
102                 // return
103                 $xmlrpcArray,           // array of structs
104                 // parameters
105                 $xmlrpcString,          // itemid
106                 $xmlrpcString,          // username
107                 $xmlrpcString           // password
108         ));
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);
114
115                 return _mt_getPostCategories($itemid, $username, $password);
116         }
117
118         // mt.setPostCategories
119         $f_mt_setPostCategories_sig = array(array(
120                 // return
121                 $xmlrpcBoolean,         // true
122                 // parameters
123                 $xmlrpcString,          // itemid
124                 $xmlrpcString,          // username
125                 $xmlrpcString,          // password
126                 $xmlrpcArray            // categories
127         ));
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);
133
134                 $categories = $m->getParam(3);
135                 $iSize = $categories->arraysize();
136
137                 $category = '';
138                 for ($i=0;$i<$iSize;$i++) {
139                         $struct = $categories->arraymem($i);
140                         $bPrimary = $struct->structmem('isPrimary');
141                         if ($bPrimary)
142                                 $bPrimary = $bPrimary->scalarval();
143                         else if (!$category)
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)
147                         if ($bPrimary) {
148                                 $category = $struct->structmem('categoryId');
149                                 $category = $category->scalarval();
150                         }
151
152                 }
153
154                 return _mt_setPostCategories($itemid, $username, $password, $category);
155         }
156
157         // mt.getRecentPostTitles
158         $f_mt_getRecentPostTitles_sig = array(array(
159                 // return
160                 $xmlrpcArray,           // array of structs
161                 // params
162                 $xmlrpcString,          // blogid
163                 $xmlrpcString,          // userid
164                 $xmlrpcString,          // password,
165                 $xmlrpcInt                      // number of posts
166         ));
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));
173
174                 return _mt_getRecentPostTitles($blogid, $username, $password, $iAmount);
175         }
176
177         // mt.getTrackbackPings
178         $f_mt_getTrackbackPings_sig = array(array(
179                 // return
180                 $xmlrpcArray,           // array of structs
181                 // params
182                 $xmlrpcString           // postid
183         ));
184         $f_mt_getTrackbackPings_doc = '(this is currently just a placeholder. It returns an empty array.)';
185         function f_mt_getTrackbackPings($m) {
186                 global $manager;
187                 
188                 $itemid = intval(_getScalar($m, 0));
189
190                 $trackbacks = array ();
191                 $tbstruct   = array ();
192                         
193                 $manager->notify('RetrieveTrackback', array ('tb_id' => $itemid, 'trackbacks' => & $trackbacks));
194                                 
195                 while (list(,$v) = each ($trackbacks)) {
196                         $tbstruct[] = new xmlrpcval(
197                                 array(
198                                         "pingTitle" => new xmlrpcval($v['title'], "string"),
199                                         "pingURL"   => new xmlrpcval($v['url'], "string"),
200                                         "pingIP"    => new xmlrpcval($v['ip'], "string")
201                                 )
202                         ,'struct');                     
203                 }               
204                                 
205                 return new xmlrpcresp(new xmlrpcval( $tbstruct , "array"));
206         }
207
208         $functionDefs = array_merge($functionDefs,
209                 array(
210                          "mt.supportedMethods" =>
211                          array( "function" => "f_mt_supportedMethods",
212                                 "signature" => $f_mt_supportedMethods_sig,
213                                 "docstring" => $f_mt_supportedMethods_doc),
214
215                          "mt.supportedTextFilters" =>
216                          array( "function" => "f_mt_supportedTextFilters",
217                                 "signature" => $f_mt_supportedTextFilters_sig,
218                                 "docstring" => $f_mt_supportedTextFilters_doc),
219
220                          "mt.getCategoryList" =>
221                          array( "function" => "f_mt_getCategoryList",
222                                 "signature" => $f_mt_getCategoryList_sig,
223                                 "docstring" => $f_mt_getCategoryList_doc),
224
225                          "mt.publishPost" =>
226                          array( "function" => "f_mt_publishPost",
227                                 "signature" => $f_mt_publishPost_sig,
228                                 "docstring" => $f_mt_publishPost_doc),
229
230                          "mt.getPostCategories" =>
231                          array( "function" => "f_mt_getPostCategories",
232                                 "signature" => $f_mt_getPostCategories_sig,
233                                 "docstring" => $f_mt_getPostCategories_doc),
234
235                          "mt.setPostCategories" =>
236                          array( "function" => "f_mt_setPostCategories",
237                                 "signature" => $f_mt_setPostCategories_sig,
238                                 "docstring" => $f_mt_setPostCategories_doc),
239
240                          "mt.getRecentPostTitles" =>
241                          array( "function" => "f_mt_getRecentPostTitles",
242                                 "signature" => $f_mt_getRecentPostTitles_sig,
243                                 "docstring" => $f_mt_getRecentPostTitles_doc),
244
245                          "mt.getTrackbackPings" =>
246                          array( "function" => "f_mt_getTrackbackPings",
247                                 "signature" => $f_mt_getTrackbackPings_sig,
248                                 "docstring" => $f_mt_getTrackbackPings_doc)
249
250                 )
251         );
252
253         function _mt_setPostCategories($itemid, $username, $password, $category) {
254                 global $manager;
255
256                 // login
257                 $mem = new MEMBER();
258                 if (!$mem->login($username, $password))
259                         return _error(1,"Could not log in");
260
261                 // check if item exists
262                 if (!$manager->existsItem($itemid,1,1))
263                         return _error(6,"No such item ($itemid)");
264
265                 $blogid = getBlogIDFromItemID($itemid);
266                 $blog = new BLOG($blogid);
267
268                 if (!$mem->canAlterItem($itemid))
269                         return _error(7,"Not allowed to alter item");
270
271                 $old =& $manager->getItem($itemid,1,1);
272
273                 $catid = $blog->getCategoryIdFromName($category);
274
275                 $publish = 0;
276                 if ($old['draft'] && $publish) {
277                         $wasdraft = 1;
278                         $publish = 1;
279                 } else {
280                         $wasdraft = 0;
281                 }
282
283                 return _edititem($itemid, $username, $password, $catid, $old['title'], $old['body'], $old['more'], $wasdraft, $publish, $old['closed']);
284         }
285
286
287         function _mt_getPostCategories($itemid, $username, $password) {
288                 global $manager;
289
290                 // login
291                 $mem = new MEMBER();
292                 if (!$mem->login($username, $password))
293                         return _error(1,"Could not log in");
294
295                 // check if item exists
296                 if (!$manager->existsItem($itemid,1,1))
297                         return _error(6,"No such item ($itemid)");
298
299                 $blogid = getBlogIDFromItemID($itemid);
300                 $blog = new BLOG($blogid);
301
302                 if (!$mem->canAlterItem($itemid))
303                         return _error(7, 'You are not allowed to request this information');
304
305                 $info =& $manager->getItem($itemid,1,1);
306                 $catName = $blog->getCategoryName($info['catid']);
307
308                 $struct = new xmlrpcval(
309                         array(
310                                 'categoryId' => new xmlrpcval($catName, 'string'),
311                                 'categoryName' => new xmlrpcval($catName, 'string'),
312                                 'isPrimary'     => new xmlrpcval(1, 'boolean')
313                         ), 'struct'
314                 );
315
316                 return new xmlrpcresp(new xmlrpcval(array($struct), 'array'));
317
318         }
319
320         function _mt_publishPost($itemid, $username, $password) {
321                 global $manager;
322
323                 if (!$manager->existsItem($itemid,1,1))
324                         return _error(6,"No such item ($itemid)");
325
326                 // get item data
327                 $blogid = getBlogIDFromItemID($itemid);
328                 $blog = new BLOG($blogid);
329                 $old =& $manager->getItem($itemid,1,1);
330
331                 return _edititem($itemid, $username, $password, $old['catid'], $old['title'], $old['body'], $old['more'], $old['draft'], 1, $old['closed']);
332         }
333
334
335         function _mt_categoryList($blogid, $username, $password) {
336                 // 1. login
337                 $mem = new MEMBER();
338                 if (!$mem->login($username, $password))
339                         return _error(1,"Could not log in");
340
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");
346
347                 $b = new BLOG($blogid);
348
349                 $categorystruct = array();
350
351                 $query =  "SELECT cname, cdesc, catid"
352                                 . ' FROM '.sql_table('category')
353                                 . " WHERE cblog=" . intval($blogid)
354                                 . " ORDER BY cname";
355                 $r = sql_query($query);
356
357                 while ($obj = sql_fetch_object($r)) {
358
359                         $categorystruct[] = new xmlrpcval(
360                                 array(
361                                         "categoryName" => new xmlrpcval($obj->cname,"string"),
362                                         "categoryId" => new xmlrpcval($obj->cname,"string")
363                                 )
364                         ,'struct');
365
366                 }
367
368
369                 return new xmlrpcresp(new xmlrpcval( $categorystruct , "array"));
370
371         }
372
373         function _mt_getRecentPostTitles($blogid, $username, $password, $iAmount)
374         {
375                 $blogid = intval($blogid);
376                 $iAmount = intval($iAmount);
377
378                 // 1. login
379                 $mem = new MEMBER();
380                 if (!$mem->login($username, $password))
381                         return _error(1,"Could not log in");
382
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);
389                 if ($iAmount < 1)
390                         return _error(5,"Amount parameter must be positive");
391
392                 // 3. create and return list of recent items
393                 // Struct returned has dateCreated, userid, postid and title
394
395                 $blog = new BLOG($blogid);
396
397                 $structarray = array();         // the array in which the structs will be stored
398
399                 $query = "SELECT inumber, ititle as title, itime, iauthor"
400                            .' FROM '.sql_table('item')
401                            ." WHERE iblog=$blogid"
402                            ." ORDER BY itime DESC"
403                            ." LIMIT $iAmount";
404                 $r = sql_query($query);
405
406                 while ($row = sql_fetch_assoc($r)) {
407
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")
413                         ),'struct');
414
415                         array_push($structarray, $newstruct);
416                 }
417
418                 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));
419
420         }
421
422
423
424 ?>