OSDN Git Service

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