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');