2013-11-23 2 views
0

안녕하세요 모두 저는 QooxDoo의 초보자이며 HTML, JavaScript 및 CGI 작업 중 일부를 qx로 변환하여 배우려고합니다. 이들은 제작 응용 프로그램/페이지/양식이 아니며 아무도 사용하지 않습니다. 유일한 목적은 나를 향상시키고 즐겁게하는 것입니다.
Qooxdoo Documentation (QooxDoo와 함께 제공되는 pdf)이 내가 시도하려는 것을 설명하거나 돕기에 충분하지 않은 시점에서 나의 오래된 예제 HTML 서식 중 하나를 QX 솔루션으로 바꾼다. 커뮤니티가 예를 들어 설명의 포인터를 사용하여이 지점을 통해 나를 도울 수 있기를 바랍니다. 여기 처리를 위해 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> 

그리고 여기 형태로 처리하는 샘플 펄 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(); 
    
  • 에서 데이터 모델을 얻을

    게시물을 작성 represen 이 데이터 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(); 
    

var params = qx.util.Serializer.toUriParameter(model); 
  • 사용이 데이터 tation (I이 테스트를하지 않은, 당신은 일부 매개 변수 바이올린해야 할 수도 있습니다).

    HTH

  • +0

    예상보다 복잡한 모양입니다. 나 혼자서 해결책을 찾지 못했던 것은 당연한 일입니다. 샘플의 일부 코드는 익숙하지만 문서에서이 코드를 기억하지만 조각을 함께 사용할 수는 없습니다. 다른 작품들은 전혀 새로운 것이지만, 그들은 당연히 자명하다. 나는 이것들을 읽고 있는데, 내가 적절한 기초를 가지고 있는지 확인하기 위해. 나는 이것들을 시험해보고 내가 얼마나 멀리 있는지 볼 것이다. 그 결과에 관계없이, 나는 당신의 제안에 대단히 감사한다. 그것은 매우 귀중한 도움입니다. – Keve

    +0

    관련 문서를 연구하여 제안한 전화를 구현했습니다. "./generate.py source-all"을 실행하면 오류없이 완료되며 index.html을 열면 양식이 제대로로드되지만 제출 버튼을 클릭하면 CGI와 통신하지 않는 것 같습니다. CGI는 몇 줄의 텍스트를 인쇄하지만 브라우저 창은 내용을 변경하지 않습니다. qx 양식은 화면에 계속 표시되며 alert() 팝업이 표시됩니다. 아무리 여러 번 클릭해도 버튼을 클릭 할 수 있습니다. – Keve

    +0

    제안 사항에 따라 개선 된 JavaScript/qx 코드 부분을 나타 내기 위해 원래 게시물에 코드 업데이트를 추가했습니다. 내 질문에 여기에 의도 된 관심을 생성하지 않기 때문에이 항목을 Qooxdoo 메일 링리스트에 게시하고 있습니다. 여기서 해결책을 공유 할 것입니다. :-) 감사합니다, 토마스! – Keve

    관련 문제