spivurno
12/22/2013 - 4:15 PM

Gravity Wiz // Gravity Forms Live Preview

Gravity Wiz // Gravity Forms Live Preview

<?php
/**
* Gravity Wiz // Gravity Forms Live Preview
*
* Preview your Gravity forms on the frontend of your website. Adds a "Live Preview" link to the Gravity Forms toolbar.
*
* @version   1.0.1
* @author    David Smith <david@gravitywiz.com>
* @license   GPL-2.0+
* @link      http://gravitywiz.com/...
* @copyright 2013 Gravity Wiz
*/
class GWLivePreview {

    var $post_type = 'gw_live_preview';
    var $preview_post = null;

    function __construct( $args = array() ) {

        if( ! property_exists( 'GFCommon', 'version' ) || ! version_compare( GFCommon::$version, '1.8', '>=' ) )
            return;

        $this->_args = wp_parse_args( $args, array(
            'id' => 0,
            'title' => true,
            'description' => true,
            'ajax' => false
        ) );

        add_action( 'admin_footer', array( $this, 'display_preview_link' ) );

        add_action( 'init', array( $this, 'register_preview_post_type' ) );
        add_action( 'parse_query', array( $this, 'maybe_load_preview_functionality' ) );

    }

    # ADMIN FUNCTIONS

    function display_preview_link() {

        if( ! $this->is_applicable_admin_page() )
            return;

        $form_id = rgget( 'id' );
        $url = get_post_type_archive_link( $this->post_type ) . '?id=' . $form_id;

        ?>

        <script type="text/javascript">
            (function($){
                $(  '<li class="gf_form_toolbar_preview"><a style="position:relative" id="gw-live-preview" href="<?php echo $url; ?>" target="_blank">' +
                    '<i class="fa fa-eye" style="position: absolute; text-shadow: 0px 0px 5px rgb(255, 255, 255); z-index: 99; line-height: 7px; left: 0px font-size: 9px; top: 20px; background-color: rgb(243, 243, 243);"></i>' +
                    '<i class="fa fa-file-o" style="margin-left: 5px; line-height: 12px; font-size: 18px; position: relative; top: 2px;"></i>' +
                    '<span style="padding-left:4px;"><?php _e( 'Live Preview' ); ?></span>' +
                    '</a></li>' )
                    .insertAfter( 'li.gf_form_toolbar_preview' );
            })(jQuery);
        </script>

    <?php
    }

    function is_applicable_admin_page() {
        return in_array( rgget( 'page' ), array( 'gf_edit_forms', 'gf_entries' ) ) && rgget( 'id' );
    }

    # FRONTEND FUNCTIONS

    function register_preview_post_type() {

        $args = array(
            'label' => __( 'Form Preview' ),
            'description' => __( 'A post type created for previewing Gravity Forms forms on the frontend.' ),
            'public' => false,
            'publicly_queryable' => true,
            'has_archive' => true,
            'can_export' => false,
            'supports' => false,
            'rewrite' => array(
                'slug' => 'gravity-forms-preview',
                'feeds' => false,
                'pages' => false
            )
        );

        register_post_type( $this->post_type, $args );

    }

    function maybe_load_preview_functionality( $wp_query ) {

        if( ! $wp_query->is_main_query() || ! $this->is_live_preview() ) {
            return;
        }

        $this->live_preview_hooks();

        $wp_query->query_vars['p'] = $this->get_preview_post( 'ID' );

        add_action( 'wp', array( $this, 'populate_post_content_for_gf_scripts_styles' ), 9 );

    }

    public function populate_post_content_for_gf_scripts_styles() {
        global $wp_query;

        foreach( $wp_query->posts as &$post ) {
            $post->post_content = $this->get_shortcode();
        }

    }

    function get_preview_post( $prop = false ) {

        $preview_posts = get_posts( array( 'post_type' => $this->post_type ) );
        $preview_post = false;

        // if there are no preview posts, create one
        if( empty( $preview_posts ) ) {
            $post_id = wp_insert_post( array(
                'post_type' => $this->post_type,
                'post_title' => __( 'Form Preview', 'gravityforms' ),
                'post_status' => 'publish'
            ) );
            $preview_post = get_post( $post_id );
        }
        // otherwise, use the first preview post (there should only be one)
        else {
            $preview_post = $preview_posts[0];
        }

        if( ! $preview_post ) {
            return false;
        } else if( $prop ) {
            return $preview_post->$prop;
        } else {
            return $preview_post;
        }

    }

    function live_preview_hooks() {

        add_filter( 'template_include', array( $this, 'load_preview_template' ), 11 );
        add_filter( 'the_content', array( $this, 'modify_preview_post_content' ) );

    }

    function load_preview_template( $template ) {

        $page_template = get_page_template();
        if( $page_template )
            return $page_template;

        $single_template = get_single_template();
        if( $single_template )
            return $single_template;

        return $template;
    }

    function modify_preview_post_content( $content ) {
        return $this->get_shortcode();
    }

    function get_shortcode( $args = array() ) {

        if( ! is_user_logged_in() )
            return '<p>' . __( 'You need to log in to preview forms.' ) . '</p>' . wp_login_form( array( 'echo' => false ) );

        if( ! GFCommon::current_user_can_any( 'gravityforms_preview_forms' ) )
            return __( 'Oops! It doesn\'t look like you have the necessary permission to preview this form.' );

        if( empty( $args ) )
            $args = $this->get_shortcode_parameters_from_query_string();

        extract( wp_parse_args( $args, $this->_args ) );

        $title       = $this->is_true_value( $title ) ? 'true' : 'false';
        $description = $this->is_true_value( $description ) ? 'true' : 'false';
        $ajax        = $this->is_true_value( $ajax ) ? 'true' : 'false';

        return "[gravityform id='$id' title='$title' description='$description' ajax='$ajax']";
    }

    function get_shortcode_parameters_from_query_string() {
        return array_filter( array(
            'id'          => rgget( 'id' ),
            'title'       => rgget( 'title' ),
            'description' => rgget( 'description' ),
            'ajax'        => rgget( 'ajax' )
        ) );
    }

    function is_true_value( $value ) {
        return $value === true || intval( $value ) === 1 || strtolower( $value ) === 'true';
    }

    function is_live_preview() {
        return is_post_type_archive( $this->post_type );
    }

}

new GWLivePreview();
<?php

# Default Usage

new GWLivePreview();

# With Configuration Options (hide title, hide description, enable ajax)

new GWLivePreview( array( 
  'title' => false, 
  'description' => false,
  'ajax' => true
) );