草庐IT

php - symfony2/ Twig : how to use include in a block used in a form theme?

coder 2024-04-30 原文

为了处理我的表单集合,我有一个 block 集合小部件的自定义表单主题。此 block 集合小部件呈现为表格,因此取决于 block_collection_header 和 block_collection_body。

block 集合小部件始终保持不变,但有时我会自定义其他两个 block , block 集合标题和 block 集合主体

我的工作代码:

{# From file myview.html.twig #}
{% form_theme form ':Model:prototype_table_collection.html.twig' %}
{% form(form) %}

Ant 这个表单主题如下:

{# From file ':Model:prototype_table_collection.html.twig' #}
{% block collection_widget %}
    {% spaceless %}
        <div class="collection">
            {% if prototype is defined %}
                {% set body = prototype %}
                {% set attr = attr|merge({'data-prototype': block('collection_body') }) %}
                {% set header = prototype %}
                {% set attr = attr|merge({'data-header': block('collection_header') }) %}
            {% endif %}

            {% if form.vars.allow_delete is defined and form.vars.allow_delete %}
                {% set allow_delete = true %}
            {% else %}
                {% set allow_delete = false %}
            {% endif %}


            <div {{ block('widget_container_attributes') }} class="protoype">
                {{ form_errors(form) }}
                <table class="subtable table">
                    <thead>
                        <tr class="headers" style="display: none;">
                            {% if form.children|length > 0 %}
                                {% if form.children[0]|length > 0 %}
                                    {% set header = form.children[0] %}
                                    {{ block('collection_header') }}
                                {% endif %}
                            {% endif %}
                        </tr>
                    </thead>
                    <tbody class="container_rows">

                    {% for rows in form %}
                    {% spaceless %}
                        {% if rows.children|length > 0 %}
                                {% set body = rows %}
                                {{ block('collection_body') }}
                        {% endif %}
                    {% endspaceless %}
                    {% endfor %}

                    </tbody>
                </table>
                {% if prototype is defined %}
                    {% if form.vars.attr['data-add_label'] is defined %}
                        {% set add_label = form.vars.attr['data-add_label'] ~ ' ' %}
                    {% else %}
                        {% set add_label = 'Ajouter  ' %}
                    {% endif %}
                    <a href="#/" class="add_button btn btn-default btn-sm pull-right">{{ add_label }}<i class="fa fa-plus"></i></a>
                {% endif %}
                <br>
            </div>
        </div>
    {% endspaceless %}
{% endblock collection_widget %}

{% block collection_header %}
    {% for field in header %}
        <th>
            {% if 'checkbox' not in field.vars.block_prefixes %}
                {{ form_label(field)|raw }}
            {% else %}
                {% if field.vars.attr['data-label'] is defined %}
                    {{ field.vars.attr['data-label'] }}
                {% else %}
                    Options
                {% endif %}
            {% endif %}
        </th>
    {% endfor %}
    {% if allow_delete %}
        <th class="align_center">Supprimer</th>
    {% endif %}
{% endblock %}

{% block collection_body %}
    {% spaceless %}
    {% set fieldNum = 1 %}
    <tr class="row_to_delete child_collection">
        {{ form_errors(body) }}
        {% for field in body %}
            <td class="field{{ fieldNum }} data-label">
                {{ form_widget(field) }}
                {{ form_errors(field) }}
            </td>
            {% set fieldNum = fieldNum + 1 %}
        {% endfor %}
        {% if allow_delete %}
            <td class="align_center align_middle"><a href="#/" class="fmu_delete_button btn btn-default btn-xs"><i class="fa fa-times"></i></a></td>
        {% endif %}
    </tr>
    {% endspaceless %}
{% endblock %}

我想使用但不起作用的代码:

View 保持不变

{# From file myview.html.twig #}
{% form_theme form ':Model:prototype_table_collection.html.twig' %}
{% form(form) %}

这里我试图从第一个 block 中外部化代码

{# From file ':Model:prototype_table_collection.html.twig' #}
{% block collection_widget %}
    {{include(':Model:collection_widget.html.twig')}}
{%end block%}

{% block collection_header %}
{#stays the same as the previous code for this block. It is called by the block collection_widget #}
{%end block%}

{% block collection_body %}
{#stays the same as the previous code for this block. It is called by the block collection_widget #}
{%end block%}

新的外部文件:

{#From file ':Model:collection_widget.html.twig' #}
{# Here I put the same exact code as I had before inside the block collection_widget, I'm not changing the code, I'm just trying to externalize this part #}

包含不起作用,我的收藏无法加载。

我尝试过扩展布局,但它也不起作用。 示例:

{# From file ':Model:prototype_table_collection.html.twig' #}
{% extends :Model:parent.html.twig' %}

{% block content %}

{% block collection_header %}
{#stays the same as the previous code for this block. It is called by the block collection_widget #}
{%end block%}

{% block collection_body %}
{#stays the same as the previous code for this block. It is called by the block collection_widget #}
{%end block%}

{%end block%}

和 parent :

{# From file ':Model:parent.html.twig' #}

{% block collection_widget %}
    {# same code as brefore #}
{%end block%}

{% block content %}
{% endblock %}

如何避免在我使用它的每个表单模板中重复此 {% block collection_widget %} 代码?

最佳答案

我相信您正在寻找 horizontal reuse功能:

Horizontal reuse is an advanced Twig feature that is hardly ever needed in regular templates. It is mainly used by projects that need to make template blocks reusable without using inheritance.

只需在主模板中包含 use 标签即可:

{# :Model:prototype_table_collection.html.twig #}

{% use ':Model:collection_widget.html.twig' %}

{% block collection_header %}
    {# code #}
{%end block%}

{% block collection_body %}
    {# code #}
{%end block%}

然后定义 collection_widget block ,就像它首先在 prototype_table_collection.html.twig 文件中一样:

{# :Model:collection_widget.html.twig #}
{% block collection_widget %}
    {# code #}
{% endblock %}

关于php - symfony2/ Twig : how to use include in a block used in a form theme?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29452522/

有关php - symfony2/ Twig : how to use include in a block used in a form theme?的更多相关文章

  1. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  2. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  3. ruby - 通过 node-sass 的 Symfony assetic sass 过滤器? - 2

    我在让asseticsass过滤器与node-sass而不是ruby​​替代品一起工作时遇到了一些困难。我的config.yml文件中有以下配置:assetic:debug:"%kernel.debug%"use_controller:falsebundles:[]write-to:"%kernel.root_dir%/../web/assets"read_from:"%kernel.root_dir%/../web/assets"node:"%%PROGRAMFILES%%\nodejs\\node.exe"node_paths:["%%USERPROFILE%%\\AppData\

  4. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

    我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

  5. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

  6. 软件工程毕业设计课题(81)微信小程序毕业设计PHP校园跑腿小程序系统设计与实现 - 2

        项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。        因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不

  7. K8s部署PHP项目 - 2

    前言    前端时间PHP项目部署升级需要,需要把Laravel开发的项目部署K8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。一、部署步骤1.创建Dockerfile文件Dockerfile是一个用来构建镜像的文本文件,在容器运行时,需要把项目文件和项目运行所必须的组件安装其中。#基础镜像FROMphp:7.4-fpm#时区ARGTZ=Asia/Shanghai#更换容器时区RUNcp"/usr/share/zoneinfo/$TZ"/etc/localtime&&echo"$TZ">/etc/timezone#替换成阿里apt-get源RUNsed-i"s@http

  8. ruby-on-rails - PHP 开发人员学习 Ruby 和 Ruby on Rails - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我对学习Rails很感兴趣已经有一段时间了,我觉得现在正是浸入其中并实际动手实践的好时机。在过去的一周里,我阅读了所有我能找到的关于Ruby和RubyonRails的免费电子书。我刚刚读完RubyEssentials。我也一直在玩htt

  9. ruby-on-rails - Ruby 相当于 PHP 的 ucfirst() 函数 - 2

    在Ruby中(使用Rails,如果相关)将字符串首字母大写的最佳方法是什么?请注意String#capitalize不是我想要的,因为除了将字符串的首字母大写外,此函数还使所有其他字符变为小写(这是我不想要的——我想让它们保持原样):>>"aA".capitalize=>"Aa" 最佳答案 在Rails中你有String#titleize方法:"测试字符串标题化方法".titleize#=>"测试字符串标题化方法" 关于ruby-on-rails-Ruby相当于PHP的ucfirst()

  10. php - Ruby 和 PHP HMAC 不一致 - 2

    我尝试在Ruby中创建一个HMAC,然后在PHP中验证它。ruby:require'openssl'message="A522EBF2-5083-484D-99D9-AA97CE49FC6C,1234567890,/api/comic/aWh62,GET"key="3D2143BD-6F86-449F-992C-65ADC97B968B"hash=OpenSSL::HMAC.hexdigest('sha256',message,key)phashPHP:对于Ruby,我得到:20e3f261b762e8371decdf6f42a5892b530254e666508e885c708c5b

随机推荐