2016-06-20 15 views
3

Ich bin derzeit auf ein Problem mit Gravity Forms und ReactJS stecken. Ich versuche, eine Gravitationsform als Modal in einer ReactJS-Komponente für Kontaktzwecke zu laden. Grundsätzlich, wie ich derzeit eingerichtet bin, ist eine GET aus der WP-API für die Seite mit dem Formular geladen in, und dann dangerouslySetInnerHTML, um die Seite in der Komponente zu bauen. Das Problem ist jedoch, dass wenn ich versuche, das Formular zu senden, gibt es ein Problem mit der POST. Sein Versuch, es an die URL von der GET einzureichen. Ich kann hier einige ernsthafte Hilfe für den besten Ansatz verwenden.Gravity Forms & ReactJS - Formular in Modal laden und senden

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; 

Antwort

0

kann diese Frage alt sein, aber Gebäude Reagieren Anwendungen auf Wordpress „facelessly“ mit dem WP REST API Dynamik in einer großen Weise gewinnt (es ist auch die Zukunft für Wordpress-Kern), so ist dies kommen gebunden mehr und mehr.

Also, was passiert ist, dass Gravity Forms setzt sie form action ist von über $action = remove_query_arg('gf_token'); die wiederum add_query_arg() ruft die dann $uri = $_SERVER['REQUEST_URI']; nennt - das bedeutet, dass, wenn Sie Wordpress Reagieren anzuzeigen verwenden, um Inhalte ein Gravity-Formular enthält, ist die Klage der Form gesetzt an den angegebenen REST-Endpunkt und nicht an den Permalink des Inhalts. Hoppla!

Obwohl Gravity Forms hat eine bona fide WP REST API-Add-on in Werken gibt es zwei feste Optionen, die ich habe in der Lage gewesen, so weit abtasten:

Option 1 - Fully Headless

Stellen Sie sicher, dass Sie über eine REST-Route verfügen, die POST akzeptiert (ich schlage vor, nur eine GET-Route zu verwenden) und fügen Sie do_action('wp'); Ihrem Routenrückruf hinzu. Sie könnten es früher hinzufügen, wenn Sie möchten, wie der rest_api_init Haken. Dadurch wird sichergestellt, dass Gravity Forms ausgelöst wird, wenn REST-Anforderungen an es gesendet werden.

Alternativ können Sie GFForms::maybe_process_form() von Ihrem Routenrückruf aufrufen oder als Rückruf im rest_api_init -Hook verwenden. Der Trick besteht darin, sicherzustellen, dass die Methode aufgerufen wird, wenn die API die Anforderung empfängt.

Als nächstes muss React Ihre Formularübergabe bearbeiten (Sie möchten nicht, dass der Browser sie direkt posten und Ihren Besuchern JSON zeigen). Die REST-API gibt automatisch eine Antwort mit einem richtig bearbeiteten Gravity Form-Markup zurück ... Validierungs-/Fehlermeldungen, Bestätigungen usw. Beachten Sie, dass Gravity Forms für diesen Ansatz ajax = false sein muss.

Option 2 - Faceless (Semi-Headless)

Angenommen, Sie möchten Wordpress die Permalinks erhalten, werden Sie wahrscheinlich haben Sie Ihre REST-API-Endpunkte konfiguriert ist, die Wordpress Permalink URIs entsprechen; So entspricht beispielsweise /wp-json/your-post-name-here/ . Wenn nicht, können Sie immer sicherstellen, dass Sie den URI zusammen mit Ihren Anfragen senden. Wenn dies ist, wie Sie es sind Handling, können Sie etwas wie folgt zum rest_api_init Haken hinzu:

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

Dies stellt sicher, dass die REQUEST_URI die aktuelle Seite passt, so dass die Schwerkraft Formular der Lage ist, erfolgreich per Post Daten ist zu WordPress. Während dies jedoch ermöglicht, dass Gravity Forms Postbacks tatsächlich den Server erreichen, erhalten Sie nichts sinnvolles zurück, wenn Sie nur der REST-API verwenden ... da die Antwort an die Anforderung an den Server gebunden ist, aber React führt eine neue, separate Anfrage an die API für Inhalte durch. Ergo, du bekommst eine frische Form. Nicht gut UX, das.

Um dies zu beheben, müssen Sie die Funktion, Klasse, Objekt usw., die Sie verwenden, um Ihre Daten vor rest_ensure_response ($ data) zu packen und aus einem wp_head() Hook aufrufen. Sie möchten die Daten json_encode() ausgeben und sie in einem Script-Tag als JavaScript-Variable ausgeben. So etwas wie folgt aus:

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

Dann in Ihrem Reagieren App, überprüfen Sie auf das Vorhandensein dieser Variablen zuerst, und die Daten verwenden, falls vorhanden. Falls nicht, greifen Sie wie gewohnt auf die REST-Anfrage zurück.

Ich weiß, dass diese Antwort sehr architektonisch ist, aber es gibt viele Möglichkeiten, dies anzugehen und es hängt stark davon ab, wie Sie Ihre React-Implementierung bereits mit WordPress strukturiert haben.