class mymoduleActions extends sfActions { public function executeMyAction() { $today = getdate(); $this->hour = $today["hours"]; } } 模板直接访问动作属性: 复制代码 代码如下:<p>Hello, world!</p> <?php if ($hour >= 18): ?> <p>Or should I say good evening? It"s already <?php echo $hour ?>.</p> <?php endif; ?> 模板已经可以访问一些数据,而不需要在动作中设置任何变量。每一个模板通常可以调用$sf_context,$sf_request,$sf_params,$sf_user对象的方法。他们包含与当前内容,请求,请求参数以及会话相关的数据。我们很快就会学到他们的用法。 使用表单向用户收集信息 表单是向用户收集信息的一个好方法。使用HTML编写表单以及表单元素有时是相当麻烦的,尤其是当我们希望适用于XTHML时更是如此。我们可以用通常的方式在Symfony模板中包含表单元素,如下面所示,但是Symfony提供了帮助器从而使得这个任务更为简单。 模板可以包含通常的HTML代码: 复制代码 代码如下:<p>Hello, world!</p> <?php if ($hour >= 18): ?> <p>Or should I say good evening? It"s already <?php echo $hour ?>.</p> <?php endif; ?> <form method="post" target="/myapp_dev.php/mymodule/anotherAction"> <label for="name">What is your name?</label> <input type="text" name="name" id="name" value="" /> <input type="submit" value="Ok" /> </form> 一个帮助器是用在模板中的由Symfony定义的PHP函数。他输出HTML代码,并且比我们自己编写实际的HTML代码要快速得多。使用Symfony帮助器,我们用下面的代码得到的输出结果与上面通常的HTML代码相同: 复制代码 代码如下:<p>Hello, world!</p> <?php if ($hour >= 18): ?> <p>Or should I say good evening? It"s already <?php echo $hour ?>.</p> <?php endif; ?> <?php echo form_tag("mymodule/anotherAction") ?> <?php echo label_for("name", "What is your name?") ?> <?php echo input_tag("name") ?> <?php echo submit_tag("Ok") ?> </form> 如果在上面的代码中,我们认为使用帮助器的版本并不会比编写HTML代码快,那么我们可以考虑一下下面的情况: 复制代码 代码如下:<?php $card_list = array( "VISA" => "Visa", "MAST" => "MasterCard", "AMEX" => "American Express", "DISC" => "Discover"); echo select_tag("cc_type", options_for_select($card_list, "AMEX")); ?> 这会得到下面的HTML输出结果: 复制代码 代码如下:<select name="cc_type" id="cc_type"> <option value="VISA">Visa</option> <option value="MAST">MasterCard</option> <option value="AMEX" selected="selected">American Express</option> <option value="DISC">Discover</option> </select> 在模板中使用的帮助器的好处就在于加快了编码的速度,代码的清晰与简洁。而代价就是我们需要花费时进行学习。所以我们可以在模板中不使用Symfony帮助器,并且以我们通常的方式来编写代码,但是这会是一个巨大的损失。 注意,短开放标记的用法(<?=,等同于<?php echo)并不推荐在专业的web程序中使用,因为我们的web服务器也许会理解多个脚本语言,从而会使其变得迷惑。另外,短开放标记并不会与默认的PHP配置进行工作,而且需要修改服务来激活。最后,当我们必须处理XML与验证时,他会出错,因为<?在XML中有着特殊的意义。 表单处理有专门的一章进行讨论,因为Symfony提供了许多工具,绝大数的帮助器,来使其简单。我们将会在第10章了解到关于帮助器更多的内容。 链接到另一个动作 我们现在已经知道在动作名字与需要调用的URL之间有一个分离。所以我们使用下面的方式来创建到另一个动作的链接时,他只会工作在默认的路由系统中。如果我们以后决定改变URL的样子,那么我们就需要查看所有的模板来改变超链接。 超链接,通常的方法: 复制代码 代码如下:<a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous"> I never say my name </a> 要避免这样的麻烦,我们应总是使用link_to()帮助器来我们的程序动作创建超链接。下面的例子演示了超链接帮助器的用法。 link_to()帮助器: 复制代码 代码如下:<p>Hello, world!</p> <?php if ($hour >= 18): ?> <p>Or should I say good evening? It"s already <?php echo $hour ?>.</p> <?php endif; ?> <?php echo form_tag("mymodule/anotherAction") ?> <?php echo label_for("name", "What is your name?") ?> <?php echo input_tag("name") ?> <?php echo submit_tag("Ok") ?> <?php echo link_to("I never say my name","mymodule/anotherAction?name=anonymous") ?> </form> 生成的HTML与前面的相同,所不同的就在于当我们改变我们的路由规则时,所有的模板都会正确工作,并且重新格式化URL。 link_to()帮助器,就像其他的帮助器,会接受特定选项的额外参数和额外的标签属性。下面的例子显示了一个可选参数以及生成的HTML。选项参数或者是一个相关的数组或者是由空格分隔的显示key=value的简单字符串。 大多数帮助器接收一个可选参数: 复制代码 代码如下:// Option argument as an associative array <?php echo link_to("I never say my name", "mymodule/anotherAction?name=anonymous", array( "class" => "special_link", "confirm" => "Are you sure?", "absolute" => true )) ?>
// Option argument as a string <?php echo link_to("I never say my name", "mymodule/anotherAction?name=anonymous", "class=special_link confirm=Are you sure? absolute=true") ?>
// Both calls output the same => <a class="special_link" onclick="return confirm("Are you sure?");" href="http://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymous"> I never say my name</a> 任何时候我们使用一个Symfony帮助器来输出一个HTML标记时,我们可以在可选参数中插入额外的标记属性。我们可以使用HTML 4.0的方式来编写这样的属性,而Symfony将会以更简洁的格式进行输出。这也就是为什么帮助器会比HTML更容易编写的原因。 因为他需要一个额外的分析与转换,字符串语法比数组语法要慢一些。 与表单帮助器相类似,链接帮助器有更多的数量和选项。 由请求得到信息 无论用户通过表单发送信息(通常以POST请求的方式)还是通过URL(GET请求),我们可以通过带有sfActions对象的getRequestParameter()方法的动作来获取数据。下面的例子显示如何在anotherAction中得到name参数的值。 在动作中由请求参数得到数据: 复制代码 代码如下:<?php