LifeType 中文開發論壇

開發 => 外掛程式精華區 => 主題作者是: AlexD 於 十月 07, 2005, 03:13:16 下午



主題: 請教如何透過 API 建立一個 Blog
作者: AlexD十月 07, 2005, 03:13:16 下午
最近想用 PLog 跟公司的系統結合在一起,  在公司的系統上, 如果使用者經過管理者允許,
就直接透過 API 在 PLog 上建立屬於他個人的 BLog

想利用 XML_RPC 來做, 就拿  /plog/xmlrpc.php  來改,
寫了一段 Code, 蠻簡單的, 只檢查admin的帳號對不對, 沒 Check 相關權限, 然後就建立
Blog 了,
    function CreateBlog($args){
        global $users,  $blogsG;;
        $username   = $args[0];
        $password   = $args[1];
        $blog = $args[2];
        $owner = $args[3];
        $about = $args[4];

        $erg = $users->getUserInfo(
            $username,
            $password
        );

        if ($erg != false)
        {
                $newBlogInfo=new BlogInfo($blog, $owner, $about, null, $id = -1 );
                $BlogID= $blogsG;->addBlog($newBlogInfo);
                if ($BlogID != -1) {
                        return sprintf( "%d", $BlogID );
                }
                else {
                        return new IXR_Error(-1001, 'Create New Blog 失敗!');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the correct password');
        }
    }


得到的錯誤訊息如下:
Fault: Code: 2 Reason 'Invalid return payload: enable debugging to examine incoming payload (XML error: junk after document element at line 2)'

想請教一下, 以上的方式正確嗎? 還是說應該利用其他的 funciton 不是$blogsG;->addBlog($newBlogInfo) 這個,
先行謝過了



主題: Re: 請教如何透過 API 建立一個 Blog
作者: markwu十月 10, 2005, 07:08:44 下午
mmm .....

你原有的系統是用 php 還是其他程式寫的,如果是 php,那麼我建議直接參考 pLog/class/action/admin/adminaddblogaction.class.php 來加入一個 blog 到 plog 中。這樣其實是比較安全的作法。

加入前,你必須先加入這個 user,你可以參考 pLog/class/action/admin/adminadduseraction.class.php。

如果你一定要用 web service,那再來討論吧,因為要改的多了,你這樣寫是不行的。
1. User 必須要是 SiteAdmin 才行, BlogOwner 是不能 create blog 的
2. NewUser/NewPassword/NewBlog 都必須要傳入 xml-rpc,你光傳入這樣參數是不夠的
3. NewUser 必須已經存在,不存在的話就要建立新的 user,已經存在就跳過。

Mark


主題: Re: 請教如何透過 API 建立一個 Blog
作者: AlexD十月 11, 2005, 10:46:28 上午
謝謝  Mark 兄的回應,  :-)
原有系統是用 .NET寫的, 所以現在想到的方式還是透過 Web Service, 剛剛發現是我程式裡面有寫錯
$BlogID= $blogsG;->addBlog($newBlogInfo); 多了一個";" 拿掉後, 現在BLog是可以新增進去了,
我再將程式裡面的參數說明一下:

$username   = $args[0];
$password   = $args[1];
//傳入的是  Site Admin 的帳號和密碼
$blog = $args[2];
// Blog 的名稱
$owner = $args[3];
//傳入的是 New User 的 ID, 之前曾經先透過另外一隻程式先建立了
$about = $args[4];
//Blog的 About

以上都是傳入字串,

再請教 Mark兄, 不知道這樣的方式建立 BLog 會不會有問題?








主題: Re: 請教如何透過 API 建立一個 Blog
作者: markwu十月 11, 2005, 11:08:43 上午
我大概知道你的想法了,所以你建立了一個 form 在你的 application,使用者只要填入他們 blogname 與 about ,就可以新建立一個自己的 Blog。
可行阿。應該是沒什麼問題。只是這樣的話要考慮的可能有:

1. New User 是否已經建立,這部分你是透過程式來 batch 建立?還是他是另一個 webservices 呢,當你新加入 user就到 pLog 也建立 user?假設是透過batch 建立。那還是可能會發生當你要建立 Blog 時, User 不存在的情形,因為會有時間差。這時候你是要透過這支程式來建立 user,還是提醒 user 等待下一次批次建立後再來建立 blog 呢?
2. Blog Name 會不會重複?還是必須檢查一下,因為兩個 User 可能會選擇同樣的 BlogName。這部分,當你使用 native url 是沒關係的。可是如果你要使用 custome url, 那就要注意了。

我原本是以為你是寫一個 xml-rpc 讓 admin 來呼叫並建立新的 username 與 blog ... 所以才會有前一篇那樣猜測。

另外, 唯一會有問題的是(你可以看一下 pLog/class/action/admin/adminaddblogaction.class.php)當他 creat 完 blog 後,還會加入一個新的分類以及一篇預設文章。你不加也沒關係,只是 user 第一次進入時會看到『沒有文章』的錯誤提示。User 不介意就好了! :-)

Mark


主題: Re: 請教如何透過 API 建立一個 Blog
作者: AlexD十月 11, 2005, 04:58:22 下午
感謝Mark 兄熱心的回應 :-),差不多就是你說的那樣

1. New User 是也是透過 Web Service 來建立, 現在是將兩個動作分開, 如果把這些環節都解決了, 會重新整理Code, 可能會將兩個動作合併成一個,
    所以從現有系統上抓出帳號密碼透過 Web Service 建立在  PLog 上面的帳號, 同時拿這個新的 UserID 來建立屬於這個新 User 的 BLog

2. Blog Name 重複和新分類和預設文章的問題我自己再找一下如何做, 有問題再提出來請教

另外, 遇到一個  Encoding 的問題, 我用底下的 command 建立 Blog, 結果 Blog名稱是亂碼
$newBlogInfo=new BlogInfo("好人一個", $owner, "that's all", null, $id = -1 );

加上 utf8_encode 也是一樣
$newBlogInfo=new BlogInfo(utf8_encode("好人一個"), $owner, "that's all", null, $id = -1 );

不知道還有個地方我沒注意到?


主題: Re: 請教如何透過 API 建立一個 Blog
作者: markwu十月 11, 2005, 05:26:08 下午
感謝Mark 兄熱心的回應 :-),差不多就是你說的那樣
2. Blog Name 重複和新分類和預設文章的問題我自己再找一下如何做, 有問題再提出來請教

另外, 遇到一個  Encoding 的問題, 我用底下的 command 建立 Blog, 結果 Blog名稱是亂碼
$newBlogInfo=new BlogInfo("好人一個", $owner, "that's all", null, $id = -1 );

加上 utf8_encode 也是一樣
$newBlogInfo=new BlogInfo(utf8_encode("好人一個"), $owner, "that's all", null, $id = -1 );

不知道還有個地方我沒注意到?

1. 有關 blogname 相同的部分,這裡我多慮了 :-S,你可以參考 /pLog/class/dao/blogs.class.php 這裡面的 addBlog,如果 add 不成會傳回 false ...
2. 有關加入新分類與文章的部分請參考 pLog/class/action/admin/adminaddblogaction.class.php ,記得要 include articlecategories.class.php 與 articles.class.php

            // add a default category and a default post
            $articleCategories = new ArticleCategories();
            $articleCategory = new ArticleCategory( "General", "", $newBlogId, true );
            $catId = $articleCategories->addArticleCategory( $articleCategory );
            $config =& Config::getConfig();
            $locale =& Locales::getLocale( $config->getValue( "default_locale" ));
            $articleTopic = $locale->tr( "register_default_article_topic" );
            $articleText  = $locale->tr( "register_default_article_text" );
            $article = new Article( $articleTopic,
                                    $articleText,
                                    Array( $catId ),
                                    $this->_ownerId,
                                    $newBlogId,
                                    POST_STATUS_PUBLISHED,
                                    0,
                                    Array(),
                                    "welcome" );
            $t = new Timestamp();
            $article->setDateObject( $t );
            $articles = new Articles();
            $articles->addArticle( $article );
3. 亂碼部分,這樣測不出來。因為如果你是寫在程式中,用

程式碼:
$newBlogInfo=new BlogInfo("好人一個", $owner, "that's all", null, $id = -1 );

去測試,通常 IDE 或是 Editor 的存檔預設編碼都是 ANSI,也就是 ISO-8859-1,中文的編碼是 Big5,所以會有問題,因為 pLog 用 UTF-8。你必須把 xml-rpc.php 存成 utf-8 without BOM 來測試才行。這是比較麻煩的地方,要不然你就要用 iconv 或是 mbstring 來把 "好人一個" 轉成 utf-8 才行。(建議用存成 utf-8 without bom 來測試比較簡單)

用 utf8_encode 是把這一個字串 "好人一個" byte by byte 轉成 utf-8 ... 這並不是把 big5 碼 轉成 utf-8 編碼。

Mark


主題: Re: 請教如何透過 API 建立一個 Blog
作者: markwu十月 12, 2005, 09:31:48 上午
1. 有關 blogname 相同的部分,這裡我多慮了 :-S,你可以參考 /pLog/class/dao/blogs.class.php 這裡面的 addBlog,如果 add 不成會傳回 false ...

這邊我可能要說明一下,pLog 是用 blog 的 mangled_name (去掉特殊字元,轉換成只有英文字母與 _ 的字串)來判斷有沒有重複,如果重複,他會自行在 mangled_name  後面加上 一個數字來區別。

而  mangled_name  也就是在使用 custom url 時的 {blogname} 這個變數的值。

程式碼:
            // check if there already is a blog with the same mangled name
            while( $this->getBlogInfoByName( $blog->getMangledBlog() ) )
            {
            $i++;
       
                // and if so, assign a new one (if we already tried with blogname+"i" we have to strip "i" before adding it again!)
                $newMangledName = ( ($i > 1) ? substr( $blog->getMangledBlog(), 0, strlen( $blog->getMangledBlog() )- strlen($i-1) ).$i : $blog->getMangledBlog().$i );    
            $blog->setMangledBlog( $newMangledName );

            }

Mark


主題: Re: 請教如何透過 API 建立一個 Blog
作者: AlexD十月 12, 2005, 11:09:38 上午
謝謝Mark 兄了, 問題大部分都解決了, 準備開始花時間好好將這些東西整理一下,

編碼的問題是 XML_RPC Client 的問題, 我 Client 端雖然是用  .NET 開發的,  不過為了方便,
也在 Apache 上面寫了一個小小的 php 的 Client 端來測試, php Client 送過去的方式就不對了,
所以我後來直接在 XML_RPC Server上先測試, 寫死在程式裡面看看, 結果出現前一個留言的問題,
後來在 php Client 裡面利用iconv 來轉換後就正常了
  xmlrpcval(iconv("BIG5", "UTF-8", $HTTP_POST_VARS["blog"]), "string")


不過 Mark 兄提到的 native url 和 custome url 是指什麼呢?



主題: Re: 請教如何透過 API 建立一個 Blog
作者: AlexD十月 12, 2005, 02:52:01 下午
Mark兄,
   再請教一個問題, 如果我要將密碼與我們自己系統同步, 所以我寫了一段 code如下:

   *************************************************************
                       $targetUser = $users->getUserInfo (
                                $username,
                                $password
                        );

                        if ($targetUser != false) {
                                $targetUser->setPassword($newpassword);
                                return true;
                        }
                        else {
                                 return new IXR_Error(-1, 'This user doesn\'t exist!');
                        }
   *************************************************************

   結果是沒任何動作, 密碼還是舊的密碼, 問題出在哪?


主題: Re: 請教如何透過 API 建立一個 Blog
作者: markwu十月 12, 2005, 10:38:20 下午
native url 和 custome url 是指什麼呢?

Native url: http://www.xxx.com/index.php?blogId=1 (一般的網址表示方式)
Custom url: http://www.xxx.com/blog/1 或是 http://www.xxx.com/blog/your_blog_name (我們常說的 Searcg Engine Friendly 的網址表現方式)

引用
                       $targetUser = $users->getUserInfo (
                                $username,
                                $password
                        );

                        if ($targetUser != false) {
                                $targetUser->setPassword($newpassword);
                                if(!$users->updateUser( $targetUser)) {
                                    return new IXR_Error(-1, 'Error when update the user password!');
                                }
                                return true;
                        }
                        else {
                                 return new IXR_Error(-1, 'This user doesn\'t exist!');
                        }

因為你只 update 了這個 instance 的 attribute,卻沒有寫回 DB。加上紅色的這部分再試試。

Mark


主題: Re: 請教如何透過 API 建立一個 Blog
作者: AlexD十月 13, 2005, 09:12:23 上午
1. Custom url 是不是也有人說是  url rewrite 機制?
2. 加了那幾行後, 無論是用新或是舊的密碼都進不去了, 所以應該是有 Update 成功, 但不知道Update 什麼東西進去了,
    需要先將密碼 encoding嗎?
3. 利用 Site Admin 的身分進去後, 無法將其他的 User 變更密碼,  有這樣的提示 "如果你想更改密碼請輸入新密碼及確認密碼;如果您不想修改密碼,留白便可。", 但是沒有[確認密碼]的欄位, 這是正常的嗎?


主題: Re: 請教如何透過 API 建立一個 Blog
作者: markwu十月 13, 2005, 09:41:48 上午
1. Custom url 是不是也有人說是  url rewrite 機制?

是!但是這是透過 Apache 的 errorDocument 與 PHP 來實做。並非透過 Apache 的 mod_rewrite。

2. 加了那幾行後, 無論是用新或是舊的密碼都進不去了, 所以應該是有 Update 成功, 但不知道Update 什麼東西進去了,
    需要先將密碼 encoding嗎?

這問題有點複雜,這關係到你的 "newpassword" 到底是什麼東西?假設在你的系統中, newpassword 是經過編碼的,例如 SHA 編碼。那麼 user 打入密碼 123456,在MSSQL 中 他其實是 sha(123456) = $apr1$qL1.....$puqMFezhOU.cyYdGKIe.T/

那麼你現在用這個 DB query 到的密碼 $apr1$qL1.....$puqMFezhOU.cyYdGKIe.T/ update 到 pLog 中,而 pLog 是採用 MD5 為密碼來編碼,所以 $userinfo->setPassword($newpassword) 後,存到 DB 的值其實是 md5($apr1$qL1.....$puqMFezhOU.cyYdGKIe.T/) = $apr1$zS1.....$6TK84yZClub8n1gp7zPk51

當 pLog 來 authenticate user 時,user 打入 123456,pLog 算出的 md5 是 $apr1$qL1.....$puqMFezhOU.hdgfuej93Y/ 與 DB 中存的 $apr1$zS1.....$6TK84yZClub8n1gp7zPk51 是不一樣的。

mm ... 所以除非你知道 user 的原始未編碼密碼,要不然是無解的。

要不然就是把 user 的密碼設定為 username123,讓他們自己改了!

3. 利用 Site Admin 的身分進去後, 無法將其他的 User 變更密碼,  有這樣的提示 "如果你想更改密碼請輸入新密碼及確認密碼;如果您不想修改密碼,留白便可。", 但是沒有[確認密碼]的欄位, 這是正常的嗎?

正常啊!因為 SiteAdmin 隨時都可以修改『任何 user』的密碼啊。

Mark


主題: Re: 請教如何透過 API 建立一個 Blog
作者: AlexD十月 13, 2005, 12:22:35 下午
1. 密碼的部份是我程式寫錯了, 修正後就正常了,
2. Site Admin 修改別人的密碼時, 不需要 Confirm 密碼是不是正確(因為沒有[確認密碼]的欄位,)
     應該是設計概念就是這樣,  改錯再改一次就好, 所以也沒什麼問題

基本上都解決了,  感謝 Mark 兄的協助了, 萬分感激!