OroPlatform:覆盖 oro_datetime_widget 选项

Posted

技术标签:

【中文标题】OroPlatform:覆盖 oro_datetime_widget 选项【英文标题】:OroPlatform: override oro_datetime_widget options 【发布时间】:2021-06-15 15:03:18 【问题描述】:

上下文

我实际上是在尝试更改OroDateTimeType::class 的时间输入的默认占位符。

例如,我想要文本 Horaires 而不是 Temps

这是我的 FormType 中的表单字段:

->add('expirationDate', OroDateTimeType::class, [
    'label' => 'app.subscription.fields.expirationDate',
])

在我的树枝视图中:

form_row(form.expirationDate)

问题

一开始,我尝试将 Symfony 4 placeholder 选项用于 DateTime 类型:https://symfony.com/doc/4.4/reference/forms/types/date.html#placeholder。它不起作用,因为OroDateTime 使用了不同的日期选择器,并且它在加载时覆盖了 Symfony 值:

# vendor/oro/platform/src/Oro/Bundle/FormBundle/Resources/views/Form/fields.html.twig #

% block oro_datetime_widget %
    % set dateValidation = 'Date' :  %
    % set timeValidation = 'Time' :  %

    % if required %
        % set dateValidation = dateValidation|merge('NotBlank' : ) %
        % set timeValidation = timeValidation|merge('NotBlank' : ) %
    % endif %

    % if attribute(attr, 'class') is defined %
        % set attrClass = attr['class'] %
    % else %
        % set attrClass = '' %
    % endif %

    % set options = 
        view: 'oroui/js/app/views/datepicker/datetimepicker-view',
        nativeMode: isMobileVersion(),
        dateInputAttrs: 
            placeholder: 'oro.form.choose_date'|trans,
            id: id,
            name: id,
            class: 'input-small datepicker-input ' ~ attrClass,
            'data-validation': dateValidation|json_encode(constant('JSON_FORCE_OBJECT')),
            'aria-live': 'assertive',
            autocomplete: 'off',
            autocorrect: 'off',
            autocapitalize: 'off'
        ,
        datePickerOptions: 
            altFormat: 'yy-mm-dd',
            changeMonth: true,
            changeYear: true,
            yearRange: years|default('-80:+1'),
            showButtonPanel: true
        ,
        timeInputAttrs: 
            placeholder: 'oro.form.choose_time'|trans,
            id: 'time_selector_' ~ id,
            name: 'time_selector_' ~ id,
            class: 'input-small timepicker-input ' ~ attrClass,
            'data-validation': timeValidation|json_encode(constant('JSON_FORCE_OBJECT'))
        ,
        timePickerOptions: 
        
     %
    % set id = 'hidden_' ~ id %
    % set attr = attr|merge(
        'data-page-component-module': 'oroui/js/app/components/view-component',
        'data-page-component-options': options|json_encode(constant('JSON_FORCE_OBJECT'))
    ) %

     block('datetime_widget') 
% endblock oro_datetime_widget %

如果我从 options 变量中更改值 timeInputAttrs.placeholder。有用。 但是,我想将此变量传递给我的特定表单字段,而不是全局传递。

更新

我最终选择在全局更改我的项目中的oro.form.choose_time 翻译。

所以,在我的Resources/translations/messages.fr_FR.yml 中,我创建了这些行:

oro:
  form:
    choose_time: Horaires
  auth:
    description:
      main: Baltimore

然后,我了解到翻译是在位于var/cache/dev/translations/catalogue.fr_FR 的文件中生成的:

<?php

use Symfony\Component\Translation\MessageCatalogue;

$catalogue = new MessageCatalogue('fr_FR', array (
  'messages' => 
  array (
    'oro.form.choose_time' => 'Temps',
    'oro.auth.description.main' => 'Baltimore',

在这里,我可以看到 oro.auth.description.main 更改已应用,但键 oro.form.choose_time 的值仍然相同。

也许我有一个命令要运行?

【问题讨论】:

当您已经使用来自 Crowdin 的更新或 UI 中的手动编辑覆盖翻译时,将不再应用 YAML 更改。在这种情况下,您必须编写数据迁移来更新数据库中加载的翻译。 【参考方案1】:

在 Oro 应用程序 UI 中覆盖任何文本的最简单方法是覆盖用于呈现它的消息的翻译。由于表单占位符也被翻译,您可以使用此技术。如果这是您对表单唯一需要的自定义,请关注this guide。

如果你想覆盖一个 HTML,你可以通过 the template overriding guide 来扩展模板。

但是,由于您想修改单个表单的标签,那么最好的方法是 extend the form type 并使用新选项覆盖单个表单字段。

【讨论】:

感谢不同的方法。我已经用你的第一个解决方案更新了我问题的最后一部分。

以上是关于OroPlatform:覆盖 oro_datetime_widget 选项的主要内容,如果未能解决你的问题,请参考以下文章

OroPlatform:覆盖核心实体表单构建器

OroPlatform:覆盖 oro_datetime_widget 选项

OroPlatform:网格行上的自定义操作

OroPlatform:如何实现 MultiFileType

OroPlatform:在核心实体上添加自定义字段

使用 OROPlatform 时如何测试自己的代码?