SimpleSchema和AutoForm:将密码字段渲染为单个输入

时间:2017-07-04 06:45:04

标签: meteor meteor-autoform simple-schema meteor-collection2

我正在一个超级管理员"用户可以创建其他用户,设置用户名和密码。我有一个AutoForm Meteor.users根据附加到Usuarios.schema = new SimpleSchema({ ... username: { type: String, }, services: { type: Object, optional: true, blackbox: true }, "services.password": { type: String, optional: true, autoform: { type: 'password' } }, ... }); 集合的Accounts.createUser()呈现表单(使用Collection2)。 遵循Collection2 docs关于将架构附加到users集合的建议,我的架构如下所示:

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
    !-- Fix Porto Popup login -->
    <referenceBlock name="form.additional.info">
        <block class="W3solver\Phone\Block\Customer" template="W3solver_Phone::Customer.phtml" name="customer_form_user_attributes" cacheable="false">
            <action method="setFormCode">
                <argument name="code" xsi:type="string">customer_account_edit</argument>
            </action>
            <action method="setEntityModelClass">
                <argument name="code" xsi:type="string">Magento\Customer\Model\Customer</argument>
            </action>
        </block>
    </referenceBlock>
</body>

呈现的表单如下所示: Rendered template

但是我希望将Password字段呈现为Username one(没有Services面板)。 我还没有找到解决方法。我需要在模式中使用服务对象类型属性,或者在用户插入失败时验证失败(使用babel-loader),因此,面板将被渲染(因为属性的对象类型)。

关于如何实现所需模板渲染的任何想法?

1 个答案:

答案 0 :(得分:0)

您的密码是&#39;服务的一部分&#39;对象,这就是使用quickForm或quickFields时在afObjectField中自动呈现的原因:

  

afObjectField

     

当您对作为Object的字段使用afQuickField组件时,   除非您覆盖,否则使用afObjectField组件呈现它   类型或指定选项。使用a时,默认情况下会发生这种情况   quickForm用于具有Object类型字段的模式。

     

afObjectField组件呈现所有对象字段的子字段   一起作为一个群体。该组标有名称   对象字段。该组的实际视觉表现形式会有所不同   根据您使用的主题模板。对于&#34; bootstrap3&#34;默认   模板,该组显示在带有标题的面板中。

解决方案A:手动表单呈现

要将密码呈现为单个字段,您需要手动设置autForm并使用afFieldInput引用字段。 mthen的形式可能看起来像(未经过测试,但代码看起来应该是这样的):

{{> autoForm id="login" schema=Usuarios.schema}}
    {{> afFieldInput type="text" name="username"}}
    {{> afFieldInput type="password" name="services.password"}}
{{/autoForm}}

其优势在于您的表单看起来完全符合您的要求,但却有缺点,您必须手动添加所有附加内容(验证消息和内容)。

解决方案B:更改架构

当您从服务组中提取密码时,您将获得与用户名相同的自动呈现效果:单个输入字段。

Usuarios.schema = new SimpleSchema({
    ...
    username: {
        type: String,
    },
    services: {
        type: Object,
        optional: true,
        blackbox: true
    },
    ...
   password: {
      type: String,
      optional: true,
      autoform: {
         type: 'password'
      }
    },
    ...
});