【问题标题】:How to customize render Symfony如何自定义渲染 Symfony
【发布时间】:2017-10-24 11:15:00
【问题描述】:

我是 Symfony 2.8 的新手。 我有这个数组

IndexController.php on line 18:
array:6 [▼
  "code" => "Home"
  "parent" => "master"
  "labels" => array:1 [▼
    "en_US" => "Home"
  ]
  "mainMenu" => false
  "footerMenu" => false
  "headerMenu" => true
]

例如:当 mainMenu 设置为 true 时,我需要显示 mainMenu.html.twig。

用这个方法我调用这个数组

public function indexAction(Request $request, $locale, $page) {
    $pageContent = $this->container->get("pimc_akeneo_cms_page_content_builder");
    $akeneoConnector = $this->container->get("pimc_akeneo_cms_backend_connector");
    $html = $pageContent->build($page, $locale);

    $elements = $akeneoConnector->getCategoryList($page);

    if($elements['mainMenu'] == true){
        $this->render('base/mainMenu.html.twig'); // I have problem in here
    }
    if($elements['headerMenu'] == true){
        $this->render('base/headerMenu.html.twig'); // I have problem in here
    }
    if($elements['footerMenu'] == true){
        $this->render('base/footerMenu.html.twig'); // I have problem in here
    }

    return $this->render('base/index.html.twig', ["content" => $html]);
}

我在基本 app/Resources/views/base/ 中有 headerMenu.html.twig、footerMenu.html.twig 和 mainMenu.html.twig。 这似乎真的是一个简单的问题,但我无法解决它。 所以问题是当 mainMenu.html.twig 设置为 true 时要编写的语法。我怎样才能显示这个?

【问题讨论】:

  • 在每个 if 中使用 return $this->render...
  • 是的,我已经尝试过了。然后它只返回例如 mainMenu.html.twig 这不是我想要的。
  • 好的,那么你需要在树枝视图下进行这个模板的条件加载
  • 您能否更具体地了解条件加载?
  • red the doc of include,我相信这就是你需要的twig.symfony.com/doc/2.x/tags/include.html

标签: php symfony symfony-2.8


【解决方案1】:

首先return $this->render()以Symfony\Component\HttpFoundation\Response实例的形式返回HTTP响应,这是Symfony控制器中每个*Action方法所需要的。有那个 说每个请求不能返回多个响应,并且没有 return 的 $this->render() 对 Symfony 没有任何影响。

在您的情况下,您应该将显示模板逻辑移动到视图层,如下所示:

在你的indexAction

return $this->render('base/index.html.twig', [
    "content" => $html,
    "elements" => $elements // pass this to template
]);

在你的base/index.html.twig

{% if elements['mainMenu'] is defined and elements['mainMenu'] is same as(true) %}
    {% include 'base/mainMenu.html.twig' %}
{% endif %}

{% if elements['headerMenu'] is defined and elements['headerMenu'] is same as(true) %}
    {% include 'base/headerMenu.html.twig' %}
{% endif %}

etc...

或者(仅当您有多个替代模板可以在同一个 DOM 的位置呈现时):

{% for tmpl in ['mainMenu', 'headerMenu', 'footerMenu'] %}
    {% if elements[tmpl] is defined and elements[tmpl] is same as(true) %}
     {% include 'base/' ~ tmpl ~ '.html.twig' %}
    {% endif %}
{% endfor %}

因此,将这个逻辑放在你的模板中,你可以更好地保持MVC 关注点分离,现在你不必在每个控制器中重复这个逻辑,哪个视图有这些菜单要呈现。您只需传递$elements 变量即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2020-10-28
    • 2011-03-20
    • 2022-01-10
    • 2013-07-27
    • 1970-01-01
    • 2019-04-19
    相关资源
    最近更新 更多