Mailchimpサインアップフォームを追加したい反応アプリがあります。私はカスタムサインアップフォームを作成しており、ユーザーに姓名と電子メールを入力してサインアップしてもらいます。私はキャンペーン関連のものを扱っていません。私が達成しようとしているのは、彼らがサインアップすると、サブスクリプションを確認するためのメールを受け取ることです。
Mailchimpガイドの内容を実行しました http://kb.mailchimp.com/lists/signup-forms/Host-your-own-signup-forms ですが、常にエラー500が発生します。
これが送信イベントのコードです
subscribe(event) {
event.preventDefault();
axios({
url: 'https://xxxxxx.us15.list-manage.com/subscribe/post',
method: 'post',
data: this.state,
dataType: 'json'
})
.then(() => {
console.log('success');
});
}
そしてここにフォームがあります
<form onSubmit={this.subscribe.bind(this)}>
<input type="hidden" name="u" value="xxxxxxxxxxx" />
<input type="hidden" name="id" value="xxxxxxxxxxx" />
<label>First Name</label>
<input name="FNAME" type="text" onChange={this.handler.bind(this, 'FNAME')} required="true"/>
<label>Last Name</label>
<input name="LNAME" type="text" onChange={this.handler.bind(this, 'LNAME')} required="true"/>
<label>Email</label>
<input name="EMAIL" type="email" onChange={this.handler.bind(this, 'EMAIL')} required="true"/>
<button type="submit" name="submit">Subscribe</button>
</form>
私はこのリンクの提案も試しました AJAX Mailchimpサインアップフォームの統合
基本的に、フォームへの入力の代わりに、URLとともにuおよびidを渡します。しかし、それもうまくいきませんでした。
誰もがこれを機能させる方法についてアイデアを持っていますか?ありがとう!!
可能です。 [1]
link で述べたように、MailChimpを使用すると、フォーム要素の値をクライアントに投稿して、ユーザーをメーリングリストに登録できます。それよりも高度なもので、APIを使用する必要があるため、CORSが必要です(つまり、クライアントはAPIを利用できません)。
React –を使用していない場合は、MailChimpの埋め込みフォームビルダーをコピーして貼り付けることができます。Reactを使用している場合は、次のことができます。
1)u
およびid
の値を取得します
これは上記のリンクで概説されています。または、フォームビルダーに移動してアクションフィールドを見つけることができます。これはhttps://cool.us16.list-manage.com/subscribe/post?u=eb05e4f830c2a04be30171b01&id=8281a64779
のようになります。ここで、u
およびid
はクエリ引数にあります。
2)onChange
およびvalue
属性をフォーム要素に追加します
単純なフォーム要素がいくつかあるだけであれば、タイプしても何も起こらないことに気付くでしょう。入力しても、入力要素内のテキストはレンダリングされません。 https://reactjs.org/docs/forms.html を読んで理由を理解してください。 (Reactは状態に対して単一の真の情報源を必要とします)。
値を更新する必要があります。これを行うには、バインドされている関数の状態を更新します。
<input
value={this.state.emailValue}
onChange={ (e)=>{this.setState({emailValue: e.target.value});} }
/>
3)ボーナス:MailChimpのアンチスパムフィールドを含める
埋め込みフォーム内のコードを読むと、次のようなことがわかります。
<!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
<div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_eb05e4f830c2a04be30171b01_8281a64779" tabindex="-1" value=""></div>
<div class="clear"><input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button"></div>
これらをReactに含めるには、BabelおよびJSXの適切なフィールドを変更します。class
はclassName
である必要があります。<input>
タグは閉じて、スタイルをオブジェクトとして渡す必要があります。
まとめると、これがコンポーネント全体です
import React from 'react'
class SubscribePage extends React.Component {
constructor(props) {
super(props);
this.state = {
emailValue: '',
fNameValue: '',
lNameValue: '',
};
}
render() {
return (
<form action="https://cool.us16.list-manage.com/subscribe/post" method="POST" noValidate>
<input type="hidden" name="u" value="eb05e4f830c2a04be30171b01"/>
<input type="hidden" name="id" value="8281a64779"/>
<label htmlFor='MERGE0'>
Email
<input
type="email"
name="EMAIL"
id="MERGE0"
value={this.state.emailValue}
onChange={ (e)=>{this.setState({emailValue: e.target.value});} }
autoCapitalize="off"
autoCorrect="off"
/>
</label>
<label htmlFor='MERGE1'>
First name
<input
type="text"
name="FNAME"
id="MERGE1"
value={this.state.fNameValue}
onChange={(e)=>{this.setState({fNameValue: e.target.value});}}
/>
</label>
<label htmlFor='MERGE2'>
Last name
<input
type="text"
name="LNAME"
id="MERGE2"
value={this.state.lNameValue}
onChange={(e)=>{this.setState({lNameValue: e.target.value});}}
/>
</label>
<input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" className="button"/>
<div style={{position: 'absolute', left: '-5000px'}} aria-hidden='true' aria-label="Please leave the following three fields empty">
<label htmlFor="b_name">Name: </label>
<input type="text" name="b_name" tabIndex="-1" value="" placeholder="Freddie" id="b_name"/>
<label htmlFor="b_email">Email: </label>
<input type="email" name="b_email" tabIndex="-1" value="" placeholder="[email protected]" id="b_email"/>
<label htmlFor="b_comment">Comment: </label>
<textarea name="b_comment" tabIndex="-1" placeholder="Please comment" id="b_comment"></textarea>
</div>
</form>
)
}
}
export default SubscribePage
[1]:ユーザーはMailChimpページに移動し、メールのリンクをクリックしてサブスクリプションを確認するよう求められます。これを回避するには、APIを使用する必要があります
Reactでフォームを機能させようとして、確認ページを開かないようにしようとすると、多くの問題に遭遇しました。
これを回避する方法はいくつかありますが、最も簡単な方法は react-mailchimp-subscribe パッケージを使用することです。これは非常にまっすぐで、パッケージはかなり軽いです。このフォームを機能させるために必要なのは、リストの埋め込みフォームページでMailchimpが提供するアクションURLだけです。
パッケージを使用したくない場合は、ソースに飛び込んで、非常に簡単に行われていることを再現できます。変更する必要があるいくつかのことはからのURLです
http://xxxxx.us#.list.com/subscribe/post?u=xxxxx&id=xxxx
に
http://xxxxx.us#.list.com/subscribe/post-json?u=xxxxx&id=xxxx
-json
を追加することに加えて、空のパラメーターc
を追加する必要があります(これはjsonpリクエストで行うか、&c=?
を追加してURLに追加できます)。
この実装を使用すると、リダイレクトされなくなり、すべてのメッセージがJSON形式で返されます。また、これを機能させるために、ページにスクリプトタグを配置する必要がないことにも注意してください。
参照:
@ marco-gaspariのように、これに関しても多くの問題に遭遇しました。私の答えはそれらのバリエーションですが、それを機能させるために私にとって必要ないくつかの微調整がありました。
post
の最後のaction
を_post-json
_に切り替え、_?
_に等しいc
属性を含めることに加えて(元のURLのu
およびid
属性に加えて、これらすべてを組み込むことを選択しました) hidden
入力フィールドとして)、出力を非表示の_<iframe>
_にリダイレクトする必要もありました。それ以外の場合は、json応答で新しいページが開きます。
これは、カスタムフォームを使用したことが原因である可能性があります。しかし、他にも カスタムMailchimpサインアップフォーム を使用している場合は、このソリューションが役立つ場合があります。
_<form action="https://xxx.usxx.list-manage.com/subscribe/post-json" method="post" className="validate" target="hiddenFrame" >
<!--u and id values from url generated by Mailchimp form builder -->
<input type="hidden" name="u" value="xxxxxxxx" />
<input type="hidden" name="id" value="xxxxxxx" />
<input type="hidden" name="c" value="?" />
</form>
<iframe name="hiddenFrame" src="about:blank" style={{display:'none'}}></iframe>
_