2013-11-23 58 views
0

晚上好, 我是QooxDoo的初學者,我試圖通過將我的一些HTML,JavaScript和CGI工作轉換成qx來學習它。這些不是生產應用/頁面/表格,沒有人使用它們,它們唯一的目的是改善和娛樂我。
在將我的一箇舊的示例HTML FORM轉換爲QX解決方案時,我得到了Qooxdoo Documentation(QooxDoo附帶的pdf)不足以解釋或幫助我嘗試去做的事情。我希望社區能通過一個例子或指示解釋來幫助我理解這一點。如何將qooxdoo表單提交給cgi腳本進行處理?

下面是示例HTML表單:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
    <title></title> 
</head> 
<body> 
    <br /> 
    <form action="webformprocess.cgi" method="POST"> 
     Town/City:<input name="fTown" size="30" /> <br /> 
     Your name:<input name="fName" size="20" value="John" /> 
      <font size="-1"><i>Yes, this field comes with a default value.</i></font><br /> 
     <br /> 
     <fieldset> 
      <legend>Pick a colour:</legend> 
      <input name="fColour" type="radio" value="red" />red<br /> 
      <input name="fColour" type="radio" value="white" />white<br /> 
      <input name="fColour" type="radio" value="green" />green<br /> 
     </fieldset> 
     <br /> 
     <fieldset> 
      <legend>What transportation do you like?</legend> 
      <input name="fTransport" type="checkbox" value="car" />car<br /> 
      <input name="fTransport" type="checkbox" value="tram" />tram<br /> 
      <input name="fTransport" type="checkbox" value="bycicle" />bycicle<br /> 
     </fieldset> 
     <br /> 
     <input type="submit" label="Mehet..." /> 
    </form> 
    <br /> 
</body> 
</html> 

這裏是示例Perl CGI腳本處理表單:

#!/usr/bin/perl 

use strict; 
use POSIX qw(strftime); 
use CGI ':standard'; 
use CGI::Carp qw(fatalsToBrowser); 

my $form_town = param('fTown'); 
unless (defined $form_town) { $form_town = 'WAS UNDEFINED'; } 

my $form_name = param('fName'); 
unless (defined $form_name) { $form_name = 'WAS UNDEFINED'; } 

my $form_colour = param('fColour'); 
unless (defined $form_colour) { $form_colour = 'WAS UNDEFINED'; } 

my $form_transport = param('fTransport'); 
unless (defined $form_transport) { $form_transport = 'WAS UNDEFINED'; } 

print "Content-type: text/html\n\n"; 
print "<pre>\n"; 
print "<p> town = $form_town .</p>\n"; 
print "<p> name = $form_name .</p>\n"; 
print "<p> colour = $form_colour .</p>\n"; 
print "<p> transport = $form_transport .</p>\n"; 
print "</pre>\n"; 

最後,這裏是多遠我將HTML表單轉換爲QooxDoo:

/** 
* This is the main application class of your custom application "urlap_qx" 
*/ 
qx.Class.define("urlap_qx.Application", 
{ 
    extend : qx.application.Standalone, 



    /* 
    ***************************************************************************** 
    MEMBERS 
    ***************************************************************************** 
    */ 

    members : 
    { 
    /** 
    * This method contains the initial application code and gets called 
    * during startup of the application 
    * 
    * @lint ignoreDeprecated(alert) 
    */ 
    main : function() 
    { 
     // Call super class 
     this.base(arguments); 

     // Enable logging in debug variant 
     if (qx.core.Environment.get("qx.debug")) 
     { 
     // support native logging capabilities, e.g. Firebug for Firefox 
     qx.log.appender.Native; 
     // support additional cross-browser console. Press F7 to toggle visibility 
     qx.log.appender.Console; 
     } 

     /* 
     ------------------------------------------------------------------------- 
     Below is your actual application code... 
     ------------------------------------------------------------------------- 
     */ 

     // Create a form named "urlap". 
     var urlap = new qx.ui.form.Form(); 

     //Basic input fields without headline. 
     var fTown = new qx.ui.form.TextField("Bristol,UK"); 
     urlap.add(fTown, "Town/City"); 

     var fName = new qx.ui.form.TextField(); 
     urlap.add(fName, "Your name"); 


     // Radio buttons. 
     urlap.addGroupHeader("Pick a colour:"); 
     var fColour1 = new qx.ui.form.RadioButton(); 
     var fColour2 = new qx.ui.form.RadioButton(); 
     var fColour3 = new qx.ui.form.RadioButton(); 
     urlap.add(fColour1, "Red"); 
     urlap.add(fColour2, "White"); 
     urlap.add(fColour3, "Green"); 
     new qx.ui.form.RadioGroup(fColour1, fColour2, fColour3); 

     // Checkboxes. 
     urlap.addGroupHeader("What transportation do you like?"); 
     var fTransport1 = new qx.ui.form.CheckBox(); 
     var fTransport2 = new qx.ui.form.CheckBox(); 
     var fTransport3 = new qx.ui.form.CheckBox(); 
     urlap.add(fTransport1, "car"); 
     urlap.add(fTransport2, "tram"); 
     urlap.add(fTransport3, "bycicle"); 

     var sendButt = new qx.ui.form.Button("Submit"); 
     sendButt.addListener("execute", function() { 
      if (urlap.validate()) { 
       alert("This is where it was supposed to send data to my CGI-script for processing..."); 
      } 
     }, this); 
     urlap.addButton(sendButt); 

     this.getRoot().add(new qx.ui.form.renderer.Single(urlap), {left: 10, top: 10}); 

    } // end_main() 
    } // end_members: 
}); // end_qx_class_define 

我的麻煩是,我無法弄清楚如何發送qx表單數據到我的perl cgi進行處理。即,從HTML表單複製<form action="webformprocess.cgi" method="POST">行的功能。我已經閱讀了關於表單驗證和序列化以及同步和異步方法和模型以及綁定的幾個小時,但是這些並不包括我正在尋找的內容。我還認爲,我正在尋找錯誤的東西,而不是將該表單提交給我的CGI腳本,這應該以完全不同的方式完成。
任何人都瞭解這個話題,請給我一個正確的方向!

更改/更新#1

var sendButt = new qx.ui.form.Button("Submit"); 
sendButt.addListener("execute", function() { 
    if (urlap.validate()) { 
     //alert("Attempting to POST the Form ..."); 
     var vezerlo = new qx.data.controller.Form(null, urlap); 
     var adatmodell = vezerlo.createModel(); 
     var parameterek = qx.util.Serializer.toUriParameter(adatmodell); 
     var igeny = new qx.io.request.Xhr("http://my.websrv.tld/folder/webformprocess.cgi"); 
     igeny.setMethod("POST"); 
     igeny.setRequestData(parameterek); 
     // Listeners to give feedback... 
     igeny.addListener("success", function() { 
      alert("Request succeeded."); 
     }, this); 
     igeny.send(); 
     alert("Send complete."); 
    } 
}, this); 
urlap.addButton(sendButt); 
+0

你或許應該寫一個東西,你實際上已經嘗試和失敗(假設你不只是閱讀它),這樣人們可以考慮這一點。 OTOH,你可以將你的示例代碼歸結爲只需一個文本字段和一個提交按鈕,就可以獲得理解問題所需的代碼。 – ThomasH

+0

採取了點。我應該確實簡化了示例代碼。事實上,我甚至只有兩個字段的基本版本,我應該用它作爲例子。另一個教訓! ;-) – Keve

+0

如果您仍在疑惑發生了什麼:您的瀏覽器可能已經阻止了跨域請求。 – sinni800

回答

1

提供的Qooxdoo很多的機制,可以處理各種方式形式的數據,因此這可能是令人困惑的。文檔沒有提供一個簡單而直接的示例,對於您的這種情況也無濟於事(我鼓勵您使用qooxdoo爲此打開bug)。

你的情況建議的方法是:

  • 爲表單

    var controller = new qx.data.controller.Form(null, urlap); 
    
  • 創建一個控制器得到控制

    var model = controller.createModel(); 
    
  • 數據模型

    獲得POST代表塔季翁此數據

    var params = qx.util.Serializer.toUriParameter(model); 
    
  • 使用這個數據與HTTP請求

    var request = new qx.io.request.Xhr("webformprocess.cgi"); 
    request.setMethod("POST"); 
    request.setRequestData(params); // maybe this could take model directly... 
    // you might want to add listeners to give feedback 
    // request.addListener("success" , ...); ... 
    request.send(); 
    

(我沒有測試過這一點,你可能有一些參數搗鼓)。

HTH

+0

看起來比我預期的更復雜。難怪我沒有找到自己的解決方案。你的示例中的一些代碼很熟悉,我從文檔中記住了這些代碼,但我無法將這些代碼放在一起。其他作品是全新的,但它們不言自明。我正在閱讀這些內容,只是爲了確保我有適當的基礎。我會測試這些,看看我得到多遠。無論結果如何,我都非常感謝您的建議。這是非常有價值的幫助。 – Keve

+0

我研究了相關文檔並實施了您建議的調用。運行「./generate.py source-all」完成沒有錯誤,打開index.html加載表單,但單擊提交按鈕似乎沒有與CGI進行通信。 CGI應該打印幾行文本,但我的瀏覽器窗口不會更改其內容。 qx表單保留在屏幕上,alert()彈出窗口顯示,沒有別的。無論點擊多少次按鈕。 – Keve

+0

向我的原始文章添加了代碼更新,以指示我根據您的建議改進了的部分JavaScript/qx代碼。 由於我的問題在這裏沒有產生預期的興趣,我將這個主題發佈在Qooxdoo郵件列表上。我會在這裏分享一個有效的解決方案(如果我得到這個)。 :-) 謝謝托馬斯! – Keve