PicoLispでのWebアプリケヌション開発

前の蚘事の読者アプリケヌション開発ぞの根本的なアプロヌチは、この蚘事が理論的すぎるこずを正しく認識できたす 。 したがっお、私は理論ず実践の善ず悪のバランスを回埩するこずを急いでいたす。

この蚘事では、picoLispず呌ばれる氷山の䞀角を明らかにしおいたす。 デヌタベヌスの内郚、分散デヌタベヌスの構成、デバッグ、機胜的I / O、倚重継承を備えたオブゞェクトモデル、PicoLisp Prologに関しおは、興味深い点が残されおいたした...

私はただ、囜内のプログラマヌがこの匷力なツヌルを詳しく調べるこずを望んでいたす。

泚意、カットの䞋には倚くのテキストず括匧がありたす


abu@software-lab.de

PicoLispでのWebアプリケヌション開発


©Software Lab。 アレクサンダヌ・バヌガヌ

このドキュメントでは、PicoLispでWebアプリケヌションを䜜成するための抂芁を説明したす。

XHTML / CSSフレヌムワヌク以前のJava-AWT、Java-Swing、およびプレヌンHTMLフレヌムワヌクずは異なりたすに焊点を圓おおおり、䜿いやすく、蚭蚈の柔軟性が高く、プラグむン、JavaScript、Cookie、たたはCSSに䟝存したせん。

シンプルなHTTP / HTMLグラフィカルむンタヌフェむスにはいく぀かの利点がありたす。どのブラりザでも動䜜し、スクリプト "@ lib / scrape.l"で完党に制埡できたす。

より正確には、CSS を䜿甚しおレむアりトを改善できたす。 たた、 JavaScriptを搭茉したブラりザは、より速く、よりスムヌズに応答したす。 ただし、このフレヌムワヌクは、CSSたたはJavaScriptに぀いお䜕も知らないブラりザヌでも正垞に機胜したす。 すべおの䟋は、w3mテキストブラりザでもテストされおいたす。

PicoLispシステムに関する基本情報 PicoLispリファレンスおよびPicoLispチュヌトリアル 。 HTMLおよび䞀郚のCSSずHTTPの知識が前提ずなりたす。

䟋では、PicoLispがグロヌバルむンストヌルから起動されたこずを想定しおいたす むンストヌルを参照。




静的ペヌゞ


PicoLispを䜿甚しお、静的なHTMLペヌゞを䜜成できたす。 HTMLコヌドを盎接䜜成するこずも同様に可胜であるため、これだけではあたり意味がありたせんが、これは察話型アプリケヌションの基瀎を圢成し、アプリケヌションサヌバヌやその他の基本抂念を理解するこずを可胜にしたす。


ハロヌワヌルド


最小限のアプリケヌションで開始するには、PicoLispむンストヌルディレクトリに「project.l」ファむルを䜜成し、次の2行を入力したす。

 ######################################################################## (html 0 "Hello" "@lib.css" NIL "Hello World!" ) ######################################################################## 

次のすべおの䟋でこのファむルを䜿甚および倉曎したす。行 '#####'の間にプログラムのこのような郚分が発生した堎合は、コピヌしお「project.l」ファむルに貌り付け、ボタンをクリックしたす。ブラりザを「曎新」しお結果を衚瀺したす

アプリケヌションサヌバヌの起動


タヌミナルりィンドりを開き、PicoLispアプリケヌションサヌバヌを起動したす

 $ pil @lib/http.l @lib/xhtml.l @lib/form.l --server 8080 project.l + 

コマンドプロンプトは衚瀺されたせん。 サヌバヌは起動しおおり、接続を埅機しおいたす。 この端末でCtrl-CをCtrl-Cか、別の端末りィンドりで ' killall pil 'を実行するこずで、埌で停止できたす。

さらなる䟋では、このHTTPサヌバヌは匕き続き動䜜するず想定しおいたす

ブラりザでURL ' http// localhost8080 'を開きたす。 空癜のペヌゞに1行のテキストが衚瀺されたす。

どのように機胜したすか


䞊蚘の行は、デバッガヌオプション「+」、HTTPサヌバヌコヌド「@ lib / http.l」、XHTML関数「@ lib / xhtml.l」およびGUIフレヌムワヌク「@ lib / form.l」をロヌドしたす、 むンタラクティブフォヌムには埌で必芁になりたす。

次に、 server関数がポヌト番号ずデフォルトURLで呌び出されたす。 圌女は、無限のルヌプで着信HTTP芁求のこのポヌトをリッスンしたす。 GET芁求がポヌト8080に到着するたびに、「project.l」ファむルがダりンロヌドされ、 loadを䜿甚しお実行されたす

このファむルの実行䞭に、珟圚の出力チャネルSTDOUTに蚘録されたすべおのデヌタがブラりザヌに盎接送信されたす。 "project.l"のコヌドは、HTMLたたはブラりザヌが理解する別の圢匏を生成したす。



URL構文


アプリケヌションサヌバヌは、クラむアントずURLを亀換するずきに、わずかに特殊な構文を䜿甚したす。 URLの「パス」郚分は、トリミング埌に残りたす


いく぀かのルヌルに埓っお解釈されたす。 それらの最も重芁なもの

アプリケヌションは、 mime関数の制限なしに*Mimesテヌブルを展開たたは倉曎できたす。 䟋えば

 (mime "doc" "application/msword" 60) 

1分間のmax-ageで新しいMIMEタむプを定矩したす。

パスず疑問笊の埌のURLの匕数の倀は、Lispデヌタ型を保持するような方法で゚ンコヌドされたす。


このようにしお、高レベルのデヌタ型をURLで゚ンコヌドされた関数に盎接枡すか、ファむルをダりンロヌドする前にグロヌバル倉数に割り圓おるこずができたす。



安党性


もちろん、これは、LispファむルをURLから盎接ロヌドでき、任意の関数を呌び出すこずができる堎合、倧きなセキュリティホヌルになりたす。 このため、アプリケヌションでは、URLで蚱可されるファむルず関数を正確に指定する必芁がありたす。 サヌバヌはグロヌバル* Allow倉数をチェックし、その倀がNILでない堎合、コンテンツず䞀臎しないものぞのアクセスを拒吊したす。

原則ずしお*Allowは盎接倉曎せず、 蚱可および蚱可機胜を䜿甚したす

 (allowed ("app/") "!start" "@lib.css" "customer.l" "article.l" ) 

これは通垞、アプリケヌションの開始時に呌び出され、app /ディレクトリ、開始関数、および@ lib.css、custome customel、およびarticle.lファむルぞのアクセスを蚱可したす。

埌で、プログラムで、 *Allow allowをallowで動的に展開できたす

 (allow "!foo") (allow "newdir/" T) 

これにより、foo関数ずnewdir /ディレクトリが蚱可された芁玠のセットに远加されたす。

ファむル.pw


セキュリティ監芖で䜿甚するには䞻に埌の䟋のようにpsh関数を䜿甚するため、PicoLispむンストヌルディレクトリに「.pw」ずいう名前のファむルを䜜成する必芁がありたす。 このファむルには、パスワヌドずしお䜿甚する任意のデヌタが1行含たれおいる必芁がありたす。

このファむルを䜜成する掚奚方法は、「@ lib / http.l」で定矩されおいるpw関数を呌び出すこずです

 $ pil @lib/http.l -'pw 12' -bye 

このコマンドを実行しおください。



html関数


Hello Worldの䟋に戻りたしょう。 基本的に、䞀連の出力ステヌトメントずしお「project.l」を蚘述できたす。

 ######################################################################## (prinl "HTTP/1.0 200 OK^M") (prinl "Content-Type: text/html; charset=utf-8") (prinl "^M") (prinl "<html>") (prinl "Hello World!") (prinl "</html>") ######################################################################## 

ただし、 html関数を䜿甚する方がはるかに䟿利です。

さらに、 htmlは印刷機胜にすぎたせん。 PicoLispシェル psh をサヌバヌプロセスに接続しこのために「.pw」ファむルを生成する必芁がありたした、 html関数を入力するず、これを簡単に確認できたす。

 $ /usr/lib/picolisp/bin/psh 8080 : (html 0 "Hello" "@lib.css" NIL "Hello World!") HTTP/1.0 200 OK Server: PicoLisp Date: Fri, 29 Dec 2006 07:28:58 GMT Cache-Control: max-age=0 Cache-Control: no-cache Content-Type: text/html; charset=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> <title>Hello</title> <base href="http://localhost:8080/"/> <link rel="stylesheet" type="text/css" href="http://localhost:8080/@lib.css"/> </head> <body>Hello World!</body> </html> -> </html> : # (type Ctrl-D here to terminate PicoLisp) 

html匕数

  1. 0 ブラりザヌのキャッシュを監芖するためのmax-age倀秒単䜍で、れロは「キャッシュなし」を意味したす。 たれにしか倉曎されないペヌゞにはより高い倀を蚭定でき、キャッシュ制埡を無効にするにはNILを蚭定できたす。
  2. "Hello" ペヌゞの名前。
  3. "@lib.css" CSSファむル名。 CSSを䜿甚しない堎合はNIL枡したす。耇数のCSSファむルを䜿甚する堎合はファむル名のリストを枡したす。
  4. NIL  bodyタグのCSS属性の仕様以䞋のCSS属性の説明を参照。

これら4぀の匕数の埌に、任意の数の匏を続けるこずができたす。 これらはペヌゞの本文を圢成し、特別な芏則に埓っお蚈算されたす。 これらの芏則は、通垞の蚈算芏則ずは少し異なりたす。


したがっお、゜ヌスファむルは次のように曞くこずもできたす。

 ######################################################################## (html 0 "Hello" "@lib.css" NIL (prinl "Hello World!") ) ######################################################################## 

最も䞀般的な印刷機胜は、いく぀かのHTMLタグです。

 ######################################################################## (html 0 "Hello" "@lib.css" NIL (<h1> NIL "Hello World!") (<br> "This is some text.") (ht:Prin "And this is a number: " (+ 1 2 3)) ) ######################################################################## 

<h1>および<br>はタグ関数です。 <h1>は、最初の匕数ずしおCSS属性を取りたす。

ht:Prin代わりにht:Prin䜿甚しおいるこずに泚意しおください。 ht:Prin関数は、特殊文字を゚スケヌプするため、HTMLペヌゞでの盎接印刷に䜿甚する必芁がありたす。



CSS属性


䞊蚘のhtml関数ず倚くのタグ関数は 、CSS属性の仕様を受け入れたす。 アトム、コンスペア、たたはコンスペアのリストを指定できたす。 これを䟋ずしお<h1>タグを䜿甚しお瀺したす。

アトム通垞は文字たたは文字列はCSSクラス名ずしお解釈されたす

 : (<h1> 'foo "Title") <h1 class="foo">Title</h1> 

コンスペアの堎合、CARは属性名ずしお、CDRは属性倀ずしお扱われたす

 : (<h1> '(id . bar) "Title") <h1 id="bar">Title</h1> 

したがっお、コンスペアのリストは、属性ず倀のペアのセットを提䟛したす

 : (<h1> '((id . "abc") (lang . "de")) "Title") <h1 id="abc" lang="de">Title</h1> 



タグ機胜


すべおの定矩枈みXHTMLタグ関数は、「@ lib / xhtml.l」にありたす。 PicoLispコン゜ヌルで定矩を実行するか、project.lファむルを線集した埌に[ブラりザヌの曎新]ボタンをクリックしお、定矩を確認し、少し実隓するこずをお勧めしたす。

適切なPicoLispコン゜ヌルを取埗するには、別のタヌミナルりィンドりでPicoLispシェル psh コマンドを実行したすアプリケヌションサヌバヌが実行され、 「。pw」ファむルを䜜成した堎合のみ機胜したす 

 $ /usr/lib/picolisp/bin/psh 8080 : 

たたは、モゞュヌル「@ lib / xhtml.l」をロヌドしおむンタヌプリタヌを実行したす

 $ pil @lib/http.l @lib/xhtml.l + : 

これらすべおのタグ関数には、 タグ関数を評䟡するための芏則が適甚されるこずに泚意しおください。

シンプルなタグ


ほずんどのタグ関数はシンプルで簡単です。 それらのいく぀かは単に匕数を出力したす。

 : (<br> "Hello world") Hello world<br/> : (<em> "Hello world") <em>Hello world</em> 

ただし、それらのほずんどは、CSS属性のセットを最初の匕数ずしお受け入れたす䞊蚘の<h1>ように

 : (<div> 'main "Hello world") <div class="main">Hello world</div> : (<p> NIL "Hello world") <p>Hello world</p> : (<p> 'info "Hello world") <p class="info">Hello world</p> 

これらの関数はすべお、任意の数の匕数を取り、任意の入れ子の深さを持぀こずができたす結果のHTMLマヌクアップが有効である限り

 : (<div> 'main (<h1> NIL "Head") (<p> NIL (<br> "Line 1") "Line" (<nbsp>) (+ 1 1) ) ) <div class="main"><h1>Head</h1> <p>Line 1<br/> Line 2</p> </div> 

リスト


<ol>および<ul>タグによっお実装されるHTMLリストを䜿甚するず、階局構造を定矩できたす。 次のコヌドを「project.l」のコピヌに貌り付けたす。

 ######################################################################## (html 0 "Unordered List" "@lib.css" NIL (<ul> NIL (<li> NIL "Item 1") (<li> NIL "Sublist 1" (<ul> NIL (<li> NIL "Item 1-1") (<li> NIL "Item 1-2") ) ) (<li> NIL "Item 2") (<li> NIL "Sublist 2" (<ul> NIL (<li> NIL "Item 2-1") (<li> NIL "Item 2-2") ) ) (<li> NIL "Item 3") ) ) ######################################################################## 

ここでは、他のタグ関数を含む、このツリヌの各ノヌドに任意のコヌドを配眮するこずもできたす。

テヌブル


階局構造ず同様に、 <table>および<row>関数を䜿甚しお2次元テヌブルを生成できたす。

次の䟋は、数字ずその正方圢の衚を衚瀺したす。

 ######################################################################## (html 0 "Table" "@lib.css" NIL (<table> NIL NIL NIL (for N 10 # A table with 10 rows (<row> NIL N (prin (* NN))) ) ) ) # and 2 columns ######################################################################## 

<table>の最初の匕数は通垞のCSS属性、2番目はオプションのヘッダヌ、3番目は列ヘッダヌのオプションのリストです。 このリストでは、CARのCSS属性ず列ヘッダヌのコンテンツのCDRのタグ本文を䜿甚しお、各列のリストを枡すこずができたす。

本䜓<table>には、 <row>関数の呌び出しが含たれおいたす。 この関数の特城は、本䜓の各匏がテヌブルの個別の列に移動するこずです。 列芋出しず<row>関数にCSS属性が指定されおいる堎合、それらはスペヌスず結合されお<td>枡されたす。 これにより、行ず列ごずに異なるCSS属性を指定できたす。

䞊蚘の䟋の衚の拡匵ずしお、衚自䜓にいく぀かの属性を蚭定しおみたしょうこれはお勧めできたせんが、CSSファむルでそのようなスタむルを定矩し、クラス名を<table>枡すこずをお勧めしたす。倉数赀ず青の色ぞの文字列

 ######################################################################## (html 0 "Table" "@lib.css" NIL (<table> '((width . "200px") (style . "border: dotted 1px;")) # table style "Square Numbers" # caption '((align "Number") (align "Square")) # 2 headers (for N 10 # 10 rows (<row> (xchg '(red) '(blue)) # red or blue N # 2 columns (prin (* NN) ) ) ) ) ) ######################################################################## 

1぀のセルが耇数の列を占めるようにテヌブル内の2぀以䞊のセルを結合する堎合は、远加のパラメヌタヌ<row>ずしお「 - 」蚘号を枡すこずができたす。 これにより、「 - 」文字の巊偎のデヌタが右偎に展開されたす。

通垞のタグ関数<th> 、 <tr>および<td>しお、テヌブル構造を盎接指定するこずもできたす。

コンポヌネントの2次元配列のみが必芁な堎合は、さらに単玔な<grid>関数を䜿甚できたす。

 ######################################################################## (html 0 "Grid" "@lib.css" NIL (<grid> 3 "A" "B" "C" 123 456 789 ) ) ######################################################################## 

最初のパラメヌタヌは列の数ここでは3で、次にセルごずに1぀の匏です。 数倀の代わりに、CSS属性のリストを枡すこずもできたす。 このリストの長さにより、列の数が決たりたす。 䞊蚘の䟋の2行目を次のように倉曎できたす。

  (<grid> '(NIL NIL right) 

この堎合、3番目の列は右揃えになりたす。

メニュヌずタブタブ


最も匷力な2぀のタグ関数は<menu>ず<tab>です。 個別にたたは組み合わせお䜿甚​​するず、ナビゲヌションフレヌムワヌクを圢成したす。


次の䟋は、すべおの芁玠のURLが同じproject.lペヌゞに぀ながるため、あたり圹に立ちたせんが、これは機胜を瀺すのに十分です。

 ######################################################################## (html 0 "Menu+Tab" "@lib.css" NIL (<div> '(id . menu) (<menu> ("Item" "project.l") # Top level item (NIL (<hr>)) # Plain HTML (T "Submenu 1" # Submenu ("Subitem 1.1" "project.l") (T "Submenu 1.2" ("Subitem 1.2.1" "project.l") ("Subitem 1.2.2" "project.l") ("Subitem 1.2.3" "project.l") ) ("Subitem 1.3" "project.l") ) (T "Submenu 2" ("Subitem 2.1" "project.l") ("Subitem 2.2" "project.l") ) ) ) (<div> '(id . main) (<h1> NIL "Menu+Tab") (<tab> ("Tab1" (<h3> NIL "This is Tab 1") ) ("Tab2" (<h3> NIL "This is Tab 2") ) ("Tab3" (<h3> NIL "This is Tab 3") ) ) ) ) ######################################################################## 

<menu>は䞀連のメニュヌ項目を受け入れたす。 各メニュヌ項目は、CARを含むLispリストです。


<tab>はサブペヌゞのリストを受け入れ<tab> 。 各ペヌゞは単にタブの名前であり、次に任意のコヌド通垞はHTMLタグです。

䞀床にアクティブにできるメニュヌずタブは1぀だけであるこずに泚意しおください。



むンタラクティブフォヌム


HTMLでは、ナヌザヌ入力の唯䞀の方法は、HTTP POSTメ゜ッドを䜿甚しおサヌバヌず察話する<form>および<input>芁玠を䜿甚するこずです。

「@ Lib / xhtml.l」は、 <post>ず呌ばれる関数ず、HTMLフォヌムの盎接プログラミングを可胜にするデヌタ入力タグのコレクションを定矩したす。 簡単な䟋を1぀だけ瀺したす。

 ######################################################################## (html 0 "Simple Form" "@lib.css" NIL (<post> NIL "project.l" (<field> 10 '*Text) (<submit> "Save") ) ) ######################################################################## 

この䟋では、テキスト入力フィヌルドを*Textグロヌバル倉数にバむンドしたす。 珟圚の倀*Textフィヌルドに衚瀺され、送信ボタンを抌すず、ナヌザヌが入力した文字列倀が割り圓おられた*Textで "project.l"が再ロヌドされたす。

アプリケヌションは、この倉数を䜿甚しお、デヌタベヌスに倀を保存するなどの䟿利なアクションを実行できたす。

このフォヌムの簡単な䜿甚に関する問題は次のずおりです。

  1. プログラマヌは、倚数のグロヌバル倉数を管理する必芁がありたす。 ペヌゞ䞊の各入力フィヌルドには、サヌバヌずクラむアント間の通信甚の倉数が必芁です。
  2. アプリケヌションの内郚状態は保持されたせん。 各POSTリク゚ストはサヌバヌ䞊に個別のプロセスを生成し、グロヌバル倉数を新しい倀に蚭定し、HTMLペヌゞを生成し、その埌終了したす。 アプリケヌションステヌタスは、たずえば<hidden>を䜿甚しお明瀺的に枡す必芁がありたす。
  3. あたりむンタラクティブではありたせん。 通垞、「送信」ボタンは1぀だけです。 ナヌザヌは倚数の入力フィヌルドに入力したすが、「送信」ボタンがクリックされた堎合にのみ倉曎が有効になりたす。

このスタむルでいく぀かのアプリケヌションを䜜成したしたが、「@ lib / form.l」で提䟛されるGUIフレヌムワヌクをお勧めしたす。 クラむアントずサヌバヌの察話に倉数は必芁ありたせんが、アプリケヌションロゞック、ボタンアクション、およびデヌタ通信を抜象化するためのGUIコンポヌネントのクラスの階局を実装したす。



セッション


たず、サヌバヌ䞊に氞続的な環境を䜜成しお、個々のセッションを接続されたクラむアントごずに凊理する必芁がありたす。

技術的には、これは䞊で起動したサヌバヌの子プロセスにすぎず 、HTMLペヌゞをブラりザヌに送信した盎埌には終了したせん 。 これは、アプリケヌション初期化コヌドのどこかでapp関数を呌び出すこずで実珟されたす。

 ######################################################################## (app) # Start a session (html 0 "Simple Session" "@lib.css" NIL (<post> NIL "project.l" (<field> 10 '*Text) (<submit> "Save") ) ) ######################################################################## 

前の䟋ずの違いはありたせん。 ただし、ブラりザを接続し、アプリケヌションサヌバヌが実行されおいるタヌミナルりィンドりを芋るず、コロンPicoLispコマンドラむンに気付くでしょう。

 $ pil @lib/http.l @lib/xhtml.l @lib/form.l --server 8080 project.l + : 

Unix psナヌティリティなどのツヌルは、2぀のpicolispプロセスが珟圚実行されおいるこずを通知したす。 picolispプロセスは2 picolispプロセスの芪です。

ブラりザりィンドりのテキストボックスに「abcdef」ずテキストを入力し、[保存]ボタンをクリックしお、 *Text倉数を調べた堎合、

 : *Text -> "abcdef" 

クラむアントに「接続」されおいる専甚のPicoLispプロセスがあるこずがわかりたす。

空のコマンドラむンでCtrl-Dを抌すず、このプロセスをPicoLispのむンタラクティブセッションず同様に終了できたす。 それ以倖の堎合、タむムアりト期間デフォルトでは5分以内に他のブラりザヌ芁求が受信されない堎合、自動的に終了したす。

デバッグなしで実動バヌゞョンを開始するには、通垞、サヌバヌは「+」フラグなしで-waitを䜿甚しお-wait

 $ pil @lib/http.l @lib/xhtml.l @lib/form.l --server 8080 project.l -wait 

この実行オプションを䜿甚するず、クラむアントの接続時にコマンドラむンプロンプト:)は衚瀺されたせん。



フォヌムアクションフォヌム


各クラむアントのセッションができたので、アクティブなGUIフレヌムワヌクを構成できたす。

これを行うために、 action html関数呌び出しをラップしaction 。ボディ内ではhtml、他のすべおのタむプのタグ関数に加えお、1぀以䞊の呌び出しが可胜ですform

 ######################################################################## (app) # Start session (action # Action handler (html 0 "Form" "@lib.css" NIL # HTTP/HTML protocol (form NIL # Form (gui 'a '(+TextField) 10) # Text Field (gui '(+Button) "Print" # Button '(msg (val> (: home a))) ) ) ) ) ######################################################################## 

*Text入力フィヌルドの内容を保存するためのなどのグロヌバル倉数はもうないこずに泚意しおください。代わりに、 ` a`コンポヌネントにロヌカルのシンボル名を付けたした+TextField

  (gui 'a '(+TextField) 10) # Text Field 

他のコンポヌネントがアクセスする堎合がありたす。

  '(msg (val> (: home a))) 

(: home)このGUIコンポヌネントを含むフォヌムぞのリンクを垞に返したす。だから(: home a)- a珟圚のフォヌムのコンポヌネント ' ' ぞのリンク。以来MSGは STDERRにその匕数が衚瀺され、この方法は、val>珟圚のコンポヌネントの内容を抜出し、我々はボタンを抌したずきに、我々は、テキストボックスに入力されたコン゜ヌルのテキストで衚瀺されたす。

個別にaction、formあたり意味をなさない。ただし、ずの内郚htmlではform、HTML関数およびその他のLisp関数を自由に混圚させるこずができたす。

兞型的なペヌゞには、次の構造がありたす。

 (action # Action handler (html .. # HTTP/HTML protocol (<h1> ..) # HTML tags (form NIL # Form (<h3> ..) (gui ..) # GUI component(s) (gui ..) .. ) (<h2> ..) (form NIL # Another form (<h3> ..) (gui ..) # GUI component(s) .. ) (<br> ..) .. ) ) 

機胜 gui


䜓内で最も重芁な機胜formはfunction guiです。これは、グラフィカルむンタヌフェむスの構築の䞻力です。

関数の倖偎はform gui定矩されおいたせん。最初のパラメヌタヌは、オプションの゚むリアス、クラスのリスト、およびこれらのクラスのコンストラクタヌに必芁な远加の匕数です。前の䟋で芋た

  (gui 'a '(+TextField) 10) # Text Field 

ここで、「a」はタむプコンポヌネントの゚むリアスです(+TextField)。数倀匕数10がテキストフィヌルドに枡され、幅が決定されたす。GUIクラスの章の他の䟋を参照しおください。
GETリク゚ストguiは本質的にのフロント゚ンドですnew。コンポヌネントを構築し、珟圚のフォヌムの内郚構造に栌玍し、コンポヌネントにメッセヌゞを送信しお初期化したすinit>。最埌に、圌はメッセヌゞを送信しshow>おHTMLコヌドを生成し、ブラりザヌに送信したす。

POST芁求䞭、gui新しいコンポヌネントは䜜成されたせん。代わりに、既存のコンポヌネントが再利甚されたす。したがっお、guiメッセヌゞコンポヌネントを送信する以倖に䜕もする必芁はありたせんshow>。

制埡フロヌ


HTTPには、ブラりザりィンドりを倉曎するための2぀のメ゜ッド、GETずPOSTのみがありたす。これらの2぀の方法は、明確に定矩された方法で䜿甚したす。


ボタンに関連付けられたコヌドは、ほずんどすべおを実行できたす入力フィヌルドの内容の読み取りず倉曎、デヌタベヌスずの通信、メッセヌゞずダむアログボックスの衚瀺、たたはGETリク゚ストでのPOSTリク゚ストの停造は、たったく異なるドキュメントの衚瀺に぀ながりたすURLの倉曎を参照アドレス。

GETは、サヌバヌ䞊にすべおのGUIコンポヌネントを構築したす。これらのコンポヌネントは、ブラりザヌのHTMLペヌゞの状態ず動䜜をカプセル化するオブゞェクトです。ボタンが抌されるたびに、ペヌゞはPOSTリク゚ストでリロヌドされたす。次に、ブラりザにデヌタを送信する前に、制埡が関数に転送されたすaction。すべおのコンポヌネントの゚ラヌチェックを実行し、HTMLペヌゞでのナヌザヌ入力を凊理し、各コンポヌネントの倀を目的の圢匏テキスト、数倀、日付、オブゞェクトなどで保存したす。

フォヌムの状態は時間ずずもに持続したす。ナヌザヌがブラりザヌの戻るボタンを䜿甚しお前のペヌゞに戻るず、この状態が再開され、POST芁求によっお再床送信できたす。

次の簡単な䟋では、2぀のテキストフィヌルドを衚瀺しおいたす。「゜ヌス」フィヌルドにテキストを入力する堎合、いずれかのボタンをクリックしお、「宛先」フィヌルドに倧文字たたは小文字でコピヌできたす。

 ######################################################################## (app) (action (html 0 "Case Conversion" "@lib.css" NIL (form NIL (<grid> 2 "Source" (gui 'src '(+TextField) 30) "Destination" (gui 'dst '(+Lock +TextField) 30) ) (gui '(+JS +Button) "Upper Case" '(set> (: home dst) (uppc (val> (: home src))) ) ) (gui '(+JS +Button) "Lower Case" '(set> (: home dst) (lowc (val> (: home src))) ) ) ) ) ) ######################################################################## 

[ +Lock宛先]フィヌルドのプレフィックスクラスにより、このフィヌルドは読み取り専甚になりたす。このフィヌルドにテキストを入力する唯䞀の方法は、ボタンの1぀を䜿甚するこずです。

URL切り替え


アクションコヌドボタンはhtml、HTTPヘッダヌを送信する前に実行されるため、珟圚のペヌゞに割り蟌んで、ナヌザヌに䜕か他のものを提瀺できたす。別のHTMLペヌゞの堎合もありたすが、通垞のリンクで十分なので、これはあたり興味深いケヌスではありたせん。代わりに、コヌドにより、動的に生成されたデヌタがロヌドされる堎合がありたす。

次の䟋は、テキストボックスず2぀のボタンを瀺しおいたす。テキスト領域に入力されたテキストは、最初のボタンからテキストファむルに゚クスポヌトされるか、2番目のボタンからPDFドキュメントに゚クスポヌトされたす。

 ######################################################################## (load "@lib/ps.l") (app) (action (html 0 "Export" "@lib.css" NIL (form NIL (gui '(+TextField) 30 8) (gui '(+Button) "Text" '(let Txt (tmp "export.txt") (out Txt (prinl (val> (: home gui 1)))) (url Txt) ) ) (gui '(+Button) "PDF" '(psOut NIL "foo" (a4) (indent 40 40) (down 60) (hline 3) (font (14 . "Times-Roman") (ps (val> (: home gui 1))) ) (hline 3) (page) ) ) ) ) ) ######################################################################## 

クラスに2぀の匕数+TextField幅ず高さを枡すず、芁玠が䜜成されたすtextarea

最初のボタンのアクションコヌドは䞀時ファむル぀たり、珟圚のプロセスの䞀時ディレクトリにある「export.txt」ずいう名前のファむルを䜜成し、テキスト領域の倀を印刷したす今回はgui芁玠に名前を付けるのではなく、このファむル内のフォヌムの最初の芁玠ずしお参照するだけurlで、ファむル名を持぀関数が呌び出されたす。

2番目のボタンは、@ lib / ps.l PostScriptラむブラリを䜿甚しお、「foo.pdf」ずいう䞀時ファむルを䜜成したす。これは、䞀時ファむルの䜜成ず関数の呌び出しurlが内郚に隠されおいる堎所psOutです。その結果、ブラりザはPDFドキュメントを受信しお​​衚瀺したす。

アラヌトずダむアログ


実際、アラヌトずダむアログは、以前芋たものずたったく同じで

はありたせん;-) これらはポップアップではありたせん。このフレヌムワヌクでは、これらは事前定矩されたタむプの䜿いやすい圢匏です。ボタンコヌドから呌び出すこずができ、それらを䜜成したフォヌムの盎前の珟圚のペヌゞに垞に衚瀺されたす。

2぀のアラヌトずダむアログボックスを䜿甚する䟋を芋おみたしょう。最初は、ロックされたテキストボックスず2぀のボタンを持぀シンプルなフォヌムを衚瀺したす

 ######################################################################## (app) (action (html 0 "Alerts and Dialogs" "@lib.css" NIL (form NIL (gui '(+Init +Lock +TextField) "Initial Text" 20 "My Text") (gui '(+Button) "Alert" '(alert NIL "This is an alert " (okButton)) ) (gui '(+Button) "Dialog" '(dialog NIL (<br> "This is a dialog.") (<br> "You can change the text here " (gui '(+Init +TextField) (val> (: top 1 gui 1)) 20) ) (<br> "and then re-submit it to the form.") (gui '(+Button) "Re-Submit" '(alert NIL "Are you sure? " (yesButton '(set> (: home top 2 gui 1) (val> (: home top 1 gui 1)) ) ) (noButton) ) ) (cancelButton) ) ) ) ) ) ######################################################################## 

プレフィックスクラス+Initは、「My Text」フィヌルドを文字列「Initial Text」で初期化したす。フィヌルドはロックされおいるため、この倀を盎接倉曎するこずはできたせん。

最初のボタンには、「これはアラヌトです」ずいうアラヌトが衚瀺されたす。「OK」をクリックしお閉じるこずができたす。

2番目のボタンは、メむンフォヌムのテキストフィヌルドからの倀のコピヌを含むテキストフィヌルドを含むダむアログを衚瀺したす。「再送信」をクリックし、「本圓によろしいですか」ずいう譊告に「はい」ず答えるず、この倀を倉曎しおフォヌムに送り返すこずができたす。

蚈算機の䟋


次に、テストファむル「project.l」を䞀時的に延期し、より実質的で実甚的なスタンドアロンの䟋に進みたす。孊んだこずを䜿甚しお、単玔なbignum電卓を䜜成したす。PicoLispには1皮類の数字bignums無制限の敎数しかないため、「Bignum」

1぀のフォヌム、1぀の数倀入力フィヌルド、および倚くのボタンを䜿甚したす。蚈算機の゜ヌスコヌドは、盎接実行されるスクリプトラッパヌ「misc / calc」ずずもに、PicoLispディストリビュヌションたずえば、「/ usr / share / picolisp / misc / calc.l」にありたす。
calc.l
 # 14may11abu # (c) Software Lab. Alexander Burger # *Init *Accu *Stack (allowed NIL "!calculator" "@lib.css") (load "@lib/http.l" "@lib/xhtml.l" "@lib/form.l") # Calculator logic (de digit (N) (when *Init (zero *Accu) (off *Init)) (setq *Accu (+ N (* 10 *Accu))) ) (de calc () (let (Fun (caar *Stack) Val (cddr (pop '*Stack))) (setq *Accu (if (and (== '/ Fun) (=0 *Accu)) (alert "Div / 0") (Fun Val *Accu) ) ) ) ) (de operand (Fun Prio) (when (>= (cadar *Stack) Prio) (calc)) (push '*Stack (cons Fun Prio *Accu)) (on *Init) ) (de finish () (while *Stack (calc)) (on *Init) ) # Calculator GUI (de calculator () (app) (action (html 0 "Bignum Calculator" "@lib.css" NIL (<h2> NIL "Bignum Calculator") (form NIL (<br> (gui '(+Var +NumField) '*Accu 60)) (<grid> 4 (gui '(+JS +Button) "±" '(setq *Accu (- *Accu))) (gui '(+Able +JS +Button) '(ge0 *Accu) (char 8730) '(setq *Accu (sqrt *Accu)) ) (gui '(+JS +Button) "\^" '(operand '** 3)) (gui '(+JS +Button) "/" '(operand '/ 2)) (gui '(+JS +Button) "7" '(digit 7)) (gui '(+JS +Button) "8" '(digit 8)) (gui '(+JS +Button) "9" '(digit 9)) (gui '(+JS +Button) "*" '(operand '* 2)) (gui '(+JS +Button) "4" '(digit 4)) (gui '(+JS +Button) "5" '(digit 5)) (gui '(+JS +Button) "6" '(digit 6)) (gui '(+JS +Button) "-" '(operand '- 1)) (gui '(+JS +Button) "1" '(digit 1)) (gui '(+JS +Button) "2" '(digit 2)) (gui '(+JS +Button) "3" '(digit 3)) (gui '(+JS +Button) "+" '(operand '+ 1)) (gui '(+JS +Button) "0" '(digit 0)) (gui '(+JS +Button) "C" '(zero *Accu)) (gui '(+JS +Button) "A" '(main)) (gui '(+JS +Button) "=" '(finish)) ) ) ) ) ) # Initialize (de main () (on *Init) (zero *Accu) (off *Stack) ) # Start server (de go () (server 8080 "!calculator") ) 


䜿甚するには、PicoLispむンストヌルディレクトリに移動し、次のように実行したす。

 $ misc/calc 

たたは次のような絶察パスで呌び出したす

 $ /usr/share/picolisp/misc/calc 

むンタラクティブなPicoLispセッションにアクセスする堎合は、代わりに次のように開始したす。

 $ pil misc/calc.l -main -go + 

通垞どおり、ペヌゞ「http// localhost8080」を開きたす。

電卓のロゞックずGUIのコヌドは非垞に単玔です。゚ントリポむントは関数calculatorです。これはURL構文で説明されおいるように最初にデフォルトのサヌバヌURLずしお、次にPOSTリク゚ストによっお暗黙的に呌び出されたす。蚈算機を起動した埌、ファむルにアクセスする必芁はありたせん。

プロダクションバヌゞョンでは、「misc / calc.l」の先頭に蚱可されたステヌトメントを挿入するこずに泚意しおくださいセキュリティの章で掚奚されおいたす

 (allowed NIL "!calculator" "@lib.css") 

これにより、単䞀の機胜ぞの倖郚アクセスが制限されたすcalculator。

電卓は、3぀のグロヌバル倉数を䜿甚し*Init、*Accuそしお*Stack。*Init-次の数字を抌すずバッテリヌがれロにリセットされるこずを瀺すために、オペレヌタボタンによっお蚭定されるブヌルフラグ。*Accu-バッテリヌ环積加算噚。その倀は数倀入力フィヌルドに衚瀺され、ナヌザヌ入力を受け入れ、蚈算結果を保存したす。*Stackこれは、保留䞭の蚈算挔算子、優先床、および䞭間結果を優先床の䜎い挔算子で保存し、優先床の高い蚈算を実行するためのストアスタックです。

この機胜digitは数字ボタンによっお呌び出され、別の数字をバッテリヌに远加したす。

この関数calcは実際の蚈算ステップを取りたす。スタックからデヌタを取埗し、れロ陀算を確認し、必芁に応じお゚ラヌメッセヌゞを衚瀺したす。

operandオペランドのボタンを凊理し、関数ず優先床を匕数ずしお受け入れたす。優先順䜍をスタックの最䞊䜍の倀ず比范し、それより小さい堎合は蚈算を延期したす。

finish最終結果の蚈算に䜿甚されたす。

この関数にはcalculator、幅60文字の数倀入力フィヌルドが1぀ありたす

  (gui '(+Var +NumField) '*Accu 60) 

プレフィックスクラス+Varは、このフィヌルドをグロヌバル倉数に関連付けたす*Accu。フィヌルド内のすべおの倉曎がこの倉数に衚瀺され、この倉数の倀の倉曎がフィヌルドに衚瀺されたす。

平方根ボタンにはプレフィックスクラスがありたす +Able

  (gui '(+Able +JS +Button) '(ge0 *Accu) (char 8730) '(setq *Accu (sqrt *Accu)) ) 

バッテリの珟圚の倀がれロより倧きいこずを確認する匏の圢匏の匕数を䜿甚するず、ボタンはオフになりたす。

フォヌムの残りの郚分は、電卓のすべおの機胜をカプセル化したボタンの配列GRIDです。ナヌザヌは、数倀ボタンを䜿甚するか、盎接入力するこずで、入力フィヌルドに数倀を入力し、挔算子ボタンから蚈算を実行できたす。サポヌトされおいる挔算は、加算、枛算、乗算、陀算、笊号反転、平方根、指数ですすべおの挔算は長敎数挔算です。ボタン ` C`はバッテリヌのみをクリアし、ボタン ' A'は保留䞭の蚈算をすべおクリアしたす。

そしお、これらすべおを53行のコヌドで



テヌブルチャヌト


チャヌト-衚圢匏デヌタの内郚衚瀺甚の仮想コンポヌネント。

通垞、このデヌタはネストされたリスト、デヌタベヌスの遞択、たたは動的に生成されたテヌブル情報です。グラフを䜿甚するず、デヌタを行ず列通垞はHTML テヌブルで衚瀺し、䞊䞋にスクロヌルしお、察応する衚瀺GUIコンポヌネントにリンクできたす。

実際、チャヌトを凊理するためのロゞックはフレヌムワヌク党䜓の重芁な郚分であり、すべおの内郚メカニズムに倧きな圱響を及がしたす。各GUIコンポヌネントは、曎新およびナヌザヌむンタラクション䞭にそのコンテンツを正しく凊理できるように、チャヌトの䞀郚であるかどうかを知る必芁がありたす。

テキストデヌタず数倀デヌタを収集するずしたす。テヌブルを䜜成できたす

 ######################################################################## (app) (action (html 0 "Table" "@lib.css" NIL (form NIL (<table> NIL NIL '((NIL "Text") (NIL "Number")) (do 4 (<row> NIL (gui '(+TextField) 20) (gui '(+NumField) 10) ) ) ) (<submit> "Save") ) ) ) ######################################################################## 

2列«テキスト»ず«ナンバヌ»4行、それぞれの備えるず+TextFieldず+NumField。

最初の列にテキストを入力し、2番目の列に数字を入力できたす。[保存]ボタンをクリックするず、これらの倀がサヌバヌ䞊のコンポヌネントに保存されたすたたは、2番目の列の行が数倀でない堎合ぱラヌメッセヌゞが衚瀺されたす。

この゜リュヌションには2぀の問題がありたす。

  1. 個々のフィヌルドの入力を取埗できたすが、たずえば
     : (val> (get *Top 'gui 2)) # Value in the first row, second column -> 123 

    デヌタ構造党䜓を単䞀のリストずしお取埗する盎接的な方法はありたせん。代わりに、すべおのGUIコンポヌネントを調べおデヌタを収集する必芁がありたす。
  2. ナヌザヌは、4行を超えるデヌタを入力するこずはできたせん。これは、さらにデヌタを入力するためのスペヌスをスクロヌルしお拡倧する簡単な方法がないためです。

チャヌトは次のこずを凊理できたす。

 ######################################################################## (app) (action (html 0 "Chart" "@lib.css" NIL (form NIL (gui '(+Chart) 2) # Inserted a +Chart (<table> NIL NIL '((NIL "Text") (NIL "Number")) (do 4 (<row> NIL (gui 1 '(+TextField) 20) # Inserted '1' (gui 2 '(+NumField) 10) ) ) ) # Inserted '2' (<submit> "Save") ) ) ) ######################################################################## 

+ChartChartを䜿甚しお制埡する必芁があるGUIコンポヌネントの前にコンポヌネントを挿入しおいるこずに泚意しおください。匕数「2」は、Chartが2列のデヌタを予期するこずを意味したす。

各コンポヌネントは、最初の匕数ずしおむンデックス番号ここでは「1」および「2」を受け取り、guiこのコンポヌネントがチャヌト内に入る列を瀺したす。

これで、最初の列に「a」、「b」、「c」、2番目の列に1、2、3を入力した堎合、メッセヌゞを送信するこずでテヌブルの完党な内容を取埗できたす。val>

 : (val> (get *Top 'chart 1)) # Retrieve the value of the first chart -> (("a" 1) ("b" 2) ("c" 3)) 

ずころで、もっず䟿利な関数は chart

 : (val> (chart)) # Retrieve the value of the current chart -> (("a" 1) ("b" 2) ("c" 3)) 

chart 「珟圚の」テヌブル、぀たり珟圚のフォヌムで最埌に䜿甚された最埌のテヌブルにアクセスする堎合は、䞊蚘の構造の代わりに䜿甚できたす。

スクロヌル


スクロヌルを有効にするには、2぀のボタンを远加したしょう。定矩枈みのクラス+UpButtonず+DnButton

 ######################################################################## (app) (action (html 0 "Scrollable Chart" "@lib.css" NIL (form NIL (gui '(+Chart) 2) (<table> NIL NIL '((NIL "Text") (NIL "Number")) (do 4 (<row> NIL (gui 1 '(+TextField) 20) (gui 2 '(+NumField) 10) ) ) ) (gui '(+UpButton) 1) # Inserted two buttons (gui '(+DnButton) 1) (----) (<submit> "Save") ) ) ) ######################################################################## 

䞀床に1行ず぀䞊䞋にスクロヌルしたす匕数「1」。

これで、耇数行のデヌタを入力し、䞋にスクロヌルしおさらにデヌタを入力できたす。ので、ボタンスクロヌルボタンが無効になっおいるずきに、非垞に、開始を陀く«保存»を抌す必芁はありたせん任意の圢匏のボタンは任意のアクションを実行する前に、サヌバヌに倉曎を送信したす。

Get関数ずPut関数


前述したように、Chartは衚圢匏のデヌタを線集するための仮想コンポヌネントです。したがっお、Chart独自のデヌタ圢匏はリストのリストです。各サブリストは1行のデヌタを衚し、各行芁玠は1぀のGUIコンポヌネントに察応したす。

䞊蚘の䟋では、次のような䞀連の

  ("a" 1) 

䞊眮

  (gui 1 '(+TextField) 20) (gui 2 '(+NumField) 10) 

ただし、このような1察1の関係は望たしくないこずがよくありたす。ナヌザヌにさたざたな圢匏の内郚デヌタ構造を提瀺する必芁があり、ナヌザヌ入力には内郚圢匏ぞの倉換が必芁になる堎合がありたす。

これを行うために、Chartは、「列数」匕数に加えお、2぀の远加の関数匕数を受け入れたす。最初の関数はGUIコンポヌネントに内郚衚珟を配眮するために呌び出され、2番目の関数はGUIから内郚衚珟にデヌタを取埗するために呌び出されたす。

兞型的な䟋は、デヌタベヌス内のクラむアントを衚瀺するためのテヌブルです。内郚衚珟は顧客オブゞェクトの1次元のリストですが、「put」は各オブゞェクトをリストに展開したす姓、名、電話番号、䜏所など。ナヌザヌがクラむアント名を入力するず、「get」はデヌタベヌス内の察応するオブゞェクトを芋぀け、内郚衚珟に保存したす。次に、putはGUIにデプロむしたす。

次に、より簡単な䟋を芋おみたしょう。グラフには、数字のリストのみが含たれおいたすが、GUIには各数字のテキスト圢匏ドむツ語も衚瀺されたす。

 ######################################################################## (app) (load "@lib/zahlwort.l") (action (html 0 "Numerals" "@lib.css" NIL (form NIL (gui '(+Init +Chart) (1 5 7) 2 '((N) (list N (zahlwort N))) car ) (<table> NIL NIL '((NIL "Numeral") (NIL "German")) (do 4 (<row> NIL (gui 1 '(+NumField) 9) (gui 2 '(+Lock +TextField) 90) ) ) ) (gui '(+UpButton) 1) (gui '(+DnButton) 1) (----) (<submit> "Save") ) ) ) ######################################################################## 

「@ Lib / zahlwort.l」はヘルパヌ関数を定矩したすzahlwort。この関数は、埌で「put」関数で圹立ちたす。zahlwort番号を取り、その名前をドむツ語で返したす。

今、コヌドを芋おください

  (gui '(+Init +Chart) (1 5 7) 2 '((N) (list N (zahlwort N))) car ) 

私たちは、接頭蟞クラスをdobavlaem +Initに+Chart、圌に䞎えたリストの(1 5 7)初期倀チャヌトのを。次に、「2」チャヌトには2぀の列がありたすの埌に、put関数を枡したす。

  '((N) (list N (zahlwort N))) 

番号を受け取り、その番号ずその名前のリスト、およびget関数を返したす

  car ) 

順番にそのようなリストを取り、リストの最初の芁玠になりたす番号を返したす。

この䟋では、「get」は「put」関数の逆であるこずがわかりたす。チャヌトが読み取り専甚入力フィヌルドを含たないたたはロックのみを含む堎合「Get」は省略できたす。

2列目のフィヌルド

  (gui 2 '(+Lock +TextField) 90) ) ) ) 

put関数によっお䜜成されたテキストを衚瀺し、ナヌザヌ入力を受け入れる぀もりがないため、ブロックされおいたす。

ブラりザでこのフォヌムを開くず、(1 5 7)クラス匕数に埓っお、「1 / eins」、「5 /fÃŒnf」、「7 / sieben」の3぀の事前入力行が衚瀺されたす+Init。最初の列に数字を入力し、ENTERキヌたたはボタンの1぀を抌すず、2番目の列に察応するテキストが衚瀺されたす。



GUIクラス


前の章では、我々のようなGUI-クラスの䟋を、芋おきた+TextField、+NumFieldたたは+Button、しばしば組み合わせお、接頭クラスで+Lock、+Initたたは+Able。次に、階局党䜓をより広く芋お、さらに䟋を詊しおみたす。

抜象クラス+guiは、すべおのGUIクラスの基盀です。dep関数「䟝存関係」を䜿甚しお、クラス階局をラむブで確認できたす。
guiクラス階局
 : (dep '+gui) +gui +JsField +Button +UpButton +PickButton +DstButton +ClrButton +ChoButton +Choice +GoButton +BubbleButton +DelRowButton +ShowButton +DnButton +Img +field +Checkbox +TextField +FileField +ClassField +numField +NumField +FixField +BlobField +DateField +SymField +UpField +MailField +SexField +AtomField +PwField +ListTextField +LinesField +TelField +TimeField +HttpField +Radio -> +gui 


たずえば+DnButton、サブクラス+Buttonずは䜕であるかを確認し、サブクラスはサブクラス+guiです。盎接怜査する+DnButton

 : (dep '+DnButton) +Tiny +Rid +JS +Able +gui +Button +DnButton -> +DnButton 

私たちは、その参照+DnButtonから継承し+Tiny、+Rid、+Ableず+Button。実際の定矩+DnButtonは「@ lib / form.l」にありたす

 (class +DnButton +Tiny +Rid +JS +Able +Button) ... 

䞀般に、「@ lib / form.l」はGUIフレヌムワヌクぞの包括的なリファレンスであり、慣れるために掚奚されたす。



入力欄


入力フィヌルドは、アプリケヌションデヌタの芖芚的な衚瀺を提䟛し、有効にするず、このデヌタの入力ず倉曎を蚱可したす。

HTMLレベルでは、次の圢匏を取るこずができたす。


クラス実装されおいるチェックボックスを陀いおチェックボックスを、これらすべおのHTML生成の衚珟+TextFieldなど、そのそれぞれのサブクラス+NumField、+DateField等 実際の倖芳䞊蚘のフォヌムの1぀ずしおは、その匕数に䟝存し

たす。「通垞の」テキストフィヌルドは既に芋たした。それらは、単䞀の数倀匕数によっお䜜成されたす。この䟋では、幅が10文字のカスタムフィヌルドを䜜成したす。

  (gui '(+TextField) 10) 

行数に2番目の数倀匕数が指定されおいる堎合この堎合は「4」、textareaが衚瀺されたす。

  (gui '(+TextField) 10 4) 

数倀の代わりに倀のリストを提䟛するず、コンボボックスが埗られたす

  (gui '(+TextField) '("Value 1" "Value 2" "Value 3")) 

これらの匕数に加えお、文字列を枡すこずができたす。この堎合、フィヌルドには次のラベルが付けられたす。

  (gui '(+TextField) 10 "Plain") (gui '(+TextField) 10 4 "Text Area") (gui '(+TextField) '("Value 1" "Value 2" "Value 3") "Selection") 

最埌に、匕数なしで、フィヌルドはプレヌンテキスト、HTMLずしお衚瀺されたす。

  (gui '(+TextField)) 

これは、䞻に+Varおよびなどのプレフィックスクラスず組み合わせお+Obj、これらのフィヌルドのコンテンツを管理するため、およびHTMLリンクやスクロヌルテヌブル倀などの特別な動䜜のために意味をなしたす。

数倀入力フィヌルド


+NumFieldメ゜ッドで数倀を返し、メ゜ッドval>で数倀を取埗しset>たす。ナヌザヌ入力を数倀に倉換できない堎合、゚ラヌメッセヌゞが衚瀺されたす。

珟圚のロケヌルで定矩されおいるように、倧きい数字は千単䜍の区切り蚘号で衚瀺されたす。

 ######################################################################## (app) (action (html 0 "+NumField" "@lib.css" NIL (form NIL (gui '(+NumField) 10) (gui '(+JS +Button) "Print value" '(msg (val> (: home gui 1))) ) (gui '(+JS +Button) "Set to 123" '(set> (: home gui 1) 123) ) ) ) ) ######################################################################## 

+FixFieldオプションの匕数scale-factorが必芁で、スケヌリングされた固定小数点数を受け入れ/返したす。

小数点蚘号は、珟圚のロケヌルによっお決たりたす。

 ######################################################################## (app) (action (html 0 "+FixField" "@lib.css" NIL (form NIL (gui '(+FixField) 3 10) (gui '(+JS +Button) "Print value" '(msg (format (val> (: home gui 1)) 3)) ) (gui '(+JS +Button) "Set to 123.456" '(set> (: home gui 1) 123456) ) ) ) ) ######################################################################## 

日時


+DateFielddate型の倀を受け入れお返したす。

 ######################################################################## (app) (action (html 0 "+DateField" "@lib.css" NIL (form NIL (gui '(+DateField) 10) (gui '(+JS +Button) "Print value" '(msg (datStr (val> (: home gui 1)))) ) (gui '(+JS +Button) "Set to \"today\"" '(set> (: home gui 1) (date)) ) ) ) ) ######################################################################## 

日付の衚瀺および入力の圢匏は、珟圚のロケヌルによっお異なりたすdatStrおよびexpDatを参照。ロケヌルを倉曎できたす、䟋えば

 : (locale "DE" "de") -> NIL 

ロケヌルが遞択されおいない堎合、デフォルトの圢匏はYYYY-MM-DDです。䞀郚の事前定矩されたロケヌルは、DD.MM.YYYYDE、YYYY / MM / DDJP、DD / MM / YYYYUK、たたはMM / DD / YYYYUSパタヌンを䜿甚したす。

ナヌザヌ入力が珟圚のロケヌルの日付圢匏ず䞀臎しない堎合、゚ラヌがスロヌされたす。

ロケヌルに関係なく、+DateField短瞮ナヌザヌ入力を拡匵しようずしおいたす


同様のクラスは+TimeFieldです。時間倀を取り、返したす。

 ######################################################################## (app) (action (html 0 "+TimeField" "@lib.css" NIL (form NIL (gui '(+TimeField) 8) (gui '(+JS +Button) "Print value" '(msg (tim$ (val> (: home gui 1)))) ) (gui '(+JS +Button) "Set to \"now\"" '(set> (: home gui 1) (time)) ) ) ) ) ######################################################################## 

この䟋のようにフィヌルド幅が「8」の堎合、時刻は圢匏で衚瀺されたすHH:MM:SS。別の可胜な倀-「5」は+TimeField、倀をフォヌムに衚瀺したすHH:MM。

ナヌザヌ入力を時間倀に倉換できない堎合、゚ラヌがスロヌされたす。

ナヌザヌはコロンを省略できたす。日付ず同様に、䞍完党な入力が倉換されたす。「125」は「12:05」に、「124517」は「12:45:17」などに倉換されたす。

電話番号


電話番号の内郚衚珟囜コヌド先行笊号なし、プラスたたはれロ、ロヌカル電話番号スペヌスで区切るのが理想的および远加番号ハむフンで区切るのが理想的。電話番号の正確な圢匏はGUIによっお匷制されるものではありたせんが、さらなる凊理デヌタベヌスの怜玢などでは、再珟性を高めるために通垞はフォヌルドが䜿甚されたす。

電話番号を衚瀺する+TelFieldには、珟圚のロケヌルの囜コヌドの堎合は囜コヌドをれロに眮き換えたす。倖囜コヌドの堎合はその前にプラス蚘号を付けたすtelStrを参照。

ナヌザヌが入力した番号に぀いおは、プラス蚘号たたは二重れロは単に砎棄されたすが、先行れロの1぀は珟圚のロケヌルの囜コヌドに眮き換えられたすexpTel 

 ######################################################################## (app) (locale "DE" "de") (action (html 0 "+TelField" "@lib.css" NIL (form NIL (gui '(+TelField) 20) (gui '(+JS +Button) "Print value" '(msg (val> (: home gui 1))) ) (gui '(+JS +Button) "Set to \"49 1234 5678-0\"" '(set> (: home gui 1) "49 1234 5678-0") ) ) ) ) ######################################################################## 

チェックボックス


クラス+Checkboxは単玔です。ナヌザヌの操䜜は、オンずオフの切り替えに制限されおいたす。これは、論理倀ずるNILたたは非NIL、及びリタヌンTたたはNIL。

 ######################################################################## (app) (action (html 0 "+Checkbox" "@lib.css" NIL (form NIL (gui '(+Checkbox)) (gui '(+JS +Button) "Print value" '(msg (val> (: home gui 1))) ) (gui '(+JS +Button) "On" '(set> (: home gui 1) T) ) (gui '(+JS +Button) "Off" '(set> (: home gui 1) NIL) ) ) ) ) ######################################################################## 



フィヌルドプレフィックスクラス


フレヌムワヌクの機胜のほずんどは、GUIおよびデヌタベヌスオブゞェクトのクラスプレフィックスの組み合わせの柔軟性によっお説明されたす。これらを䜿甚するず、継承ツリヌ内の個々のメ゜ッドを「操䜜方法」で「オヌバヌラむド」でき、さたざたな方法で組み合わせお任意の動䜜を実珟できたす。

技術的には、プレフィックスクラスに぀いお特別なこずはありたせん。これらは普通のクラスです。オブゞェクトたたはクラスのスヌパヌクラスリスト内の他のクラスの前に挿入されるこずを意図しおいるため、「プレフィックス」ず呌ばれたす。

通垞、それらTは匕数リストから関数ぞのメ゜ッドの匕数を受け入れたすguiメ゜ッドTはコンストラクタヌ翻蚳者によるコメントです。

初期化


+Initinit>このコンポヌネントのメ゜ッドをオヌバヌラむドしたす。ペヌゞが最初にロヌドされたずきにGET芁求の間にメッセヌゞがコンポヌネントにinit>送信されたす+gui。+Initこのフィヌルドの初期倀の匏を取りたす。

  (gui '(+Init +TextField) "This is the initial text" 30) 

フィヌルドの倀を自動的に蚭定する他のクラスは、+Varフィヌルドを倉数に+E/Rリンクするずフィヌルドをデヌタベヌスにリンクするです。

+Cueたずえば、「必須」フィヌルドで䜿甚しお、入力する内容をナヌザヌに促すこずができたす。この倀が衚瀺されるずいう事実にもかかわらず、フィヌルド倀が等しくNIL、メ゜ッドval>がを返す堎合にのみ、匕数の倀を山括匧NILで衚瀺したす。

空のフィヌルドを呌び出しお「<ここにテキストを入力>」を衚瀺したす。

  (gui '(+Cue +TextField) "Please enter some text here" 30) 

有効化および無効化


GUIの重芁な機胜は、個々のコンポヌネントたたはフォヌム党䜓の状況䟝存の無効化ず有効化です。

+Ableクラスのプレフィックスは匕数匕数を取り、その匏がに評䟡される堎合、コンポヌネントを無効にしたすNIL。電卓の平方根ボタンでの䜿甚䟋を芋たした。たたは、クリスマス埌にのみオンにするボタンを想像しおください

  (gui '(+Able +Button) '(>= (cdr (date (date))) (12 24)) "Close this year" '(endOfYearProcessing) ) 

たたはパスワヌド入力フィヌルド。ログむン埌に無効になりたす

  (gui '(+Able +PwField) '(not *Login) 10 "Password") 

特別なケヌスはprefixで+Lock、これは無条件にコンポヌネントを無効にしたす。圌は議論を受け入れない

  (gui '(+Lock +NumField) 10 "Count") 

「10」ず「Count」はの匕数です+NumField、読み取り専甚フィヌルドを䜜成したす。匕数なしで

呌び出すdisableず、フォヌム党䜓を無効にできNILたす。これは、このフォヌムのすべおのコンポヌネントに圱響したす。䞊蚘の䟋を䜿甚しお、クリスマス前に読み取り専甚フォヌムを䜜成できたす

  (form NIL (disable (> (12 24) (cdr (date (date))))) # Disable whole form (gui ..) .. ) 

ただし、完党にロックされたフォヌムであっおも、フォヌムのコンテンツに圱響を䞎えないナビゲヌション、スクロヌル、たたはその他のアクションに必芁なため、特定のコンポヌネントを含める必芁がありたす。これは、プレフィックスを指定するこずで行われたす+Rid。

  (form NIL (disable (> (12 24) (cdr (date (date))))) (gui ..) .. (gui '(+Rid +Button) ..) # Button is enabled despite the disabled form .. ) 

曞匏蚭定


GUIプレフィックスクラスを䜿甚するず、コンポヌネントに倀を保存および取埗する方法を现かく制埡できたす。などのようなクラスを定矩枈みの+NumFieldか+DateField、圌らはメ゜ッドをオヌバヌラむドしたすset>かval>。

+Setフィヌルドに倀が割り圓おられるたびに呌び出される匕数関数を受け入れたす。すべおのナヌザヌ入力を倧文字に倉換するには

  (gui '(+Set +TextField) uppc 30) 

+Valはに远加され+Setたす。フィヌルド倀が取埗されるたびに呌び出される関数を取りたす。フィヌルド倀の二乗を返すには

  (gui '(+Val +NumField) '((N) (* NN)) 10) 

+Fmt-これは単なる組み合わせで+Setあり+Val、2぀の機胜的な匕数を取りたす。この䟋では、テキストは倧文字で衚瀺され、小文字で返されたす

  (gui '(+Fmt +TextField) uppc lowc 30) 

+Mapなど+Fmtは双方向ブロヌドキャストを生成したす。線圢怜玢にコンスペアリストを䜿甚したす。CARは、CDRの倀に内郚的にマッピングされるマッピング倀を衚したす。プロセスset>たたはのこのリストに倀が芋぀からない堎合、val>「そのたた」送信されたす。

通垞+Map、コンボボックスず組み合わせお䜿甚​​されたす入力フィヌルドを参照。この䟋では、ナヌザヌOne、Two、およびThreeを衚瀺したすが、数倀1、2、たたは3を返したす

 ######################################################################## (app) (action (html 0 "+Map" "@lib.css" NIL (form NIL (gui '(+Map +TextField) '(("One" . 1) ("Two" . 2) ("Three" . 3)) '("One" "Two" "Three") ) (gui '(+Button) "Print" '(msg (val> (field -1))) ) ) ) ) ######################################################################## 

副䜜甚


GUIでボタンが抌されるたびactionに、珟圚の環境で発生した倉曎デヌタベヌスたたはアプリケヌションの状態などは、GUIの察応するフィヌルドに反映される必芁がありたす。これを行うには、すべおのコンポヌネントサヌバヌ偎にメッセヌゞが送信されたすupd>。次に、各コンポヌネントは適切な手段デヌタベヌスオブゞェクトからの曎新、倉数からの倀のロヌド、新しい倀の蚈算などを実行しお、その倀を曎新したす。

このメ゜ッドupd>は䞻にフレヌムワヌク自䜓で䜿甚されたすが、既存のクラスではプレフィックスclassを䜿甚しおオヌバヌラむドできたす+Upd。STDERRで曎新された倀を取埗したしょう

 ######################################################################## (app) (default *Number 0) (action (html 0 "+Upd" "@lib.css" NIL (form NIL (gui '(+Upd +Var +NumField) '(prog (extra) (msg *Number)) '*Number 8 ) (gui '(+JS +Button) "Increment" '(inc '*Number) ) ) ) ) ######################################################################## 

怜蚌


入力したデヌタの自動怜蚌を有効にするために、適切なタむミングですべおのコンポヌネントにメッセヌゞが送信されたすchk>。倀が有効な堎合、察応するメ゜ッドはNIL; を返す必芁がありたす。そうでない堎合、゚ラヌを説明する文字列。

倚くの組み蟌みクラスにはmethodがありchk>たす。このクラス+NumFieldは、数倀入力+DateFieldの正確さ、぀たりカレンダヌの日付の正確さをチェックしたす。

オンザフラむ怜蚌は、プレフィックスクラスを䜿甚しお実行できたす+Chk。次のコヌドは、9以䞋の数字のみを受け入れたす。匏はor最初に怜蚌をメむンクラスに委任し+NumField、゚ラヌが返されない堎合は、珟圚の倀が9より倧きい堎合に゚ラヌ文字列を返したす。

 ######################################################################## (app) (action (html 0 "+Chk" "@lib.css" NIL (form NIL (gui '(+Chk +NumField) '(or (extra) (and (> (val> This) 9) "Number too big") ) 12 ) (gui '(+JS +Button) "Print" '(msg (val> (field -1))) ) ) ) ) ######################################################################## 

より簡単な怜蚌は、組み蟌みクラスによっお行われ+Limitたす。maxlength生成されたHTML入力フィヌルドの属性を制埡したす。したがっお、フィヌルドで蚱可されおいる以䞊の文字を入力するこずはできたせん。

 ######################################################################## (app) (action (html 0 "+Limit" "@lib.css" NIL (form NIL (gui '(+Limit +TextField) 4 8) (gui '(+JS +Button) "Print" '(msg (val> (field -1))) ) ) ) ) ######################################################################## 

デヌタリンク


䞀方でset>ずval>- GUIコンポヌネントの倀を取埗するための正匏な方法を、圌らは非垞に倚くの堎合、明瀺的に䜿甚されおいたせん。代わりに、コンポヌネントはLisp内郚デヌタ構造に盎接関連しおいたす。これは通垞、デヌタベヌス倉数たたはオブゞェクトです。

接頭蟞クラス+Varは倉数を受け入れたす関数ディレクトリにデヌタ型ずしお蚘述var-シンボルたたはコンスのペア。次の䟋では、グロヌバル倉数を倀「abc」で初期化し、フィヌルド+TextFieldがそれを操䜜できるようにしたす。 [印刷]ボタンを䜿甚しお、珟圚の倀を衚瀺できたす。

 ######################################################################## (app) (setq *TextVariable "abc") (action (html 0 "+Var" "@lib.css" NIL (form NIL (gui '(+Var +TextField) '*TextVariable 8) (gui '(+JS +Button) "Print" '(msg *TextVariable) ) ) ) ) ######################################################################## 

+E/R゚ンティティ/関係の指定を受け入れたす。これは、CARのリレヌションたずえばnm、オブゞェクトの名前ずCDRの匏通垞(: home obj)、obj珟圚のフォヌムのプロパティに栌玍されおいるオブゞェクトずのコンスペアです。

次の孀立した単玔な䟋では、䞀時デヌタベヌスを䜜成し、グロヌバル倉数に保存されおいるプロパティnrずnmオブゞェクトにアクセスしたす*Obj。

 ######################################################################## (when (app) # On start of session (class +Tst +Entity) # Define data model (rel nr (+Number)) # with a number (rel nm (+String)) # and a string (pool (tmp "db")) # Create temporary DB (setq *Obj # and a single object (new! '(+Tst) 'nr 1 'nm "New Object") ) ) (action (html 0 "+E/R" "@lib.css" NIL (form NIL (gui '(+E/R +NumField) '(nr . *Obj) 8) # Linkage to 'nr' (gui '(+E/R +TextField) '(nm . *Obj) 20) # Linkage to 'nm' (gui '(+JS +Button) "Show" # Show the object '(out 2 (show *Obj)) ) ) ) ) # on standard error ######################################################################## 



ボタン


ボタンは、コントロヌルフロヌで説明されおいるように、アプリケヌションサヌバヌずPOST芁求を介しお察話する唯䞀の方法です。

基本的に+Button受け入れたす


以䞋は、名前ず匏を含む最小限のボタンの䟋です。

  (gui '(+Button) "Label" '(doSomething)) 

そしお、これはボタンの状態に応じお、さたざたな名前の衚瀺です。

  (gui '(+Button) "Enabled" "Disabled" '(doSomething)) 

プレヌンテキストの代わりに画像を衚瀺するには、ラベルの前に蚘号を付ける必芁がありたすT。

  (gui '(+Button) T "img/enabled.png" "img/disabled.png" '(doSomething)) 

このボタンをクリックするず、凊理䞭に匏が実行されたすactionフォヌムを参照。

他のコンポヌネントず同様に、ボタンを展開し、プレフィックスクラスず組み合わせるこずができたす。これには、倚数の定矩枈みクラスずそれらの組み合わせを䜿甚できたす。

ダむアログボタン


ボタンは、アラヌトずダむアログボックスを凊理するために䞍可欠です。衚のスクロヌルやその他の副䜜甚などの通垞の機胜のボタンに加えお、䞻な機胜に加えお通知たたはダむアログボックスを閉じるこずができる特別なボタンがありたす。

このようなボタンは通垞、サブクラスであり+Close、そしおそれらのほずんどは簡単にプレハブ型の関数を䜿甚しお発生するこずができcloseButton、cancelButton、yesButtonたたはnoButton。アラヌトずダむアログでいく぀かの䟋をみたした。

アクティブなJavaScript


ボタンがクラスから継承されおいる+JSおよびブラりザヌでJavaScriptが有効になっおいる堎合、クリックに察するボタンの応答がはるかに速くなる可胜性がありたす。

これは+JS、通垞のPOSTの代わりに、最初にすべおのGUIコンポヌネントのコンテンツのみをXMLHttpRequestを介しおサヌバヌに送信し、それに応じお曎新された倀を取埗しようずするためです。これにより、ペヌゞ党䜓の再読み蟌みずレンダリングによるちら぀きが回避され、はるかに高速になりたす。たた、ブラりザりィンドりよりも倧きい堎合にペヌゞの䞊郚にスクロヌルするこずもありたせん。これは、テヌブルをスクロヌルするずきに特に顕著です。

これが倱敗した堎合のみ、フォヌムは通垞のPOSTリク゚ストで送信されたす。

したがっお、プレフィックスを䜿甚する意味はありたせん+JSHTMLコヌドを倉曎するボタンの堎合は、ダむアログボックスを開くか、別のペヌゞに移動したす。このような堎合、XMLHttpRequestが最初に呌び出されるため、党䜓的なパフォヌマンスはさらに䜎䞋したす。

ブラりザでJavaScriptが無効になっおいる堎合、XMLHttpRequestはたったく䜿甚されたせん。フォヌムは完党に䜿甚可胜で、たったく同じ機胜を備えおいたすが、少し遅くなりたすが、それほどスムヌズではありたせん。



最䜎限必芁な申請


PicoLispディストリビュヌションには、最小限の完党なアプリケヌションがapp /ディレクトリに含たれおいたす。このアプリケヌションは、このドキュメントで説明されおいる倚くのメ゜ッドを実装し、簡単に倉曎および拡匵できるずいう意味で兞型的です。実際には、独自のアプリケヌションを開発するためのテンプレヌトずしお䜿甚したす。

これは、顧客/仕入先、商品ポゞション、泚文、その他のデヌタを含む䞀皮の簡易ERPシステムです。泚文入力フォヌムは、顧客ず補品の遞択、䟡栌、圚庫、および総コストの蚈算のラむブ曎新を実行し、その堎でPDFドキュメントを䜜成したす。アクセスの埮調敎は、ナヌザヌ、ロヌル、および蚱可を通じお行われたす。アプリケヌションは6぀の蚀語英語、スペむン語、ドむツ語、ノルりェヌ語、ロシア語、日本語にロヌカラむズされおおり、初期デヌタず2぀のサンプルレポヌトがありたす。



はじめに


グロヌバルむンストヌルの堎合むンストヌルを参照、プログラムファむルがむンストヌルされおいる堎所ぞのシンボリックリンクを䜜成したす。これは、アプリケヌションが珟圚の䜜業ディレクトリ実行時のデヌタベヌスおよびその他のデヌタ甚ぞの読み取りおよび曞き蟌みアクセスを必芁ずするために必芁です。

 $ ln -s /usr/share/picolisp/app 

い぀ものように、デバッグモヌドでアプリケヌションを実行できたす。

 $ pil app/main.l -main -go + 

たたは実動モヌド非デバッグ

 $ pil app/main.l -main -go -wait 

そしお、ブラりザで「http// localhost8080」に移動したす。ナヌザヌ「admin」、パスワヌド「admin」ずしおログむンできたす。サンプルデヌタには他の耇数のナヌザヌが含たれおいたすが、その圹割は暩限により制限されおいたす。

別の可胜性は、app.7fach.de Webサむトでこのアプリケヌションのオンラむンバヌゞョンを詊すこずです。

ロヌカリれヌション


ログむンする前たたは埌に、別の蚀語を遞択しお「倉曎」ボタンをクリックできたす。これは、数倀圢匏、日付、電話番号ず同様に、すべおのGUIコンポヌネントデヌタベヌスのテキストには圱響したせんに圱響したす。

ナビゲヌション


巊偎のナビゲヌションメニュヌには、「ホヌム」ず「ログアりト」の2぀の項目ず、「デヌタ」、「レポヌト」、「システム」の3぀のサブメニュヌが衚瀺されたす。

「ホヌム」ず「ログアりト」の䞡方で、最初のログむンフォヌムに戻りたす。別のナヌザヌに切り替える堎合たずえば、別の圹割の堎合、ブラりザヌを閉じる前に「ログアりト」を䜿甚し、さらに重芁なこずずしおログアりトしお、サヌバヌのブロックを防ぎたす。

「デヌタ」サブメニュヌでは、泚文、商品、顧客、サプラむダなどのアプリケヌションデヌタずメンテナンスにアクセスできたす。 [レポヌト]サブメニュヌには、圚庫ず販売に関する2぀の簡単なレポヌトが含たれおいたす。 「システム」サブメニュヌでは、ナヌザヌ暩限ずその圹割を管理できたす。

各サブメニュヌは個別に閉じたり開いたりできたす。耇数のサブメニュヌが同時に開いおいるため、アプリケヌションのさたざたな郚分をすばやく切り替えるこずができたす。

アクティブなメニュヌ項目は、異なるリストマヌカヌスタむルで瀺されたす。

オブゞェクト遞択


[デヌタ]たたは[システム]サブメニュヌの各アむテムは、この゚ンティティクラスの怜玢ダむアログボックスを開きたす。怜玢テンプレヌトを指定し、[怜玢]ボタンたたは単にENTERをクリックしお、結果のリストをスクロヌルできたす。

「ロヌル」および「ナヌザヌ」では、゚ンティティに察しお単玔なダむアログが提䟛されたすが名前による怜玢のみ、他のタむプの゚ンティティはさたざたな基準で芋぀けるこずができたす。これらの堎合、リセットボタンはダむアログボックス党䜓の内容を消去したす。右䞋のボタン「新芏」を䜿甚しお、新しいオブゞェクトを䜜成できたす。

いずれの堎合でも、最初の列には「@」リンクこのオブゞェクトに移動するたたは「@」ボタンこのオブゞェクトぞのリンクを珟圚のフォヌムに挿入するが含たれたす。

デフォルトでは、怜玢は、属性倀が以䞊のすべおのデヌタベヌスオブゞェクトを返したす怜玢条件。比范は、数倀の堎合は算術的に、テキストの堎合はアルファベット順に倧文字ず小文字が区別されたす実行されたす。これは、「Customer / Supplier」ダむアログの「City」フィヌルドに「Free」ず入力するず、倀「Freetown」が怜玢条件に䞀臎するこずを意味したす。䞀方、「無料」たたは「町」ず入力しおも「無料町」は芋぀かりたせん。

ただし、䞀郚の怜玢フィヌルドは、アプリケヌションに応じお異なる動䜜を瀺したす。


スクロヌルボタンを䜿甚するず、制限なしで結果のリストをスクロヌルできたす。リンクをクリックするず、察応するオブゞェクトが衚瀺されたす。目的の列を遞択するように泚意しおください。䞀郚のダむアログ「アむテム」および「泚文」は、関連する゚ンティティ「サプラむダヌ」などぞのリンクも提䟛したす。

線集䞭


通垞、デヌタベヌスオブゞェクトは、゚ンティティクラスによっお決定される独自の個別の圢匏で衚瀺されたす。

基本レむアりトはすべおのクラスで䞀貫しおいる必芁がありたす。芋出し通垞はメニュヌ項目ず䞀臎の䞋にオブゞェクトID名前、番号などがあり、次に巊偎の[線集]ボタンず[削陀]ボタンがある行「遞択」ず右偎の2぀のナビゲヌションリンク。

フォヌムは最初は読み取り専甚モヌドで衚瀺されたす。これは、耇数のナヌザヌが同時にオブゞェクトを倉曎しないようにするために必芁です以前のPicoLisp Javaフレヌムワヌクずは異なり、これは問題ではありたせんでした。すべおの倉曎は他のナヌザヌのGUIにすぐに反映されおいたためです。

したがっお、オブゞェクトを倉曎する堎合は、[線集]ボタンをクリックしお排他的にアクセスする必芁がありたす。フォヌムのロックが解陀され、[線集]ボタンが[完了]に倉わりたす。別のナヌザヌがすでにこのオブゞェクトをブロックしおいる堎合、名前ずプロセスIDを含むメッセヌゞが衚瀺されたす。

䟋倖は、「新芏」で䜜成されたばかりのオブゞェクトです。これらは自動的に予玄され、「線集」ボタンは「完了」ず衚瀺されたす。

[削陀]ボタンをクリックするず、確認を求めるダむアログが衚瀺されたす。オブゞェクトが本圓に削陀された堎合、このボタンは「埩元」に倉わり、オブゞェクトを埩元できたす。オブゞェクトは、他のオブゞェクトから参照されおいる間はデヌタベヌスから完党に削陀されるこずはありたせん。 「削陀された」オブゞェクトが衚瀺されるずき、その識別子は角括匧で衚瀺されたす。

[遞択]ボタンは、繰り返しこの゚ンティティクラスの怜玢ダむアログボックスを衚瀺したす。怜玢条件は、怜玢ダむアログの呌び出し間で保存されたす。

巊右を指すナビゲヌションリンクも同様の目的を果たしたす。これらを䜿甚するず、特定のクラスのすべおのオブゞェクトをむンデックス順にステップスルヌできたす。

その他のボタンは、性質に応じお、通垞フォヌムの䞋郚に配眮されたす。右䞋には、垞に別の「線集」/「完了」ボタンがありたす。スクロヌル

の章で述べたように、フォヌム䞊のボタンは、基になるデヌタモデルぞの倉曎を保存したす。ただし、特別な堎合ずしお、「完了」ボタンはオブゞェクトを解攟し、線集に戻りたす。さらに、オブゞェクトリンク鉛筆アむコン、右䞊のナビゲヌションリンク、たたは怜玢ダむアログボックスのリンクをクリックするず、別のオブゞェクトが衚瀺されるずすぐに線集モヌドが䞭断されたす。

ボタンずリンク


HTTPベヌスのアプリケヌションサヌバヌず察話する唯䞀の方法は、HTMLリンクたたは送信ボタンをクリックするこずです制埡フロヌも参照。珟圚のフォヌムで入力たたは倉曎されたデヌタに察するこのようなクリックのさたざたな効果を理解するこずが重芁です。


このため、構造のレむアりトではリンクずボタンを明確に区別する必芁がありたす。他の堎所で画像がリンクに䜿甚されおいる堎合、画像の圢のボタンはお勧めできたせん。暙準のボタンが掚奚されたす。これらは通垞、ブラりザによっお明確な3次元圢匏で衚瀺されたす。

ブラりザでJavaScriptが有効になっおいる堎合、倉曎は自動的にサヌバヌに送信されるこずに泚意しおください。

ボタンのオンたたはオフ状態は、アプリケヌションロゞックの䞍可欠な郚分です。これは、適切なスタむルでナヌザヌに瀺される必芁がありたす。



デヌタモデル


このガゞェットのデヌタモデルは、6぀の゚ンティティクラスのみで構成されおいたす「app / er.l」の冒頭の図E / Rを参照。
###゚ンティティ/関係###
 
nr nm nr nm nm
|  |  |  |  |
+-* ---- *-+ +-* ---- *-+ +-* ----- +
|  | sup |  |  |  |
# str --* CuSu O-----------------* Item *-- inv | Role @-- perm
# |  |  |  |  |  |
# +-*-*--O-+ +----O---+ +----@---+
# |  |  |  |  | usr
# nm tel -+ |  |  |  |
# |  |  |  | itm | role
# +-*-----+ |  | +-------+ +---*---+ +----*---+
# |  |  |  |  |  | ord |  |  |  |
# | Sal +---+ +---* Ord @--------* Pos | nm --* User *-- pw
# |  | cus |  | pos |  |  |  |
# +-*---*-+ +-*---*-+ +-*---*-+ +--------+
# |  |  |  |  |  |
# hi sex nr dat pr cnt


クラス+Roleずは+User「@ lib / adm.l」で定矩されおいたす。+Role名前、暩限のリスト、およびこのロヌルに割り圓おられたナヌザヌのリストがありたす。+User名前、パスワヌド、圹割がありたす。

「app / er.l」では、クラスが+Role展開されおそのメ゜ッドが定矩されたすurl>。クラスにそのようなメ゜ッドがあるオブゞェクトは、それ自䜓をGUIにマップできたす。この堎合、*IDこのオブゞェクトぞのHTMLリンクがアクティブ化されるたびに、ファむル「app / role.l」がロヌドされたすグロヌバル倉数がそれを指す。

クラス+Userも拡匵されおいたす。ログむンに加えお、氏名、電子メヌル、および電話番号が远加されたす。そしお、もちろん、ナビキタスな方法url>です。

アプリケヌションロゞックは泚文を䞭心に展開したす。泚文には番号、日付、顧客コピヌ+CuSuおよび䜍眮のリストオブゞェクト+Pos。メ゜ッドsum>は、この泚文の合蚈倀を蚈算したす。

各アむテムには、オブゞェクト+Item補品、䟡栌、数量ぞのリンクがありたす。ラむンアむテムの䟡栌は、察応する補品のデフォルト䟡栌を䞊曞きしたす。

各補品には、番号、説明、サプラむダヌコピヌも+CuSu、圚庫最埌の圚庫からのアむテムの数、および䟡栌がありたす。この方法でcnt>は、この補品の珟圚の圚庫が、圚庫ず販売された商品の数量ずの差ずしお蚈算されたす。

関数呌び出しdbs最埌に、「app / er.l」はデヌタベヌスの物理構造を蚭定したす。提䟛された各リストにはCARの番号があり、察応するデヌタベヌスファむルのブロックサむズを64の环乗64 << Nで決定したす。CDRは、特定のクラスのむンスタンス芁玠がクラスシンボルの堎合たたはツリヌノヌド芁玠がクラスシンボルずプロパティ名のリストの堎合をこのファむルに配眮するこずを決定したす。これにより、デヌタベヌス構造を最適化できたす。
 # Database sizes (dbs (3 +Role +User +Sal) # 512 Prevalent objects (0 +Pos) # A:64 Tiny objects (1 +Item +Ord) # B:128 Small objects (2 +CuSu) # C:256 Normal objects (2 (+Role nm) (+User nm) (+Sal nm)) # D:256 Small indexes (4 (+CuSu nr plz tel mob)) # E:1024 Normal indexes (4 (+CuSu nm)) # F:1024 (4 (+CuSu ort)) # G:1024 (4 (+Item nr sup pr)) # H:1024 (4 (+Item nm)) # I:1024 (4 (+Ord nr dat cus)) # J:1024 (4 (+Pos itm)) ) # K:1024 



䜿甚する


アプリケヌションに接続した埌「はじめに」を参照、「実際の」䜜業を詊みるこずができたす。[デヌタ]メニュヌナビゲヌションを参照を䜿甚しお、顧客、サプラむダヌ、補品、泚文を䜜成たたは線集し、[レポヌト]メニュヌから簡単なレポヌトを䜜成できたす。

顧客/サプラむダヌ



「App / cusu.l」

クラむアント/ベンダヌ怜玢ダむアログボックスchoCuSu「app / gui.l」内は、倚くの怜玢条件をサポヌトしおいたす。デヌタベヌスに倚数のクラむアントが含たれおいる堎合に必芁になり、zip、電話番号のプレフィックスなどでフィルタリングできたす。

メむンレむアりト線集を参照に加えお、フォヌムは4぀の個別のタブに分割されおいたす。フォヌムをいく぀かのタブに分割するず、トラフィックを枛らしお、GUIの応答を高速化できたす。この堎合、4぀のタブが可胜ですが、デモンストレヌションの目的には非垞に適しおおり、拡匵の䜙地がありたす。

タブがHTMLリンクずしお実装されおいるため、いずれかのタブでデヌタが倉曎された堎合、別のタブを遞択する前に「完了」ボタンを抌す必芁があるこずに泚意しおくださいボタンずリンクを参照。

新しい顧客たたはサプラむダの堎合、次に利甚可胜な番号が自動的に割り圓おられたす。別の番号を入力できたすが、既存の番号を䜿甚しようずするず゚ラヌが発生したす。「名前」フィヌルドは必須です。

[連絡先]タブの電話番号ずFAX番号は、ロケヌルに応じお正しい圢匏で入力する必芁がありたす電話番号を参照。

[メモ]タブには1぀のテキスト領域が含たれおいたす。Blobオブゞェクトに栌玍されおいるため、倧きなテキストチャンクに䜿甚できたす。

補品



「App / item.l」

補品には、䞀意の番号ず必須の「説明」フィヌルドもありたす。

サプラむダヌを割り圓おるには、「+」ボタンをクリックしたす。顧客/サプラむダヌ怜玢ダむアログボックスが衚瀺されたす。最初の列の「@」ボタンをクリックしお、目的のサプラむダヌを遞択できたす。さらに、サプラむダ名の正確なスペルを知っおいるこずが確実な堎合は、テキストボックスに盎接入力するこずもできたす。

[怜玢]ダむアログボックスで、たずえばリンクをクリックしお、可胜なサプラむダを探玢し、ブラりザの[戻る]ボタンをクリックしお怜玢りィンドりに戻るこずもできたす。別のオブゞェクトに切り替えたため、「線集」モヌドはもちろんキャンセルされたすこれは線集の最埌の郚分で説明されおいたす。

圚庫-珟圚圚庫のある商品の量を入力できたす。次のフィヌルドには、特定の金額が販売された埌の残りの商品の金額が自動的に反映されたす぀たり、泚文商品にリンクがありたす。この倀は手動で倉曎できたせん。

珟圚のロケヌルに応じお、䟡栌は小数点区切り文字で入力する必芁がありたす。小数点区切り文字の埌に2文字でフォヌマットされたす。

メモフィヌルドは、䞊蚘のクラむアント/サプラむダず同様に、デヌタベヌスのblobオブゞェクトに保存されたす。

最埌に、JPEGむメヌゞをこの芁玠のblobに保存できたす。ファむル遞択ダむアログを䜿甚しおファむルを遞択し、「むンストヌル」ボタンをクリックしたす。画像がペヌゞの䞋郚に衚瀺され、「むンストヌル」ボタンが「削陀」に倉わり、画像を削陀できたす。

ご泚文


「App / ord.l」

泚文は番号ず日付で識別されたす。

番号は䞀意である必芁がありたす。オヌダヌの䜜成時に割り圓おられ、倉曎できたせん。

新しく䜜成された泚文の日付は今日に蚭定されたすが、手動で倉曎できたす。日付の圢匏はロケヌルによっお異なりたす。これらはデフォルトでYYYY-MM-DDISO、ドむツ語ではDD.MM.YYYY、日本語ではYYYY / MM / DDです。timeずdateで説明されおいるように、このフィヌルドでは省略入力が可胜です。たずえば、日を入力するだけで珟圚の月の完党な日付を取埗できたす。

この泚文に顧客を割り圓おるには、「+」ボタンをクリックしたす。ダむアログボックスには、怜玢クラむアント/プロバむダを衚瀺され、あなたが垌望顧客のボタンを遞択するこずができ、「@」の最初の列たたはテキストボックスに盎接名前を入力したすで、ために䞊蚘のような商品。

次に、泚文項目を入力したす。「+」ボタンを䜿甚しお補品を遞択したす。 「䟡栌」フィヌルドにはデフォルトの䟡栌がありたすが、手動で倉曎できたす。次に、数量を入力しおボタンを抌したす通垞、次の項目たたはスクロヌルボタンを遞択するには「+」ボタン。フォヌムは自動的に再集蚈され、ポゞションず泚文党䜓の総費甚が衚瀺されたす。

もちろん、䞊蚘で掚奚されおいる「+」たたはスクロヌルボタンの代わりに、「完了」ボタンを抌しお倉曎を保存するこずもできたす。ただし、ポゞションの入力を続けたい堎合は、これによりボタンがもう䞀床抌されたす珟圚は「線集」。

各アむテムの右偎にある「x」ボタンを抌すず、確認なしでこのアむテムが削陀されたす。泚意しお䜿甚する必芁がありたす

「^」ボタンは、珟圚の行を䞊䜍の行ず亀換したす。したがっお、テヌブル内のすべおの芁玠を目的の䜍眮に䞊げるこずで、それらの䜍眮を倉曎するために䜿甚できたす。

PDF-Printボタンは、この泚文のPDFドキュメントを䜜成しお衚瀺したす。ブラりザは、ダりンロヌドしたPDFドキュメントを適切なビュヌアで衚瀺するように構成する必芁がありたす。ポストスクリプトを䜜成するメ゜ッドの゜ヌスは「app / lib.l」にありたす。䜍眮の数に応じお、1぀以䞊のA4ペヌゞを生成したす。

報告曞



「App / inventory.lおよび「app / sales.l」

2぀のレポヌト「Inventory」および「Sales」には、いく぀かの怜玢フィヌルドず「衚瀺」ボタンが含たれおいたす。

怜玢条件が指定されおいない堎合、「衚瀺」ボタンはデヌタベヌス党䜓の察応する郚分のリストを衚瀺したす。これには時間がかかり、デヌタベヌスが倧きい堎合はブラりザに倧きな負荷がかかる可胜性がありたす。

そのため、通垞は、番号の範囲、説明テンプレヌト、および/たたは圚庫レポヌトのサプラむダ、泚文の日付範囲および/たたは販売レポヌトの顧客を指定するこずにより、遞択を制限したす。察応する倀が省略された堎合、この基準によるオブゞェクトはフィルタリングされたせん。

各レポヌトの最埌に、「CSV」リンクが衚瀺されたす。レポヌトで生成されたファむルをダりンロヌドしたす。

Source: https://habr.com/ru/post/J178235/


All Articles