是否可以实现一个可以显示一个或其他Twig模板的index.php文件?

时间:2015-05-25 22:52:53

标签: php templates session twig

假设我们必须管理用户登录和注销。

我们有一个index.php文件,默认显示index.twig模板(包含允许用户登录或注册的标题。

我们有另一个类似于index.twig模板的Twig模板(welcome.twig)但是,它的标题显示了对用户配置文件,注销选项以及用户可以在网站上执行的操作的访问。

我想知道index.php文件是否可以通过条件显示这两个模板中的一个。

在我的index.php文件中,我得到了这个:

if (!isset($_SESSION['account'])){
     $twig->display("index.twig");
}else{
     $twig->display("welcome.twig");
}

正如您所知,我告诉您在$ _SESSION变量中未设置帐户时显示index.twig(默认模板),并在$ _SESSION变量中设置帐户时显示welcome.twig。

在$ _SESSION变量上设置的帐户出现在名为login.php的其他文件中

目前,我一直在使用第二个文件(welcome.php)来获得我想要的东西,但我不确定这是获得它的好方法......

感谢。

2 个答案:

答案 0 :(得分:2)

您应该在模板上使用条件继承。看看这个答案:

Twig extend template on condition

您可以将变量传递给模板,如下所示:

$twig->display("index.twig", array('logged' => isset($_SESSION['account'])));

然后,使用该变量在模板中执行条件。它可以从两个模板继承,每个模板都有不同的菜单,具体取决于用户是否已登录。

我希望它有所帮助。

答案 1 :(得分:0)

我遇到了这个解决方案:

我在index.php文件中为$ _SESSION变量设置了一个值

<?php

            require_once '../vendor/autoload.php';
            require_once '../generated-conf/config.php';
            require_once '../vendor/twig/twig/lib/Twig/Autoloader.php';
            session_start(); // Session always starts when index.php is loaded (even if it is loaded for the first time)
            Twig_Autoloader::register();


            $loader = new Twig_Loader_Filesystem('templates/');
            $twig = new Twig_Environment($loader);

            // Condition to show any or other template
            if (isset($_SESSION['online']) && ($_SESSION['online'] == true)){
                $args= array('online' => true, 'session' => $_SESSION);
            }else{
                $args= array('online' => false);
            }
            // Display Twig template
            $twig->display("index.twig", $args);

?>

在我的Twig模板(index.twig)中:

{% if online == true %} {# It's not the $_SESSION variable 'online' value, but the 'online' value of the 'args' array #}
     {% include 'userMenu.twig' %}
{% else %}
     {% include 'defaultMenu.twig' %}
{% endif %}

使它成功:)

我希望它有所帮助。