Twig模板不能包含php模板

时间:2013-01-10 18:08:54

标签: php templates symfony twig

我遇到了一个问题,对我来说这个问题并不清楚,也很难理解。我试图制作日历小部件,它应该显示在我网站的每个页面上。所以,我认为它应该是普通模板(没有参数,没有每个网站)。我试着把它作为树枝模板。我设法渲染日历,但我遇到了获取日期对象的问题(这对于获取渲染日历的正确参数是必要的)。过了一会儿,我试着制作一个php模板,它将被主枝模板(layout.html.twig)包含。它没有成功。我在config.yml中启用了php引擎,但没有帮助 - 事实上包含了php模板,但作为普通文件,不是php文件(不解析为php脚本),(但是php引擎工作正常,我试图渲染从它工作的控制器的PHP模板)。我已经读过也可以在模板中包含另一个控制器的结果,但对我来说这不是正确的解决方案,我没有尝试过(php模板应该适合这个问题)。

我该怎么做才能解决这个问题?

Main config.yml

imports:
    - { resource: parameters.ini }
    - { resource: security.yml }

framework:
    #esi:             ~
    translator:      { fallback: %locale% }
    secret:          %secret%
    charset:         UTF8
    router:          { resource: "%kernel.root_dir%/config/routing.yml" }
    form:            true
    csrf_protection: true
    validation:      { enable_annotations: true }
    templating:      { engines: ['twig', 'php'] }
    session:
        default_locale: %locale%
        auto_start:     true

# Twig Configuration
twig:
    debug:            %kernel.debug%
    strict_variables: %kernel.debug%

# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: false
    # java: /usr/bin/java
    filters:
        cssrewrite: ~
        # closure:
        #     jar: %kernel.root_dir%/java/compiler.jar
        # yui_css:
        #     jar: %kernel.root_dir%/java/yuicompressor-2.4.2.jar

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

# Swiftmailer Configuration
#swiftmailer:
#    transport: %mailer_transport%
#    host:      %mailer_host%
#    username:  %mailer_user%
#    password:  %mailer_password%

jms_security_extra:
    secure_controllers:  true
    secure_all_services: false

# services:
#    TpsaMailer:

#        class: Tpsa\TestBundle\Controller\MailerController

layout.html.twig

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

{% block stylesheets %}
<link rel="stylesheet" type="text/css"
href="{{ asset('bundles/tpsablog/css/main.css') }}">
{% endblock %}

{% block javascripts %}
<!-- empty javascripts -->
{% endblock %}

<title>
{% block title %}
{% trans %}blog.programisty.duga{% endtrans %}
{% endblock %}
</title>

</head>
<body>
<div id="all">
    <div id="top">
        {% block top %}
            <div style="float: left" class="right">
                            <img style="float: left;
                            vertical-align: middle; margin: 8px
                            8px 8px 0px" src="{{ asset('bundles/tpsablog/images/glider.png') }}">
                <h4>{% trans %}blog.programisty.duga{% endtrans %}</h4>
                <div style="font-size: 8px">
                    {% trans %}ciekawosc.wiedza.niewygodne{% endtrans %}
                    <!-- Ciekawość i wiedza... To, co jest niewygodne dla
                    władzy -->
                </div>

            </div>
            <div style="float: right">
                <a href="{{ path('HomePage') }}">{% trans %}strona.glowna{% endtrans %}</a>
                <a href="{{ path('AboutPage') }}">{% trans %}o.mnie{% endtrans %}</a>
                <a href="{{ path('TBB_mess_add') }}">{% trans %}napisz.do.mnie{% endtrans %}</a>
                {% if is_granted('IS_AUTHENTICATED_FULLY') %}
                {{ app.user.username }}
                <a href="{{ path('TBB_tag_list_homepage') }}">{% trans %}tagi{% endtrans %}</a>
                <a href="{{ path('TBB_mess_list_homepage') }}">{% trans %}wiadomosci{% endtrans %}</a>
                <a href="{{ path('logout') }}">{% trans %}wyloguj{% endtrans %}</a>
                {% else %}
                <a href="{{ path('login') }}">{% trans %}zaloguj{% endtrans %}</a>
                {% endif %}
                <div style="text-align: center; margin: 10px 0px">
                <a href="{{ path('TBB_rss') }}">
                <img src="{{ asset('bundles/tpsablog/images/rss.png')
                }}" alt="rss channel">  
                </a>
                <a href="http://www.facebook.com/duga.chernobyl"
                target="_blank">
                <img src="{{ asset('bundles/tpsablog/images/facebook.png') }}"
                alt="facebook"> 
                </a>
                <a href="http://www.youtube.com/user/DugaEye"
                target="_blank">
                <img src="{{ asset('bundles/tpsablog/images/youtube.png') 
                }}" alt="youtube">
                </a>
                </div>
            </div>
            <div style="clear:both"></div>
        {% endblock %}
    </div>

    <div id="frame">
        <div id="left">
        {% block content %}
            {% trans %}TODO{% endtrans %}
        {% endblock %}
        </div>
        <div id="right">
        {% block panel %}
            <div style="text-align: left">
                <div style="text-align: center">    
                <h4>{% trans %}profil.duga.eye{% endtrans %}</h4>
                <img style="width: 100px" src="{{
                asset('bundles/tpsablog/images/photo.jpg')
                }}">
                </div>
                <div style="font-weight:900; margin-top: 10px">
                <ul>
                <li>{% trans %}wiek{% endtrans %}: 21</li>
                <li>{% trans %}miejsce{% endtrans %}: /dev/null</li>
                <li>{% trans %}zainteresowania{% endtrans %}: {% trans %}programowanie.hacking.filozofia{% endtrans %}</li>
                <li>{% trans %}email{% endtrans %}: <a
                href="mailto:duga(dot)eye(at)gmx(dot)com">Mail</a>
                </ul>
                </div>
            </div>
            <h3>{% trans %}reklamy{% endtrans %}</h3>
            {% include '::calendar.html.php' %}
        {% endblock %}
        </div>
    </div>

    <div id="footer">
        {% block footer %}
        {% trans %}footer{% endtrans %}
        {% endblock %}
    </div>


</div>
</body>
</html>

如何从php Date对象中获取正确的参数offset,number,koniec,aktualny? (现在它是硬编码的)

calendar.html.twig

{% include '::calendar.html.php' %}

{% set offset = 1 %}
{% set number = 28 %}
{% set koniec =  7 - ((offset + number) % 7) %}
{% set aktualny = 13 %}
<table border="0" style="text-align: center">
<thead>
<tr>
<td>{% trans %}pn{% endtrans %}</td>
<td>{% trans %}wt{% endtrans %}</td>
<td>{% trans %}sr{% endtrans %}</td>
<td>{% trans %}czw{% endtrans %}</td>
<td>{% trans %}pt{% endtrans %}</td>
<td>{% trans %}sob{% endtrans %}</td>
<td>{% trans %}nie{% endtrans %}</td>
</tr>
<tbody>
{% if offset % 7 != 0 %}
<tr>
{% for i in range(0,offset-1,1) %}<td><br></td>{% endfor %}
{% endif %}
{% for i in 1..number %}
{% if (i+offset)%7 == 1 %}<tr>{% endif %}
<td>
{% if i == aktualny %}
<span style="color: red">{{ i }}</span>
{% else %}
{{ i }}

{% endif %} 

</td>
{% if (i+offset)%7 == 0  %}</tr>{% endif %}
{% endfor %}
{% if koniec  < 7 %}
{% for i in 1..koniec %}
<td><br></td>
{% endfor %}
</tr>
{% endif %}
</tbody>
</table>

php模板应该通过将其包含在twig模板中作为php模板执行,但它不会被解析并作为一个模板执行。

calendar.html.php

ppp<?php echo  ('ala') ?>ooo

只需在源代码中包含“pppooo”,不会将其视为html标记。

如果需要,

deps文件

[symfony]
    git=http://github.com/symfony/symfony.git
    version=v2.0.9

[twig]
    git=http://github.com/fabpot/Twig.git
    version=v1.5.1

[monolog]
    git=http://github.com/Seldaek/monolog.git
    version=1.0.2

[doctrine-common]
    git=http://github.com/doctrine/common.git
    version=2.1.4

[doctrine-dbal]
    git=http://github.com/doctrine/dbal.git
    version=2.1.5

[doctrine]
    git=http://github.com/doctrine/doctrine2.git
    version=2.1.5

[swiftmailer]
    git=http://github.com/swiftmailer/swiftmailer.git
    version=v4.1.5

[assetic]
    git=http://github.com/kriswallsmith/assetic.git
    version=v1.0.2

[twig-extensions]
    git=http://github.com/fabpot/Twig-extensions.git

[metadata]
    git=http://github.com/schmittjoh/metadata.git
    version=1.0.0

[SensioFrameworkExtraBundle]
    git=http://github.com/sensio/SensioFrameworkExtraBundle.git
    target=/bundles/Sensio/Bundle/FrameworkExtraBundle
    version=origin/2.0

[JMSSecurityExtraBundle]
    git=http://github.com/schmittjoh/JMSSecurityExtraBundle.git
    target=/bundles/JMS/SecurityExtraBundle
    version=origin/1.0.x

[SensioDistributionBundle]
    git=http://github.com/sensio/SensioDistributionBundle.git
    target=/bundles/Sensio/Bundle/DistributionBundle
    version=origin/2.0

[SensioGeneratorBundle]
    git=http://github.com/sensio/SensioGeneratorBundle.git
    target=/bundles/Sensio/Bundle/GeneratorBundle
    version=origin/2.0

[AsseticBundle]
    git=http://github.com/symfony/AsseticBundle.git
    target=/bundles/Symfony/Bundle/AsseticBundle
    version=v1.0.1

3 个答案:

答案 0 :(得分:6)

你不能在一个Response中混合和匹配twig和php(这样做会绕过twig的一部分,这是为了防止设计者在视图中创建过多的逻辑)。

我认为Symfony文档应该/可能更清楚(目前它基本上说“启用它们并做你喜欢的事情”)。

如果您嵌入了另一个控制器,那么您应该能够提供不同的响应,而 响应可以基于PHP。

答案 1 :(得分:1)

您是否考虑过使用{% render 'ApplicationBundle:Controller:action' %}并在渲染php模板的动作中渲染您的日历php模板?

您也可以在渲染日历树枝的动作中渲染日历php,并将php模板的输出作为简单的树枝变量传递。

注意:要显示这样的var,如果里面有任何html标记,请不要忘记{{ var|raw }}

注2:从symfony2.2开始,渲染参数更改为{% render url('route_name') %}

答案 2 :(得分:1)

注意:下面的代码段完全没有经过测试。

http://twig.sensiolabs.org/doc/functions/date.html

函数date似乎创建了\ DateTime对象。

{% set now = date() %}
{% set offset = date(now.format('Y/m/01')).format(w) %} {# weekday of 1st day #}
{% set number = now.format('t') %} {# days in month #}
{% set koniec = 7 - ((offset + number) % 7) %}
{% set aktualny = now.format('n') %} {# today #}

但是,如果你想在twig中包含原始的php文件(比如'calendar.php'), 你必须写扩展才能使它工作。

class CalendarExtension extends \Twig_Extension
{
    private $pathToPhp; //store that where the php file is

    public function setPhpFile($pathToPhp)
    {
        $this->pathToPhp = $pathToPhp;
    }

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('calendar', array($this, 'showCalendar'))
        );
    }

    public function showCalendar([put arguments here if you need])
    {
        ob_start();
        include ($this->pathToPhp);
        return ob_get_clean();
    }
}

为了完成上述工作,您应该在容器中创建“标记”服务。

in app/config/config.yml

services:
    calendar_twig_extension:
        class: __Namespace__\CalendarExtension
        calls:
            - [setPhpFile, [__path to your calendar.php__]]
        tags:
            - [name: twig.extension]
应该替换双重强调的词语:

  • _ _ Namespace _ _:CalendarExtension的命名空间
  • _ _您的calendar.php _ _的路径:calendar.php的完整路径。您可以使用%kernel.root_dir%等参数来管理项目相对的路径。

有了这些,你终于可以简单地写

{{ calendar([arguments for CalendarExtension::showCalendar]) }}