2016-06-20 6 views
3

現在Gravity FormsとReactJSの問題に悩まされています。私はコンタクト目的でReactJSコンポーネントにモーダルとしてGravity Formをロードしようとしています。基本的には、私が現在設定している方法は、フォームがロードされたページのWP-APIからGETを実行してから、dangerouslySetInnerHTMLを使用してコンポーネントにページを構築することです。問題は、私がフォームを提出しようとすると、それが私にPOSTの問題を与えることです。そのGETからURLに送信しようとしています。私はここで真剣な助けを借りて最高のアプローチをとることができます。Gravity Forms&ReactJS - モーダルにフォームをロードして送信する

import React, { PropTypes } from 'react'; 
import Modal from 'react-modal'; 
import $ from 'jquery'; 

class RequestContactModal extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     content: '' 
    }; 
    } 

    componentWillMount() { 
    const wpApiUrl = '../wp-json/wp/v2/pages/61'; 

    $.ajax({ 
     url: wpApiUrl, 
     type: 'GET' 
    }) 
     .done((response) => { 
     console.log(response); 
     this.setState({ 
      content: response.content.rendered 
     }); 
     }) 
     .fail((response) => { 
     console.log('fail'); 
     console.log(response); 
     }); 
    } 

    handleSubmit = (ev) => { 
    ev.preventDefault(); 
    this.props.closeModal(); 
    } 

    handleCloseClick = (ev) => { 
    ev.preventDefault(); 
    this.props.closeModal(); 
    } 

    render() { 
    const customStyles = { 
     overlay: { 
     backgroundColor: 'rgba(0, 0, 0, 0.65)' 
     }, 
     content: { 
     top: '50%', 
     left: '50%', 
     right: 'auto', 
     bottom: 'auto', 
     marginRight: '-50%', 
     transform: 'translate(-50%, -50%)', 
     background: '#fff' 
     } 
    }; 

    return (
     <Modal 
     isOpen={this.props.isOpen} 
     onRequestClose={this.props.closeModal} 
     style={customStyles} 
     > 
     <div> 
      <p>Gravity Forms</p> 
      <div dangerouslySetInnerHTML={{__html: this.state.content}} /> 
     </div> 
     </Modal> 
    ); 
    } 
} 

RequestContactModal.propTypes = { 
    closeModal: PropTypes.func.isRequired, 
    isOpen: PropTypes.bool 
}; 

RequestContactModal.defaultProps = { 
    isOpen: false 
}; 

export default RequestContactModal; 

答えて

0

WPのREST APIを使用して「facelessly」この質問は古いかもしれないが、建物はワードプレス上のアプリケーションに反応(それはWordPressのコアのためにも、将来のです)巨大な方法で勢いを増しているので、これは来てバインドされていますますます増えています。

は、だから何が起こっていることは重力フォームは、それが今度は、その後$uri = $_SERVER['REQUEST_URI'];を呼び出しadd_query_arg()を呼び出し$action = remove_query_arg('gf_token');経由することにより、フォームのアクションの設定ということである - これはあなたが使用するときに重力フォームを含むWordPressのコンテンツを表示するように反応することを意味し、フォームのアクションが設定されていますコンテンツのパーマリンクではなく、呼び出されたRESTエンドポイントに転送します。うわー!

重力フォームは正真正銘のWP REST APIはアドオン作品でありますが、私は今のところ出てSUSSすることができました2つの固体のオプションがあります。

オプション1 - 完全にヘッドレス

は、 POSTを受け付けるRESTルートがあることを確認してください(GETルートを再利用することをお勧めします)。ルートコールバックにdo_action('wp');を追加してください。あなたが好きな場合は、rest_api_initフックのように早く追加することができます。これにより、REST要求が送信されたときにGravity Formsが確実にトリガーされます。

また、GFForms::maybe_process_form()をルートコールバックから呼び出すか、rest_api_initフックのコールバックとして使用できます。このトリックは、APIが要求を受け取ったときにメソッドが確実に呼び出されるようにすることです。

次に、Reactにフォーム送信を処理させます(ブラウザが実際に直接投稿し、訪問者JSONを表示しないようにします)。 REST APIは、適切に処理されたGravity Formマークアップ...検証/エラーメッセージ、確認などを含むレスポンスを自動的に返します。このアプローチでは、Gravity Formsはajax = falseである必要があります。

オプション2 - 顔のない(セミヘッドレス)

あなたは、ワードプレスのパーマリンクを保持したいと仮定すると、あなたはおそらく、ワードプレスのパーマリンクのURIと一致するように設定あなたのREST APIエンドポイントを持つことになります。したがって、たとえば/wp-json/your-post-name-here/はに相当します。そうでない場合は、リクエストと共にURIを送信していることを常に確認できます。これは、あなたがそれを処理する方法であれば、あなたはrest_api_initフックに、次のものを追加することができます:重力フォームが正常にのデータをポストすることができるように

function tweak_request_uri() { 
    $prefix = '/' . rest_get_url_prefix(); 
    $_SERVER['REQUEST_URI'] = str_replace($prefix, '', $_SERVER['REQUEST_URI']); 
} 

をこれは、REQUEST_URIが現在のページと一致していることを保証しますワードプレス。しかし、Gravity Formsのポストバックがサーバーに実際に到達することを許可していますが、 REST APIのみを使用している場合は意味がありません。レスポンスはサーバーへのリクエストに関連付けられているためですReactは、コンテンツに対してAPIに別々の新しいリクエストを作成しています。エルゴ、新鮮な形が得られる。良いUXではない、それ。

この問題を解決するには、rest_ensure_response($ data)の前にデータをパッケージ化し、wp_head()フック内から呼び出すために使用する関数、クラス、オブジェクトなどを使用する必要があります。データをjson_encode()してスクリプトタグ内でJavascript変数として出力したいとします。たとえば、次のようなものがあります。

var $react_first_load_data = json_encode([ 'id' => get_the_id(), 'title' => get_the_title(), 'content' => get_the_content() ]); 
printf('<script type="text/javascript">window.reactFirstLoadData=%s</script>', $react_first_load_data); 

次に、Reactアプリケーションでは、この変数が存在するかどうかをチェックし、存在する場合はそのデータを使用します。そうでない場合は、いつものようにRESTリクエストを作成してください。

私はこの回答が非常に建築的だと知っていますが、これに取り組む方法はたくさんあり、WordPressでReact実装をどのように構築しているかが大きく左右されます。

関連する問題