php及wml的一些相關知識

來源:互聯網
上載者:User
摘入兩段Discuz的wap頭尾函數,這樣對於書寫wap可以省去一些麻煩;順便轉載wml編程初級知識
function wapheader($title) {
 
 header("Content-type: text/vnd.wap.wml; charset=utf-8");
 /*
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
 header("Cache-Control: no-cache, must-revalidate");
 header("Pragma: no-cache");
 */
 echo "<?xml version=\"1.0\"?>\n".
  "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n".
  "<wml>\n".
  "<head>\n".
  "<meta http-equiv=\"cache-control\" content=\"max-age=180,private\" />\n".
  "</head>\n".
  "<card id=\"discuz_wml\" title=\"$title\">\n";
  // newcontext=\"true\"
}

function wapfooter($returnpage='') { 
 echo ($action != 'home' ? "<anchor title=\"confirm\"><prev/>返回</anchor> <a href=\"index.php\">首頁</a><br />" : '').
 "協助資訊  精彩推薦<br/>".
  "<small>Powered by Discuz!</small></p>\n".
  //"<do type=\"prev\" label=\"返回上一頁\"><exit /></do>\n".
  "</card>\n".
  "</wml>";
 }
}

//===============================================
//wml編程參考
//===============================================
卡片、卡片組及其屬性

 

  1.1 共有屬性

  WML元素的共有屬性主要有3個:id、class和xml:lang屬性。

  WML的所有元素都有兩個核心屬性,即標示(id)和類(class)屬性。它們主要用於伺服器方的資訊傳輸。其中,id屬性用於定義元素在卡片組中的唯一標示,即它的名稱;class屬性用於給當前元素定義一個或更多的類(class)。與卡片組一樣,類(class)也是有名字的,而且多個元素可以使用一個類(class)名。具有相同類名的單一卡片組中的所有元素均可被看作相同類的一個部分。類名是區分大小寫。如果在class屬性列表中,一個元素多個唯一的類名,那麼該元素可以看作這些類中的一部分。具有同一屬性的多個類名必須用兩個以上的空格間隔,WML程式執行時將忽視其中多餘的類名及其屬性。

  另外,在WML程式,所有包含文本的元素均具有“xml:lang”屬性。該屬性用於指定當前元素及其屬性所用的描述語言,如英國英語、美國英語、法語、德語等,並可以為使用者瀏覽器選擇顯示文本的語言提供依據。

  1.2 WML程式的檔案頭

  合法的WML卡片組均屬合法的WML檔案,因此它必須包含WML的聲明及檔案類型的聲明。典型的WML程式的檔案頭包括我們前面多次提到的以下兩行程式:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//wapforun//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">

  編寫WML程式時,我們必須寫入這兩行程式,並放在程式的開始處。其中"-//wapforun//DTD WML 1.1//EN"是標準通用標記語言 (SGML)SGML的公用標示;"http://www.wapforum.org/DTD/wml_1.1.xml"是WML程式文件類型的標示。文件類型標示也可以是"text/vnd.wap.wml"或“application/vnd.wap.wmlc”,其中前者制定WML的原文類型,後者制定WML程式編譯後代碼類型。

  1.3 WML元素

  WML的WML元素用於定義一個卡片組,並通過<wml>與</wml>標籤包含和封裝該卡片組中的所有卡片及資訊。它的文法格式如下:

<wml xml:lang="lang">
內容(content)
</wml>

  其中xml:lang="lang"用於指定文檔所用語言(前面已有介紹),語言"lang"的值屬於NMTOKEN型資料。

  wml元素中包含的內容(content)中除了文本、映像等資訊之外,還可以包含head、template及card元素。其中head、template元素如果包含的話則只可包含一次,而card元素必須至少包含一次。有關這些元素的用法我們後面介紹。

  1.4 template元素

  template元素用於為當前卡片組中的所有卡片定義一個模板,同一規定卡片的某些參數。模版中的事件處理功能則可將這些參數自動應用於同一卡片組中的所有卡片。不過,我們也可以是其中某個或某幾個卡片不採用模板規定的形式,方法是在該卡片中定義一個同名的事件來替代模板塊中相應的事件。template元素通過<template>和</template>標籤含所需內容(content)而實現模板功能的,其文法格式如下:

<template oneterforward="href" onenterbackwared="href" ontimer="href">
內容(content)
</template>

  template元素包含的內容中,除了卡片的一般參數外,還可以包含任意多次的do元素和onevent元素。template元素屬性的功能及用法說明如下:

  1)oneterforward。當使用者在瀏覽器中進入當前卡片時,該屬性將指定超鏈(href)的URL地址,瀏覽器將據此開啟URL指定的卡片或事件。

  2)oneterbackward。與上一屬性類似,該屬性也可以指定其相應卡片或事件的URL地址。如果使用者瀏覽時執行prev任務,那麼瀏覽器就會定位到該屬性所指定超鏈(href)的URL地址,並開啟URL指定的卡片或事件。

  3)ontimer。當指定時間timer到期的時候,使用者瀏覽器就根據ontimer屬性指定的URL開啟相應的卡片。

  1.5 card元素

  WML的卡片組是由一個或多個卡片(card)構成的,每個卡片都包含有一套使用者和瀏覽器互動操作的配置及模式。使用者對互動操作的需求是多樣性的,所以卡片定義時也必須是多樣性的。為此,WML提供了card元素,通過<card>和</card>標籤定義一個卡片的各種屬性、包含內容。它的文法格式如下:

<card id="name" title="label" newcontext="boolean" ordered="true" onenterforward="href" onenterbackward="href" ontimer="href">
內容(content)
</card>

  card元素中包含的內容(content)中除了文本、映像資訊之外,還可以包含onevent、timer、do和p元素。其中,timer元素只可使用一次,其餘3種可使用多次。而且,如果card元素包含onevent元素或timer元素的話,那麼onevent元素必須放在最前面,timer元素放在onevent元素的後面,隨後才可以使用do或p元素。這個優先順序是不能亂的。

  card元素屬性的功能及用法介紹如下:

  1)id。用於指定card的名字。改名字是程式導航定位的依據,可以用作程式段錨點,比如<go href="#cardname"/>。其中的cardname便是由id指定的卡片名。

  2)title。用於為卡片制訂一個簡單的標題或說明資訊。

  3)newcontext。用於指定WAP手機瀏覽當使用者重新進入的時候是否需要初始化卡片中所有的內容。它有true和false兩種選擇,當指定newcontext="ture"時,卡片的所有內容在使用者重新進入時將進行初始化,也不清除曆史紀錄;否則,指定newcontext="false"時,將不進行初始化設定,也不清除曆史紀錄。預設狀態下的設定值為false。另外,newcontext僅當作為go任務的一部分時才可被執行。

  4)ordered。用於向使用者手機的瀏覽器指明卡片內容的組織形式,以便讓瀏覽器根據自身特點及卡片內容組織及時安排顯示布局。它有兩種布爾值得設定,即true和false。

  當ordered="true"時,瀏覽器將按照線性順序顯示卡片各地區的內容。這個線性順序通常是大多數使用者所習慣採用的資訊瀏覽順序,比如發送E-mail資訊時,我們依次需要E-mail首件人地址、主題及E-mail內容,這個邏輯順序就數線性順序。

  當ordered="flase"時,瀏覽器將根據使用者選擇或指定的順序來顯示內容。這種情況主要是用於顯示使用者選項、無序組建或使用者輸入的簡單資料紀錄等。

  5)onenterforward。onenterforward事件僅當使用者使用go任務或類似於go的任務位和瀏覽卡片時才可發生,即如果使用者執行go任務,則瀏覽器就會定位<go>標籤中指定超鏈(href)的URL指定的卡片。card元素中的onenterforward屬性是onevent元素的一個簡單格式,用於直接指定onenterforward事件的URL地址。

  6)onenterbackward。該屬性可以指定其回應時間的URL地址。如果使用者瀏覽時執行prev任務,那麼瀏覽器就會定位到該屬性所制定超鏈 (href)的URL地址,並開啟URL指定的卡片。onenterbackward屬性也屬於onevent元素的一個簡單格式。

  7)ontimer。當指定時間timer到期的時候,使用者瀏覽器就根據ontimer屬性指定的URL開啟相應的卡片。它也屬於onevent元素的一個簡單格式。

  1.7 access元素

  access元素是由一個單獨的的標籤<access>標籤實現的元素。用於定義WML整個卡片組的操作許可權,即存取控制參數。access元素必須在head元素內和其它的meta資訊一起聲明,而且每個卡片組只能有一個access元素。其文法格式如下:

<head>
<access domain="domain" path="path">
...
</head>

  access元素屬性的功能及用法如下:

  1)domain。用於指定對卡片組進行操作的URL域,預設域是當前卡片組所在的域。domain的目的是限制訪問,使用者瀏覽時瀏覽器將根據domain值所規定的值來得出與值匹配的地址,並訪問該地址對應的卡片或事件。 2)path。用於指定卡片組操作的其它卡片組所在的根目錄。預設目錄是“/”,即當前卡片組所在的根目錄。預設目錄的規定使得所有在domain域下的卡片組都可以操作當前卡片組。path的值是訪問時需要匹配的路徑,它的工作原理與domain十分相似,需要與路徑的每個子路徑相匹配,否則均屬無效。

  1.8 meta元素

  meta元素用於定義WML卡片組相關的通用meta資訊。該元素是由一個單獨的標籤即<meta/>標籤實現的元素,其文法格式如下:

<meta name="name"|http-equiv="name" content="value" forua="true|false" scheme="format"/>

  其中,name屬性和http-equiv屬性只能選擇使用一個;content屬性是必選的,其值根據屬性而定;scheme屬性目前尚不支援;forua屬性為可選屬性。各屬性功能及用法說明如下:

  1)content。該屬性用於指定meta資訊的性質的值,是不必選的。

  2)name。用於指定meta資訊性質的名稱。使用者瀏覽器通常忽略已經命名meta資料,網路服務企業拒絕發送包含該屬性所指定meta資料名稱的內容。

  3)http-equiv。該屬性用於替代name屬性,可將meta資料轉為WSP或HTTP協議的回應標頭。

  4)forua。該屬性用於指定那些開發人員希望傳送值使用者瀏覽器的性質。它有ture和fales兩個取值,如果取false,則卡片組在發送往用戶端以前必須用中間代理去除meta元素資訊,這是因為傳輸的協議可能改變;若取值為true,則meta資料必須如實送往使用者的瀏覽器。預設的狀態下,該屬性的值為false。

  5)scheme。該屬性用於指定解釋meta資訊性質值的形式或結構。具體的形式或結構因meta資料的類型不同而不同。

  2 任務及其元素

  WML允許我們在程式中指定一些任務,當某些特定的事件啟用時,即可執行這些任務,從而完成需要的操作。例如,我們可以設定任務,當使用者按下相應的功能鍵時,瀏覽器就可以開啟指定的卡片組或卡片。目前,WML提供了4個任務元素,即go、prev、noop和refresh,它們主要與do元素和onevent元素中指定的事件相響應。本節我們就對任務的這些元素做一詳細介紹。

  2.1 go任務

  go任務是通過go元素來聲明的,而go元素是通過<go>和<go/>標籤進行定義的。go元素主要用來定義瀏覽器需要導航的URL地址。如果該地址是一個WML卡片或卡片組的名字,則瀏覽器就會開啟並顯示相應的卡片、卡片組;否則,瀏覽器就會執行該URL指定的任務或事件等。在曆史推棧中,go任務執行的是一個“推進(push)”操作,也就是說,它執行時瀏覽器瀏覽的URL地址將送入曆史紀錄列表中,以被它用。

  go元素中可以包含任意次的setvar元素或postfield元素。postfield元素前面已有介紹,這裡不再重述,setvar元素我們後面介紹。

  go任務的文法格式如下:

<go href="href" sendreferer="false|true" method="get|post" accept-charset="charset">
內容(context)
<go/>

  其中屬性的功能及用法介紹如下:

  1)href。該屬性用於指定目標URL地址,比如讓瀏覽器顯示的卡片的地址即名稱等。屬性是必選的,其它屬性為可選。

  2)sendreferer。該屬性用於指定是否傳遞調用href所指定的URL的卡片的URL,也是當前頁的URL,即HTTP頭中HTTP_REFERER。有兩種選擇:true或false。其中,預設值為false。

  3)method。與HTML中的表單FORM的method屬性一樣,該屬性用於指定表單是以GET的方式還是post的方式遞交,以便通用閘道介面CGI處理。預設值為get,但如果沒有指定method屬性,而<go>和<go/>之間存在postfield元素,則WAP手機瀏覽器會自動以post方式傳遞。

  4)accept-charset。當web伺服器處理來自瀏覽器的輸入資訊時,該屬性可指定伺服器進行資料編碼時必須採用的字元集列表。也就是說,該屬性指定的字元集替代HTTP頭裡指定的字元集,以便作為伺服器選用字元集的標準。

  2.2 prev任務

  prev任務是由prev元素實現的。該元素通常是一個單獨的標籤<prve/>,不過有時也可由<prev>和</prev>一對標籤進行定義。它用於指定將瀏覽器導航至曆史推棧中的前一個URL地址。在瀏覽器操作的曆史推棧中,prev任務執行的是“取出”操作,將前一個URL地址取出,並把當前URL地址推進曆史推棧。如果曆史推棧中沒有前一個URL地址,即prev/元素不執行任何任務。

  prev任務的文法格式為:

<prev/>
或<prev> 內容(content) </prev>

  在後一文法格式中,prev元素包含的內容裡面一般是setvar元素,該元素的含義前面已有介紹,這裡不再重述,具體的用法隨後介紹。

  2.3 refresh任務

  refresh任務由refresh元素宣告,它用於重新整理當前的卡片,對卡片內指定的變數進行更新。其文法格式為:

<refresh>
內容(context)
</refresh>

  其中包含的內容(content)中一般有setvar元素,其文法格式為<setvar name="name" value="value"/>,它可指定更新的變數名name,即更新的變數值value。另外,refresh元素也可以不包含setvar元素。而通過時間限制(timer元素)對卡片進行重新整理。

  2.4 noop任務

  noop任務由noop元素進行聲明,表示什麼也不做,是一個空操作,在替代卡片組級的do元素是十分有用。該元素是一個單獨的標籤,即 <noop/> 標籤。其文法格式如下:

<nnop/>

  noop元素沒有屬性,下面的簡單程式中就包含了noop元素實現得空任務操作:

<card id="card1">
<do type="options" name="dome">
<noop/>
</do>
...
</card>

  3 時間及其元素

  WML提供了幾個元素,專門用於處理使用者瀏覽器的導航和事件。利用這些元素使用者可以給某任務制定關聯事件。那麼當事件觸發時,瀏覽器就會執行相應的任務,比如URL導航就是通過事件實現的。而且,事件可以和一個需要完成的任務捆綁在一起。事件捆綁時一般是通過幾種元素及其標籤聲明來實現的,如go、do和onevent等元素。下面我們就講解WML的事件元素及事件。

  3.1 do元素

  do元素提供了一個通用的事件處理機制,使得使用者可以參與當前卡片的事件處理。通過<do>和</do>標籤將使用者互動和某一個任務聯絡在一起。使用者互動可以是使用者按下的功能鍵、選擇的功能表項目,也可以是使用者的聲音提示。當使用者啟用這些互動功能時,使用者瀏覽器就會執行與do元素相關的任務。其文法格式如下:

<do type="type" label="label" name="name" optional="boolean">
任務(task)
</do>

  其中tast是與do元素關聯的動作,也是條件啟用時瀏覽器即將執行的內容。在do元素中,使用者必須綁定且只能綁定go、prev、noop和refresh四種元素所實現任務中的一個任務(task)。go元素用於定位制定的URL地址,prev元素用於定位並開啟前一操作或任務,doop為空白操作,refresh用於重新整理當前卡片組或任務,有關他們的詳細用法我們後面會陸續介紹。

  do元素可以用於卡片一級,也可用於卡片組一級。當用於卡片一級時,do元素必須包含在card元素中;而用於卡片組一級時,do元素必須包含在template元素中,由此定義的do元素將同時應用於當前卡片組的所有卡片。此時如果某個卡片不想應用模板中的do元素及其任務,則需採用我們前面介紹的方法,使用同名事件處理來替代模板中的do元素的事件處理。而且,不論事件關聯的任務是否相同,當do元素定義的事件名稱相同時,卡片的do元素將忽視卡片組一級do元素的影響,及卡片一組的do元素將被優先執行。

  另外,含有空操作任務的do元素,不論它是否被啟用,它都不會傳送或顯示到使用者的瀏覽器中,這在一定程度上可以加快瀏覽器的工作效率,因為伺服器端體它拋棄了一些空任務的判斷。 do元素各個屬性的功能及用法講解如下:

  1)type。用於指定do元素的類型(type),也即需要關聯、綁定的使用者互動事件,是必選屬性。使用者瀏覽器接到這些事件後,就會啟用它們並執行相應的操作與處理。如果在一個卡片中定義了多個do元素並擁有同樣type,那麼使用者必須為每個do指定不同的事件名才行,否則就會發生判斷混亂的錯誤。

  do元素典型的類型(type)及執行條件介紹如下:

  1、accept。當使用者選擇或按下相應功能鍵時(accept)、選項、命名或按鈕時,瀏覽器接收或啟用當前所作選擇。

  2、prev。啟用prev鍵時,瀏覽器將導航到記錄中的前一個卡片。

  3、help。啟用HELP功能鍵或相應按鈕、命名時,瀏覽器顯示與當前內容相關的協助資訊。

  4、reset。啟用reset功能鍵或相應按鈕、命名時,清除或重設當前卡片組或瀏覽器的狀態。

  5、options。啟用options功能鍵或相應按鈕、命名時,瀏覽器顯示與當前內容有關的選項或附加操作。

  6、delete。啟用delete功能鍵或相應按鈕、命名時,刪除當前項目或選擇。

  7、unknown。如果給出的類型不能為do元素所識別,則一律按照unknown型處理,相當於類型為空白,即type=""。

  8、vnd.*。vnd.*及其它不同大小寫組合[Vv][Nn][Dd].*。這種類型定義的都是vnd.cotype,用於啟用供應商或使用者瀏覽器自訂的某個特定功能,其中co為公司(company)名的縮寫。

  9、X-*與X-*。擴充類型,目前WML中還沒有使用。

  2)label。該屬性指定的文本字串可以表示使用者的互動事件。例如,當把某一個任務綁定在accept鍵上之後,並設定了label屬性,比如label="gone",那麼瀏覽器就會將label的值“gome”顯示在螢幕上;如果不指定,瀏覽器則會顯示預設的“ok”字串。為了保證能在較小的手機上顯示出來,label的屬性值最多不超過6個字元。不過這可能因WAP手機品牌、型號不同而稍有不同,有的手機最多不能超過5個字元。而且,如果手機瀏覽器不支援動態標籤顯示,那麼它就會忽視label屬性。

  3)該屬性用於指定do元索所綁定事件的名稱。如果多個do元素制定了相同的name,那麼他們綁定的事件統屬一個。如果卡片一般與卡片組一級中do元素制定了相同的事件名,那麼卡片一級的時間將被優先執行,卡片組一級的事件將被忽視。

  WML規定,在同一卡片或在同一模板中,不得指定具有相同事件名(name)的兩個或兩個以上的do元素。

  另外,如果name屬性值為空白,則相當於沒有指定name屬性,這時do元素執行的事件或操作由type的屬性值決定。

  4)optional。指定瀏覽器是否忽視do元素及其包含的任務。有兩個可選值:true和false。如果值為true,則瀏覽器將忽視當前do元素,即不執行它所綁定的任務。反之,若值為false,則執行d

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.