4.5. 使用Smarty模板

实际的程序你肯定不会只是用 echo 来不断的打印数据,而应该使用预先定义好的页面模板来渲染最终显示结果。bzfshop 采用 Smarty 作为我们的模板引擎(因为它够成熟,知道人够多,使用也够简单)。下面我们使用 smarty 来渲染输出结果,首先建立一个 protected/Theme/Shop/shop/Tpl/test_index.tpl 文件,内容如下:

test_index.tpl. 

{{extends file='layout.tpl'}}
{{block name=main_body}}
    <h4>这里是 Test 的输出结果</h4>
    <br/>
    <br/>
    <br/>
    {{$testResult|default}} <!-- 这里是输出结果 -->
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
{{/block}}

然后修改 Index.php,内容如下:

Index.php. 

namespace Controller\Test;

use Core\Helper\Utility\Validator;
use Core\Service\Goods\Goods as GoodsBasicService;

class Index extends \Controller\BaseController
{

    public function get($f3)
    {
        global $smarty;

        // 从 GET 中取得参数
        $validator = new Validator($f3->get('GET'));

        // 验证参数的合法性
        $goods_id =
            $validator->required('参数不能为空')->digits('参数必须是数字')->min(10, true, '参数必须大于等于10')->validate('goods_id');

        if (!$this->validate($validator)) {
            goto out;
        }

        // 调用商品服务查询商品
        $goodsBasicService = new GoodsBasicService();
        $goodsInfo         = $goodsBasicService->loadGoodsById($goods_id);

        // 如果商品不存在,则为非法ID
        if ($goodsInfo->isEmpty()) {
            $this->addFlashMessage('商品ID[' . $goods_id . ']非法');
            goto out;
        }

        // 给模板赋值
        $smarty->assign('testResult', $goodsInfo['goods_name']);

        out:
        $smarty->display('test_index.tpl'); // 调用 smarty 渲染模板输出
    }

    public function post($f3)
    {
        $this->get($f3);
    }

}

从上面的程序可以看到,我们把查询结果赋值给 smarty 然后调用 smarty 做模板渲染就可以了。访问 http://192.168.2.100/PHPStorm/bzfshop-opensource/src/Test/Index?goods_id=42107 就能看到我们希望看到的显示结果。

你可能注意到一点,我们没有对 出错消息 做处理,如果用户输入的 goods_id 是非法的,我们怎么显示错误消息呢? 你可以试试,参数 goods_id 换换不同的非法值,看看是不是已经有错误提示消息了?事实上 bzfshop 本身集成了一套 flash message 的显示机制,这是由 PHP + Cookie + JavaScript 配合一起完成显示的,关于 FlashMessage 的实现细节请查看 bzfshop设计文档。

[提示]

bzfshop 本身实现了一套 Flash Message 的机制,你只需要做参数验证,如果发生参数错误 bzfshop 会自动提示给用户。