表单链接发送并稍后提交给Meteor中的发件人

时间:2017-09-30 07:39:22

标签: meteor

登录用户“商家”使用的Meteor网络应用程序需要创建链接并将短信/电子邮件发送给他的客户。该链接打开一个表单。客户填写表单并提交表单,以便使用属性merchantId插入数据,因为许多商家可以向许多客户发送。
此单页应用程序不使用路由器,但能够短信/电子邮件。如何优雅地完成商家与客户之间的表格链接,以便来自正确客户的数据与正确的商家“链接”?感谢

1 个答案:

答案 0 :(得分:1)

商家部分

成功发送电子邮件/短信后,您可以触发一个流媒体方法,该方法将已发送的电子邮件/短信的记录存储在一个集合中(在此示例中名为Record)。这可能是它的架构:

记录集合架构(服务器/客户端)

{
    merchantId:String, // the id of the sender
    customer:String, //id or name or address or phone num of receiver
    opened:Boolean, //when the link is opened can be set to true
    link:String, // the link to be send,
    type:Number, //0=sms, 1=email,
    expires:Date, //in case the link is not opened
}

例如,您可以创建一个Meteor方法,在发送后插入记录:

插入记录(服务器)

Meteor.methods({
    insertRecord:function(recordData) {
        //... check recordData by schmema and permissions here   
        return Records.insert(recordData);
    }
})

发送电子邮件/短信

因此,应用的商家部分通过短信/电子邮件发送链接,并调用insertRecord方法存储已保存的记录。

保存记录(客户端或服务器)

const callback=function(err, res) {
    if (res) { // assume your sent was successful here
        Meteor.call("insertRecord",  {
            //... your record credentials
        });
    }
}
// a little bit of pseudocode
if (sms)
    sms.send(form, callback);
else
    email.send(form, callback);

客户部分

当客户打开链接时,它会触发一个模板,该模板将呈现您的表单。您最初可以运行meteor方法来检查Record集合中是否有与链接URL匹配的文档。

通过网址方法(服务器)获取记录

Meteor.methods({
    getRecordByUrl:function(url) {
        //... do your input checks here
        return Records.findOne({link:url});
    },
});

表单模板(客户端)

Template.customerForm.onCreated(function(){

    const instance = this;
    instance.state = new ReactiveDict();
    instance.state.set("record", null);

    instance.autorun(function(){

        // if no record loaded yet
        if (!instance.state.get("record")) {

            Meteor.call("getRecordByUrl", window.location.href, function(err, res) {
                if (err || !res) {
                    //...handle err
                }
                this.state.set("record", res);
            }.bind(instance));  
        }
    });

});
Template.customerForm.helpers({
    getRecord() {
        return Template.instance().state.get("record");
    },

    getMerchantId() {
        const record = Template.instance().state.get("record");
        return record.merchantId;
    }
});

然后,您可以使用此文档将merchantId作为隐藏输入或通过html数据属性添加到表单中。

{{#if getRecord}}
    <form id="...">
        <input type="hidden" name="merchantId" value="{{getMerchantId}}" />
        <!-- other inputs here -->
    </form>
{{/if}}

这些例子当然可以进行优化,但我认为这样可以更清楚地理解。