在網路上搜尋關於初學者以PHP處理Silverlight的教學文章不多,

但就以這篇我測試後是OK的,

所以在這裡希望能用中文簡略的來重新記錄一遍.

測試環境:

  • Windows Server 2008 IIS 7.0
  • FastCGI (PHP環境)
  • PHP 5.2.14 (必須開 soap 與 xmlrpc的模組)
  • Silverlight 4 (確認你的CLIENT已經安裝好silverlight, 其實就像裝Flash Player那麼簡單)

使用的Tools:

  • Visual Studio 2010
  • Silverlight 4 tools
  • PHP IDE (都可)

使用到的檔案:

  • index.php: 顯示silverlight的頁面, 其實對silverlight不熟悉的人可以把它想成是Flash的swf檔, 就像把swf用HTML的object 包起來然後指定路徑顯示而已.
  • ageService.php: 使用者自己寫的class檔, 還有開啟SOAP的程式也會記錄在裡面
  • ClientBin/SilverlightApplication2.xap: 當你用Visual Studio 2010編輯完成後Build出來的就是一個放在ClientBin的xap檔, 事實上在PHP的環境裡, 你只要把xap上傳就可以了, 起他的xaml檔都是原始碼, 讓你日後維護修改再Build的時候可以用到.
  • ageService.wsdl: 這是根據W3C制定的一種XML格式, 內容其實就是告訴SOAP可以接受甚麼, 可以傳送甚麼, 格式是甚麼, 將會吃進甚麼CLASS. 這個檔案將會在ageService.php裡面被拿來用.

index.php內容如下:
source的部分指定了xap檔的路徑, 吃進這個檔案基本上就可以顯示Silverlight的內容了.

indexphp

ageService.php內容如下:

ageService這邊顯示了使用者自訂的Class, 以及如何使用PHP來啟動SOAP服務. 這裡的class只是使用了一個簡單的IF範例. 若使用者輸入的字串為"alfie"則回傳"7″給SILVERLIGHT程式; 若使用者輸入"catherine", 則回傳"21″給SILVERLIGHT程式. 一般來說, 這裡的CLASS大部分都是用來處理MYSQL所讀取的資料. 為了簡單示範, 這裡就不用太複雜的範例了.

ageServicephp

ageService.wsdl內容如下:

仔細看這個XML的內容可以發現他REQUEST是吃進一個STRING, 然後回復的時候是回傳一個INT,
getAge是使用者自訂Class的function, 而這篇教學的重點也是圍繞在這個getAge function.
要注意的是wsdl的內容也要指定SOAP Service的路徑, 也就是web伺服器的php位址.

wdsl

ClientBin/SilverlightApplication2.xap :

xap是由一連串步驟所形成的, 步驟如下:

1. 建立基本的silverlight介面, 可透過編輯XAML檔來達成, 內容就是簡單的Textbox與一個按鈕, 我們希望做到當使用者按下按鈕的時候會顯示使用者輸入的內容, 所以要透過event_handler來處理, 也就是在button中加入一個attribute: Click. 方法很簡單, 只要在Design頁面點兩下Button 就會跳到事件處理的頁面, 畫面如步驟2.

xaml

2. 事件處理寫法:

每個xaml底下都會有一個.cs或者.vb檔, 取決於你一開始選擇的語言(所以基本上還是要學會一點VB跟C#的寫法的), 點兩下cs檔一樣可以到達事件的處理頁面.

xamlcs

MainPage.xaml.cs: 底下紅色框框的程式當使用者按下button之後會跳出Javascript的alert視窗, 並顯示txtName的內容. 淺色紅色框框的部分是待會會繼續討論的部分這裡先帶過.

xamlcs2

接下來就把XAML等資料BUILD一次:

step1

這樣一來再ClientBin裡面就有了最新的XAP檔

step2

將這個XAP檔上傳到WEB SERVER上後, 瀏覽index.php看看

result1

Silverlight成功跑起來了!接下來我們要試試用PHP與Silverlight做溝通.

請按此看下篇


範例1:
把所有在Request.QueryString("這裡不管") 取代成 Anti_injection(Request.QueryString("這裡不管"))

尋找:

Request\.QueryString\(\"(.*)\"\)

取代:

Anti_injection(Request.QueryString("$1"))

範例2:
把所有在Request.QueryString("只處理變數名稱") 取代成 Anti_injection(Request.QueryString("只處理變數名稱"))

尋找:

Request\.QueryString\(\"([A-Za-z0-9_]+)\"\)

取代:

Anti_injection(Request.QueryString("$1"))

參考資料:
http://www.adobe.com/devnet/dreamweaver/articles/regular_expressions.html

最近因為專案需求,

需要從GMAIL中存取通訊錄 (contacts),

覺得這份教學寫的還不錯:

http://code.google.com/intl/zh-TW/apis/contacts/docs/3.0/developers_guide_protocol.html

與ATOM的溝通可以使用PHPCLASS中的ATOM builder:

http://www.phpclasses.org/package/2745-PHP-Generate-Atom-1-0-XML-feeds.html

溝通的方式可以用PHP 的Socket Programming方式去與https連接埠溝通:

認證:

https://www.google.com/accounts/ClientLogin
The POST body should contain a set of query parameters that look like parameters passed by an HTML form, using the application/x-www-form-urlencodedcontent type. These parameters are:
Parameter Description
accountType Type of account to be authenticated. The default is GOOGLE; if you want to support Google Apps users, use HOSTED_OR_GOOGLE.
Email The user's email address.
Passwd The user's password.
service The service name for contacts feeds is cp. (For other service names, see the service name list.)
source Identifies your client application. Should take the form companyName-applicationName-versionID. The examples use the name exampleCo-exampleApp-1.
For more information about the parameters, see the Authentication for Installed Applications document.