2013-01-25 4 views
2

Je suis juste coincé à un point.Comment rendre des formulaires Silex dans un modèle Smarty?

Pour rendre des formulaires dans Smarty Template. Eh bien, smarty est bien configuré dans mon projet silex.

Voici le code dans ma classe de contrôleur.

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

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


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

Voici le code dans mon fichier tpl

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


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

Et je reçois cette exception.

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

Edit:

Ok j'ai trouvé le problème, mais ne pas obtenir la solution.

Voici la classe SmartyServiceProvider.

<?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) 
    { 
    } 


} 

Ici dans cette classe j'ai chargé les extensions de SmartyBundle ici. Ici, je vais devoir charger 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); 
+3

'form_widget' est une macro du moteur Brindille-modèle, non? Vous aurez donc probablement besoin d'une fonction spécifique smarty à cette fin. –

+0

@LouisH. S'il vous plaît vérifier que j'ai mis quelques modifications dans ma question. avoir un look méthodes de la SmartyBundle pour le rendu de la forme [link] (https://github.com/noiselabs/SmartyBundle/blob/master/Extension/FormExtension.php) c'est exactement la même chose que twig fournit. – hardik

Répondre

0

La syntaxe correcte pour le widget Form est:

{form_widget form=$loginForm} 

De votre exemple on ne sait pas le sortir de loginForm- $> createView() et vous manquez les balises de forme (ie) qui entoure normalement le widget Form. Si le createView inclut ceux-ci vous faites être pas besoin le widget de forme et juste besoin de toute sortie sous forme HTML:

{$loginForm} 
Questions connexes