Twig:基于一个Controller动作渲染具有不同参数的视图

时间:2017-02-13 13:22:59

标签: symfony twig

这可能是一个愚蠢的问题,但也许你仍然可以帮助我。

我想要的是:我有一个Twig模板,其中有选项卡(使用Bootstrap选项卡面板),现在我想使用一个Controller中的一个Action但使用不同的参数来渲染选项卡内容。

所以基本上,这个控制器动作应该采取一些参数" type"然后根据此类型返回不同的结果。目标是没有2个控制器来渲染几乎相同的树枝视图,除了根据参数"类型提取不同的信息。 但是,我无法让它发挥作用。它是两个标签都呈现相同的结果,因为显然视图只呈现一次或者我在渲染时在树枝模板中得到异常。 解决这个问题的正确方法是什么?

非常感谢。

3 个答案:

答案 0 :(得分:2)

有多种方法可以实现这一目标。您可以在Twig模板中使用if / else语句,但也可以在控制器中设置模板。这取决于你最适合的。

方法1:自定义模板

默认情况下,Symfony在foobarAction()方法中使用'foobar.html.twig',但您可以在方法中覆盖它:

public function recentArticlesAction($max = 3)
    {
        // make a database call or other logic
        // to get the "$max" most recent articles
        $articles = ...;

        return $this->render(
            'article/recent_list.html.twig',
            array('articles' => $articles)
        );
    }

(警告:来自How to Embed Controllers in a Template的示例,但文章本身与您的问题无关)

您可以设置变量(例如$templateName)并进行更改:

$templateName = 'recent_list.html.twig';
if ($admin) {
    $templateName = 'another_template.html.twig';
}

//or using parameters from you Request
if ($type = $request->request->get('type')) {
    $templateName = $type . '.html.twig';
}

return $this->render(
    $templateName,
    array('articles' => $articles)
);

方法2:使用Twig

控制器:

public function foobarAction(Request $request)
{
    return [
        'type' => $request->request->get('type');
    ];
}

You Twig模板:

{% if type == 'foo' %}
<h1>Foo!</h1>
<p>Hi, welcome you the foo page!</p>
{% elseif type == 'bar' %}
<h1>Bar!</h1>
<p>Hi, you've reached the Bar page.</p>
{% else %}
<h1>Error!</h1>
<p>Type not found.</p>
{% endif %}

答案 1 :(得分:0)

尝试手动渲染每个视图:

    if ($type) {
        return $this->render('home/template.html.twig', array('data' => $data));
    }
    return $this->render('home/another.html.twig', array('another_data' => $another_data));

答案 2 :(得分:0)

非常感谢这里的答案,但他们并没有真正帮助我。下次我尝试添加更多代码示例;)

我的目标是从 1 操作渲染到 1 模板,但使用不同的参数,并将这些不同的内容渲染为父视图中的部分内容。

示例:给定一个名为“view.html.twig”的模板,其中包含2次模板“myPartial.html.twig”,但第一次使用param而第二次没有param。基于此参数,应返回不同的内容。

我现在的问题是,为什么显然只有第一个动作在Symfony中呈现,因为我的部分视图都具有相同的内容。

所以这就是我现在所做的:

1 Controller,2 Actions,都调用第三个动作来获取数据并将值返回给调用操作。然后,两个动作都使用从第3个动作渲染的值调用render方法。

这就是它现在的样子:

<div class="tab-content clearfix">
    <div class="tab-pane" id="1b">
     {% render controller('MyBundle:MyController:list1') %}
    </div>
    <div class="tab-pane" id="2b">
     {% render controller('MyBundle:MyController:list2', {'type' : 1}) %}
   </div>

但是我想要实现的是做这样的事情(这不起作用,因为这两个标签会显示相同的内容):

<div class="tab-content clearfix">
    <div class="tab-pane" id="1b">
     {% render controller('MyBundle:MyController:list') %}
    </div>
    <div class="tab-pane" id="2b">
     {% render controller('MyBundle:MyController:list', {'type' : 1}) %}
   </div>

我发现这令人困惑,因为在两次调用“render”时都会这样,所以我希望在两次调用Controller时都会调用控制器中的局部视图。但显然事实并非如此:(控制器本身看起来像这样:

public function list1Action()
{
    $twigVars = //do something to build the twig vars without param;
    return $this->render('@MyBundle/Test/partial_list.html.twig', array(
        'vars' => $twigVars,
    ));
}

public function list2Action($param)
{
    $twigVars = //do something to build the twig vars with param;
    return $this->render('@MyBundle/Test/partial_list.html.twig', array(
        'vars' => $twigVars,
    ));
}

虽然我想要的是这样的:

public function listAction($param = '')
{
    if ($param) {
      $twigVars = //do something to return the twig vars with param;
    } else {
      $twigVars = //do something else to return twig vars without param;
    }
    return $this->render('@MyBundle/Test/partial_list.html.twig', array(
        'vars' => $twigVars,
    ));
}
相关问题