如何在Smarty模板中呈现Silex表单?

时间:2013-01-25 13:31:24

标签: php symfony smarty silex

我只是坚持了一点。

在Smarty模板中渲染表单。 好吧,smarty在我的silex项目中配置得很好。

这是我的控制器类中的代码。

$loginForm = $app['form.factory']
            ->createBuilder(new Form\UserLogin())
            ->getForm();

$app['smarty']->assign('loginForm', $loginForm->createView());


return $app['smarty']->render('login.tpl');

这是我的tpl文件中的代码

{block name="headline"}
<h1>User Login</h1>
{/block}


{block name="content"}
<div>
    {form_widget(loginForm)}
</div>
{/block}

我得到了这个例外。

SmartyCompilerException: 
Syntax Error in template "/home/Symfony/demo/App/View/login.tpl" on line 8
"{form_widget(loginForm)}" unknown function "form_widget"

编辑:

好的,我找到了问题,但没有得到解决方案。

以下是SmartyServiceProvider Class。

<?php

namespace App\ServiceProvider;

use Silex\Application;
use \Symfony\Component\HttpFoundation\Request;
use Silex\ServiceProviderInterface;
use App\Classes\Smarty;
use NoiseLabs\Bundle\SmartyBundle\Form\SmartyRendererInterface;
use \NoiseLabs\Bundle\SmartyBundle\Extension\AbstractExtension;
use \NoiseLabs\Bundle\SmartyBundle\Extension\FormExtension;
use \NoiseLabs\Bundle\SmartyBundle\Form;

class SmartyServiceProvider implements ServiceProviderInterface
{


    public function register(Application $app)
    {
        $app['smarty.auto-render'] = true;
        $app['smarty.extension'] = $app->protect(
            function (AbstractExtension $extension, Smarty $smarty = null) use ($app) {
                if ($smarty == null) {
                    $smarty = $app['smarty'];
                }
                /** @var $plugin \NoiseLabs\Bundle\SmartyBundle\Extension\Plugin\AbstractPlugin */
                /** @var $filter \NoiseLabs\Bundle\SmartyBundle\Extension\Filter\AbstractFilter */
                foreach ($extension->getPlugins() as $plugin) {
                    //print $plugin->getName() . " | " . $plugin->getType() . "<br>";
                    $smarty->registerPlugin($plugin->getType(), $plugin->getName(), $plugin->getCallback());
                }
                foreach ($extension->getFilters() as $filter) {
                    $smarty->registerFilter($filter->getType(), $filter->getCallback());
                }
            }
        );
        $app['smarty.extensions'] = $app->protect(
            function (array $extensions, Smarty $smarty = null) use ($app) {
                foreach ($extensions as $extension) {
                    $app['smarty.extension']($extension, $smarty);
                }
            }
        );
        $app['smarty'] = $app->share(
            function () use ($app) {

                $app['directory.smarty.plugins'] = $app['directory.root.app'] . '/Classes/Smarty/Plugins';

                $smarty = isset($app['smarty.instance']) ? $app['smarty.instance'] : new Smarty(
                    $app,
                    isset($app['smarty.primary.template.dir'])
                            ? $app['smarty.primary.template.dir']
                            : $app['directory.root.view'],
                    false
                );

                if (isset($app["smarty.options"]) && is_array($app["smarty.options"])) {
                    foreach ($app["smarty.options"] as $smartyOptionName => $smartyOptionValue) {
                        $smarty->$smartyOptionName = $smartyOptionValue;
                    }
                }

                $smarty->assign("app", $app);

                if (isset($app['smarty.configure'])) {
                    $app['smarty.configure']($smarty);
                }

                $extensions = [];
                //$extensions[] = new \NoiseLabs\Bundle\SmartyBundle\Extension\FormExtension();
                $extensions[] = new \NoiseLabs\Bundle\SmartyBundle\Extension\RoutingExtension($app['url_generator']);
                $extensions[] = new \App\Classes\Smarty\HookExtension();
                $app['smarty.extensions']($extensions, $smarty);

                return $smarty;
            }
        );
    }


    public function boot(Application $app)
    {
    }


}

在这个课程中,我在这里加载了SmartyBundle的扩展。 在这里,我将不得不加载FormExtensions。

$extensions = [];
$extensions[] = new \NoiseLabs\Bundle\SmartyBundle\Extension\FormExtension('Don't know how to get SmartyRendererInterface instance here');
$extensions[] = new \NoiseLabs\Bundle\SmartyBundle\Extension\RoutingExtension($app['url_generator']);
$extensions[] = new \App\Classes\Smarty\HookExtension();
$app['smarty.extensions']($extensions, $smarty);

1 个答案:

答案 0 :(得分:0)

Form Widget的正确语法是:

{form_widget form=$loginForm}

从您的示例中,它不清楚来自$ loginForm-&gt; createView()并且您缺少通常围绕表单窗口小部件的表单标记(即)。如果createView包含这些,则不需要表单窗口小部件,只需要将整个表单HTML输出为:

{$loginForm}