【问题标题】:Symfony CRUD - Forms and "View"Symfony CRUD - 表单和“视图”
【发布时间】:2017-06-27 17:57:58
【问题描述】:

在 Symfony 中使用 Forms 组件时,有没有办法重用该组件或表单的一部分,即 CRUD 的 “视图”“读取”部分。

我创建了一个表单类型(为了这个问题的目的而变得简单):

class CustomerType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, array('label' => 'Customer Surname'))
            ->add('submit', SubmitType::class, array('label' => 'Create'))
            ;
    }
}

对于“编辑”部分,很简单:

{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_end(form) }}

并传递'form' => $form->createForm() 进行渲染。

这将从类型定义中生成标签和所有内容。

但是,当涉及到 view 阅读时,似乎我必须这样做:

<span>Customer Surname</span> {{ data.name }}

并将'data' =&gt; $customer 对象传递给渲染器。

有什么方法可以获取表单类型的“标签”部分并在创建 “视图”“读取”模板时使用它,所以当我更新标签时它会在两个 “view”“read”和“update”部分?

表单似乎非常有用,尤其是具有数据转换之类的功能,但在“更新”和 “视图”“读取”之间似乎有点重复代码。

【问题讨论】:

    标签: forms symfony crud


    【解决方案1】:

    是的。您可以使用翻译。

    形式:

    ->add('name',TextType::class, array('label' => 'form.name'))
    

    在视图中 - form/form_label.html.twig

    {% block form_label %}
        {% spaceless %}
            <label for="{{ id }}">{{ id|replace({'_':'.'})|trans }}</label>
        {% endspaceless %}
    {% endblock form_label %}
    

    config.yml

    framework:
        translator:      { fallbacks: ["%locale%"] }
    twig:
        form_themes:
            - 'form/form_label.html.twig'
    

    在您可以使用的任何视图中

    {{ 'form.name'|trans }}
    

    但尽量不要分配任何标签,那么您可以使用生成的默认标签为:

    < name of bundle >_< name of class >_< name of property > 
    

    当然,您还应该定义翻译。我假设您知道如何使用翻译。如果没有,请查看文档:

    https://symfony.com/doc/current/components/translation/usage.html

    更新 - 扩展答案

    messages.yml 示例

    1) 如果您想手动创建标签并使用 {{ 'form.name'|trans }}

    form:
        name: 'Customer Name'
    

    2)如果你不想写样板,(我更喜欢这种方式)

     app:
         customer:
             name: 'Customer Name'
    

    我假设您的捆绑包名称为 AppBundle,您的类名称为客户。您现在可以在 crud 的“读取”部分使用字符串“客户名称”:

    <span>{{'app.customer.name'|trans}}</span>{{customer.name}}
    

    而且在形式上它会自动添加,所以有足够的

    {{form_start(form)}}
    {{form_rest(form)}}
    <input type="sumbit" name="Create/update - or translations of these words">
    {{form_end(form)}}
    

    有很好的做法,以这种方式编写表单,并且不要将sumbit 附加到表单定义中。它允许在将来更轻松地构建嵌套表单并创建一个用于创建和编辑的表单。

    【讨论】:

    • 感谢丹尼尔的回答,但我不确定这是否能回答我想问的问题。当我说“查看”时,我实际上是指“读取”,就像您通常只显示来自实体的数据一样。
    • 我了解您只想在代码的一处写上Customer Surname。如果是,那么翻译是实现这一目标的最纯粹的方式。如果您想拥有非常少量的代码,请不要在表单中设置标签。将自动创建为例如app_customer_name,然后在 form_label.html.twig 中将其转换为app.customer.name 的翻译。接下来您应该添加翻译,您可以在任何视图中使用 {{ 'app.customer.name' }} - 在读取、更新、删除和创建 crud 的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多