2017-02-13 59 views
-1

这可能是一个愚蠢的问题,但也许你仍然可以帮助我。树枝:根据一个控制器动作渲染不同参数的视图

我想要什么:我有一个枝条模板,已经在它的标签(使用引导选项卡板),现在我想用一个动作从一个控制器,但使用不同的参数来渲染选项卡的内容。

所以基本上,这个控制器动作应该采取一些参数“类型”,然后根据这种类型返回不同的结果。我们的目标是没有2个控制器来渲染除了基于参数“类型提取不同信息之外几乎相同的树枝视图。” 但是,我无法让它工作,它或者是两个选项卡都显示相同的结果,因为显然该视图只呈现一次,或者说,我在渲染的时间内得到的树枝模板例外。 什么是解决这个问题的正确方法?

非常感谢。

+1

请更新与相关的代码问题(控制器/ views) – DarkBee

+0

答案之一是否回答你的问题? –

回答

2

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

方法1:自定义模板

默认情况下,Symfony的使用“foobar.html.twig在您的foobarAction()方法,但你可以在你的方法重写此:

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:用嫩枝

控制器:

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

您嫩枝模板:

{% 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 %} 
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)); 
0

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

我的目标是从行动渲染成模板,但使用不同的参数和渲染这些不同的内容在父视图中的谐音。

实例:假设一个名为“view.html.twig”,包括模板2倍“myPartial.html.twig”模板,但第一次与PARAM和第二时间而不PARAM。基于这个参数,应该返回不同的内容。

我的问题是现在,为什么显然只有第一个动作在Symfony的呈现为我的两个部分观点有相同的内容。

原来这就是我现在做的事:

1控制器,2个动作,都调用了同一个动作3获取数据和值返回给调用动作。然后这两个动作都使用从第三个动作渲染的值调用渲染方法。

这就是它现在看起来:

<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> 

,我觉得困惑,因为在这两个时代 “渲染” 我被调用,所以我希望控制器在两个时间都被调用,因此控制器中的局部视图也被渲染两次。但显然这并非如此:(控制器本身看起来是这样的:

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, 
    )); 
} 
相关问题