Une application web Meteor étant utilisée par un utilisateur "marchand" connecté qui a besoin de créer un lien et sms/email à son client. Le lien ouvre un formulaire. Le client remplit le formulaire et le soumet de sorte que les données soient insérées avec une propriété merchantId
, car de nombreux commerçants peuvent envoyer à de nombreux clients.
Cette application d'une seule page n'utilise pas de routeur mais peut envoyer des sms/e-mail. Comment lier un formulaire entre un commerçant et un client de manière élégante afin que les données du bon client soient "liées" au bon commerçant? MerciLien vers le formulaire envoyer et postérieurement envoyer à l'expéditeur dans Meteor
Répondre
Merchant Part
Vous pouvez déclencher après une émission réussie de l'e-mail/sms une méthode de météore, qui stocke un enregistrement de l'e-mail/sms envoyé dans une collection (dans cet exemple nommé Record
). Cela pourrait être le schéma pour elle:
Record Collection schéma (serveur/client)
{
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
}
Vous pouvez par exemple créer une méthode Meteor pour insérer le disque après l'envoi:
Insérer Record (serveur)
Meteor.methods({
insertRecord:function(recordData) {
//... check recordData by schmema and permissions here
return Records.insert(recordData);
}
})
S mettre fin à l'e-mail/SMS
Ainsi, la partie marchande de l'application envoie le lien via sms/e-mail et appelle la méthode insertRecord
pour stocker l'enregistrement de la sauvegarde.
Conserver la fiche (client ou serveur)
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);
partie client
Lorsque le client ouvre le lien qu'il déclenche une templatethat rendra votre formulaire. Vous pouvez initialement exécuter une méthode météore pour vérifier la collection Record pour un document qui correspond à l'URL du lien.
Get enregistrement par URL Méthode (serveur)
Meteor.methods({
getRecordByUrl:function(url) {
//... do your input checks here
return Records.findOne({link:url});
},
});
Modèle de formulaire (client)
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;
}
});
Vous pouvez ensuite utiliser ce document pour ajouter le merchantId
à le formulaire en tant qu'entrée masquée ou via l'attribut de données html.
{{#if getRecord}}
<form id="...">
<input type="hidden" name="merchantId" value="{{getMerchantId}}" />
<!-- other inputs here -->
</form>
{{/if}}
Les exemples peuvent bien sûr être optimisés, mais je pense que cette façon plus claire à comprendre.
Si un commerçant envoie une URL de formulaire comme 'www.company.com/customerPhoneNumber', comment puis-je obtenir le clientPhoneNumber onRendered afin que je puisse l'utiliser pour ouvrir un certain formulaire avec un assistant de modèle conditionnel et l'envoyer plus tard avec les données renvoyé par le client sur Envoyer? –
traitez manuellement 'window.location.href' si vous n'utilisez pas de routeur. – Jankapunkt
Quelle est votre frontend-egine? Blaze, Réagir, Angulaire, Vue? – Jankapunkt
Et le client ouvre-t-il à nouveau le formulaire dans l'application météore? – Jankapunkt
Installation de Meteor standard avec Blaze, je ne sais pas si je comprends parfaitement votre deuxième question. –