2017-09-30 8 views
1

ログインしたユーザー「商人」がリンクを作成し、顧客にSMS /電子メールで送信するMeteor Webアプリケーション。リンクがフォームを開きます。多くの商人が多くの顧客に送ることができるので、顧客がフォームを記入して提出すると、データがプロパティmerchantIdで挿入されます。
この1ページのアプリはルータを使用していませんが、SMS /電子メールを送信できます。正しい顧客からのデータが正しいマーチャントに「リンク」されるように、マーチャントと顧客の間でフォームをエレガントに結び付けることができますか?あなたは電子メールの送信に成功した後にトリガすることができますおかげフォームリンクを送って、後でMeteorの送信者に送信

+0

あなたのフロントエンドは何ですか?燃える、反応する、角度、ビュー – Jankapunkt

+0

また、顧客は流星群のアプリケーションでフォームを再び開いていますか? – Jankapunkt

+0

Blazeでの標準的な流星のインストール、私はあなたの2番目の質問を完全に理解しているかどうかはわかりません。 –

答えて

1

マーチャント・パート

は/(Recordという名前のこの例では)コレクションで送信される電子メール/ SMSの記録を保存する流星方法を、SMS。これはそれのためのスキーマが考えられます。

のレコードコレクションのスキーマ(サーバ/クライアント)

{ 
    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.methods({ 
    insertRecord:function(recordData) { 
     //... check recordData by schmema and permissions here 
     return Records.insert(recordData); 
    } 
}) 

S

アプリのマーチャント部がsms/email経由でリンクを送信し、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); 

カスタマー・パート顧客は、それはあなたのフォームをレンダリングしますtemplatethatをトリガーするリンクを開く

。 meteorメソッドを実行して、リンクURLと一致するドキュメントのレコードコレクションをチェックすることができます。

のURL方法(サーバー)あなたは、その後にmerchantIdを追加するには、この文書を使用することができます

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; 
    } 
}); 

でレコードを取得フォームは隠し入力またはHTMLデータ属性のいずれかとなります。

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

例はもちろん最適化することができますが、私はこれを理解することがより明確になると思います。

+0

マーチャントが 'www.company.com/customerPhoneNumber'のようなフォームURLを送信した場合、customerPhoneNumber onRenderedを取得して条件付きテンプレートヘルパーを使用して特定のフォームを開き、後でそのデータを送信することができます送信時に顧客から返信されますか? –

+0

ルータを使用していない場合は、手動で 'window.location.href'を処理します。 – Jankapunkt

関連する問題