《PHP實例:symfony表單與頁面實現技巧》要點:
本文介紹了PHP實例:symfony表單與頁面實現技巧,希望對您有用。如果有疑問,可以聯系我們。
本文實例講述了symfony表單與頁面實現技巧.分享給大家供大家參考.具體如下:PHP實戰
symfony開發很簡潔,但是功能的數量仍然很缺乏.現在是時候進行一些askeet站點與用戶之間的交互了.而HTML交互的根本--除了起鏈接--就是表單了.PHP實戰
這里我們的目標是允許用戶登陸,并在主頁的問題列表中進行翻閱.這對于開發而言是很快的,并且可以讓我們回憶起前面的內容.PHP實戰
登陸表單PHP實戰
在測試數據中存在用戶,但是程序卻沒有方法來進行驗證.下面我們要在程序的每一個頁面添加一個登陸表單.打開全局的布局文件askeet/apps/frontend/templates/layout.php,并且在到about的連接之前添加下面的代碼行:
PHP實戰
當前的布局將這些鏈接放在web調試工具欄之后.要看到這些鏈接,點擊'Sf'圖標折疊起調試工具欄就可以看到了.PHP實戰
現在需要創建user模塊.而question模塊是在第二天生成的,這一次我們只是叫symfony來創建模塊框架,而我們將會自己來編寫這些代碼.
PHP實戰
這個框架包含一個默認的index動作與一個indexSuccess.php模板.刪除他們,因為我們并不需要他們.PHP實戰
創建user/login動作
PHP實戰
public function executeLogin()
{
? $this->getRequest()->setAttribute('referer', $this->getRequest()->getReferer());
?
? return sfView::SUCCESS;
}PHP實戰
這個動作將referer保存在哀求屬性中.然后這個屬性可為模塊所用存放在一個隱藏區域中,從而這個表單的目的動作可以在成功登陸后重定向到原始的referer.PHP實戰
語句return sfView::SUCCESS將動作執行結果傳遞到loginSuccess.php模塊.這條語句是在一個不包含返回語句的動作中實現的,這也就是一個動作的默認模塊被稱之為actionnameSuccess.php的原因.PHP實戰
在動作上開始更多的工作之前,我們先來看一下模塊.PHP實戰
創建loginSuccess.php模塊PHP實戰
web上的許多人機交互使用表單,而Symfony通過提供一個form贊助器集合來組織表單的創建與管理.PHP實戰
在askeet/apps/frontend/modules/user/templates/目錄下,創建下面的loginSuccess.php模塊:
PHP實戰
這個模塊是我們第一次使用表單贊助器.這些Symfony函數可以贊助我們自動化編寫表單標簽.form_tag()打開一從此標簽,使用POST作為默認的動作,并且指向作為參數傳遞的動作.input_tag()贊助器產生一個<input>標簽,并且依據所傳遞的第一個參數自動添加一個id屬性;而默認值則是由第二個參數得到.我們可以在Symfony一書的相關章節查找到更多的關于表單贊助器與他們所產生的HTML代碼的內容.PHP實戰
這里的實質是當表單提交時則會調用這個動作.所以我們返回來看一下這個動作.PHP實戰
處理表單提交PHP實戰
用下面的代碼來替換我們剛才所編寫的登陸動作:
PHP實戰
登陸動作可以同時用來顯示登陸表單并且進行處理.相應的,他必須知道所調用的環境.如果這個動作并沒有在POST模式下調用(因為是由一個鏈接來哀求的):而這正是我們在前面所討論的情況.如果是在POST模式下哀求的,那么則會由表單調用這個動作并進行相應的處理.PHP實戰
這個動作會由哀求參數得到nickname域的值,并且查詢User表來查看在數據庫是否存在此用戶.PHP實戰
將來一個密碼控制將會為用戶分配憑證.但是現在,這個動作所做的只是在一個會話屬性中存儲用戶的id與nickname屬性.最后,這個動作重定向到表單中隱藏中的原始referer域,這是作為一個哀求參數傳遞的.如果這個域是空的,則會使用默認值.PHP實戰
這里我們需要注意這個例子中兩種類型的屬性集合之間的區別:request attributes($this->getRequest()->setAttribute())是為模板所保存的,而且只要答案發送到referer則會被忘記.session attributes($this->getUser()->setAttribute())是在整個用戶會話生命期被保存的,而且在將來其他的動作也可以拜訪他們.如果我們希望了解更多的關于屬性的內容,我們可以查看Symfony一書的參數保存器一節.PHP實戰
分配權限PHP實戰
用戶可以登陸進askeet網站是一件好事,但是用戶并不僅是因為好玩而登陸.頒發一個新問題,對某一個問題表示興趣,評價一個評論都需要登陸.而其他的動作將會向非登陸用戶開放.PHP實戰
要將一個用戶設置為經過驗證的,我們需要調用sfUser對象的->setAuthenticated()方法.這個對象同時提供了一個證書機制(->addCredential()),來通過配置限制拜訪.Symfony一書的用戶證書一節對此進行了詳細的解釋.PHP實戰
這就是下面兩行的目的:
PHP實戰
當nickname被識別后,不僅用戶數據被存放在會話屬性中,而且這個用戶也會被分配網站限制部分的拜訪權限.在明天我們將會看到如何限制驗證用戶的程序拜訪.PHP實戰
添加user/logout動作PHP實戰
關于->setAttribute()辦法還有最后一個竅門:最后一個參數(上面例子中的subscriber)定義了屬性存放的名字空間.一個名字空間不僅允許一個在另一個名字空間存在的名字指定給一個屬性,而且可以使用一個命令快速移除所有這些屬性:
PHP實戰
使用名字空間可以省去我們一個一個移除這些屬性的麻煩:這只是一行語句.PHP實戰
更新布局PHP實戰
當前這個布局即使用戶已經登陸仍然顯示一個'login'鏈接.讓我們來修正這一點.在askeet/apps/frontend/templates/layout.php文件中,修改我們在今天的指南開始時所修改的代碼:
PHP實戰
現在是時候進行測試了,我們可以顯示程序的任何一頁,點擊'login'鏈接,輸入一個可用的昵稱('anonymous'為例)并且進行驗證.如果窗口頂部的'login'變為'sign out',則我們所做的一切都是正確的.最后,試著注銷來查看'login'鏈接是否再次出現.PHP實戰
問題組織PHP實戰
隨著數以千計的Symfony愛好者訪問askeet網站,在主頁上顯示的問題就會逐漸變多.為了避免變慢的哀求速度,問題列的隨意翻閱就成為必須解決的問題.PHP實戰
Symfony為這一目的提供了一個對象:sfPropelPager.他會封裝到數據的哀求,從而只會查詢當前頁面所顯示的記錄.例如,如果一個頁面初始化時每頁只顯示10個問題,則到數據的哀求只會限制為10個結果,并且會設置偏移來在頁面中進行匹配.PHP實戰
修改question/list動作PHP實戰
在前面的練習中,我們看到了問題模塊的顯示動作:
PHP實戰
我們將會修改這個動作來向模板傳遞一個sfPropelPager而不是傳遞一個數組.同時,我們會依據感興趣的數量來對問題進行排序:
PHP實戰
sfPropelPager對象的初始化指明了他包含哪個對象類,以及在一個頁面中可以放置的對象的最大數目(在這個例子中為2).->setPage()方法使用一個哀求參數來設置當前頁面.例如,如果這個頁面參數的值為2,sfPropelPager將會返回3到5的結果.頁面哀求參數的值變為1,則頁面默認會返回1到2的結果.我們可以在Symfony一書的頁面章節中了解到關于sfPropelPager對象及其方法的更多信息.PHP實戰
使用一個默認參數PHP實戰
將常量放在我們所使用的配置文件中是一個好主意.例如,每頁的結果(在這個例子為2)可以由一個在我們自定義的程序配置中的參數來代替.用下面的代碼來改變上面的sfPropelPager行:
PHP實戰
這里的pager關鍵字是作為名字空間使用的,這也就是為什么在參數名字中出現的原因.我們可以在Symfony一書的配置一節中查看到更多的關于自定義配置與命名自定義參數規則的更多的內容.PHP實戰
修改listSuccess.php模板PHP實戰
在listSuccess.php模板中,將下面的代碼行:
PHP實戰
替換為
PHP實戰
從而頁面顯示存儲在頁面中的結果列表.PHP實戰
添加頁面瀏覽PHP實戰
在這個模板中還需要做另外一件事:頁面瀏覽.現在,模板所做的只是顯示前兩個問題,但是我們應添加到下一個頁面的功能,以及回到前一個頁面的功能.要完成添加這些功能,我們需要在模板后面添加下面的代碼:
PHP實戰
這段代碼利用了sfPropelPager對象的各種方法,以及->haveToPaginate(),這個函數只有在哀求的結果數目超過了頁面尺寸時才會返回真;而->getPreviousPage(),->getNextPage(),->getLastPage()都具有明顯示的意義;->getLinks()函數提供了一個頁面號的數組;而->getCurrentMaxLink()函數返回最后的頁面號.PHP實戰
這個例子同時顯示了一個Symfony鏈接贊助器:link_to_unless()會在作為第一個參數的測試為假的情況下輸出一個常規link_to(),否則會輸出一個非鏈接的文本,并使用簡單的<span>包裝.PHP實戰
我們測試這個頁面了嗎?我們應進行測試.直到我們用我們自己的眼睛來驗證,這個修改才算結束.要進行測試,打開在第三天所創建的測試數據文件,并且為要顯示的頁面瀏覽添加一些問題.重新運行導入數據批處理文件,然后再一次哀求主頁.PHP實戰
為子頁添加路由規則PHP實戰
默認情況下,頁面規則如下:PHP實戰
http://askeet/frontend_dev.php/question/list/page/XXPHP實戰
現在我們利用路由規則使用這些頁面更易于理解:PHP實戰
http://askeet/frontend_dev.php/index/XXPHP實戰
打開apps/frontend/config/routing.yml文件并且在頂部添加下面內容:
PHP實戰
并且為登陸頁面添加另外的路由規則:
PHP實戰
重構PHP實戰
模型PHP實戰
question/list動作執行與模型相關的代碼,這也就是我們為什么要將這些代碼移動到模塊中的原因.用下面的代碼來代替question/list動作:
PHP實戰
并且在lib/model中的QuestionPeer.php類中添加下面的辦法:
PHP實戰
同樣的想法也適用于我們昨天編寫的question/show動作:Propel對象由其剝離的標題取回問題的用法應屬于這個模塊.所以用下面的代碼來變更question/show動作代碼:
PHP實戰
在QuestionPeer.php文件中添加下面的代碼:
PHP實戰
模板PHP實戰
在question/templates/listSuccess.php中顯示的問題列表在將來的某些地方還會用到.所以我們將顯示問題列表的模板代碼放在一個_list.php片段中,并且用下面的簡單代碼來代替listSuccess.php的內容:
PHP實戰
<?php echo include_partial('list',array('question_pager'=>$question_pager)) ?>PHP實戰
希望本文所述對大家的symfony框架程序設計有所贊助.PHP實戰
《PHP實例:symfony表單與頁面實現技巧》是否對您有啟發,歡迎查看更多與《PHP實例:symfony表單與頁面實現技巧》相關教程,學精學透。維易PHP學院為您提供精彩教程。