symfony把頁面組織成模塊,在建立頁面之前,你必須先建立一個模塊,也就是一個symfony能識別的目錄結構的空殼。
可以用如下命令創建一個symfony模塊,比如創建一個名叫php的模塊:
這條命令在modules目錄下生成了如下文件:
其中actions.class.php文件的內容如下:
/**
* php actions.
*
* @package blog
* @subpackage php
* @author Your name here
* @version SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $
*/
class phpActions extends sfActions
{
/**
* Executes index action
*
* @param sfRequest $request A request object
*/
public function executeIndex(sfWebRequest $request)
{
$this->forward('default', 'module');
}
}
indexSuccess.php文件的內容爲空。
現在訪問http://localhost:8080/php,可以看到如下的頁面:
現在讓我們進入正題,來創建一個新的頁面,分爲如下步驟:
1、增加一個動作
我們在actions.class.php文件中,新增如下代碼:
public function executeTest()
{
}
這樣我們就在php模塊中新增了一個test動作,注意在symfony中動作的命名規範:
①動作的名字永遠是executeXxx(),名字第二部分的第一個字母總是大寫
②URL是區分大小寫的,symfony也是區分大下寫的,這就是說,如果你定義一個executemyaction()方法或者executeMyaction,然後在瀏覽器裏面調用myAction方法,symfony會返回404錯誤信息。
如果現在訪問http://localhost:8080/php/test,可以看到如下的頁面:
這個頁面告訴我們我們還要在templates目錄下創建一個testSuccess.php文件,內容如下:
<p>hello,world!</p>
2、從動作傳遞信息給模板
symfony讓動作類的屬性可以直接在模板的全局命名空間裏被訪問(即在動作裏通過$this->variableName訪問的變量在模板中可以直接用$variableName訪問到),還是用test動作來試驗:
public function executeTest()
{
$this->hour = date("H", time());
}
<p>hello,world!</p>
<?php if($hour >= 18): ?>
<p>it's already <?php echo $hour ?>,time to go to bed</p>
<?php endif; ?>
現在訪問http://localhost:8080/php/test,
3、通過表單從用戶獲取數據
symfony提供了表單輔助函數來幫助快速書寫html代碼,下面是一個例子:
<?php use_helper('form') ?>
<?php echo form_tag('php/another') ?>
<?php echo label_for('name','what\'s your name?' ) ?>
<?php echo input_tag('name') ?>
<?php echo submit_tag('ok') ?>
</form>
傳統的超鏈接一般類似與下面這樣:
?php echo "<a href='another?name=anonymous'>i will never say my name</a>"; ?>
但是這樣的鏈接有一個弊端,那便是如果做了僞靜態的話,要到模板文件中將這些鏈接地址一一修改,在symfony對這種問題提供了一個輔助函數link_to(),下面是一個例子:
<?php echo link_to('i will never say my name', 'php/another?name=anonymous'); ?>
在symfony框架中你可以通過sfAction對象的getRequestParameter()方法取得相關的數據。下面是一個例子:
public function executeAnother()
{
$this->name = $this->getRequestParameter('name');
}
當然如果操作很簡單,你可以直接在模板中直接通過$sf_params的get()方法來獲取參數的值。下面的兩種寫法是等價的:
if($sf_params->has('name')){
echo "hello,".$sf_params->get('name');
}else{
echo "hello, nobody";
}
echo "hello,".$sf_params->get('name', 'nobody');