Overview

Classes

  • Gravity_Flow_API
  • Gravity_Flow_Step
  • Gravity_Flow_Step_Feed_Add_On
  • Overview
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 
<?php
/**
 * Gravity_Flow_Step_Feed_Add_On
 *
 * @package     GravityFlow
 * @subpackage  Classes/Step_Feed_Add_On
 * @copyright   Copyright (c) 2015-2018, Steven Henty S.L.
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 * @since       1.0
 */

if ( ! class_exists( 'GFForms' ) ) {
    die();
}

/**
 * Abstract class to be used for integration with Gravity Forms Feed Add-Ons.
 * Extend this class to integrate any Gravity Forms Add-On that is built using the Feed-Add-On Framework.
 *
 * Register your extending class using Gravity_Flow_Steps::register().
 * example:
 * Gravity_Flow_Steps::register( new Gravity_Flow_Step_My_Feed_Add_On_Step() )
 *
 * Class Gravity_Flow_Step_Feed_Add_On
 *
 * @since 1.0
 */
abstract class Gravity_Flow_Step_Feed_Add_On extends Gravity_Flow_Step {

    /**
     * The name of the class used by the add-on. Example: GFMailChimp.
     *
     * @var string
     */
    protected $_class_name = '';

    /**
     * The add-on slug. Example: gravityformsmailchimp.
     *
     * @var string
     */
    protected $_slug = '';

    /**
     * The feeds processed for the current entry.
     *
     * @var array
     */
    private $_processed_feeds = array();

    /**
     * Returns the class name for the add-on.
     *
     * @return string
     */
    public function get_feed_add_on_class_name() {
        return $this->_class_name;
    }

    /**
     * Is this feed step supported on this server? Override to hide this step in the list of step types if the requirements are not met.
     *
     * @return bool
     */
    public function is_supported() {
        $is_supported      = true;
        $feed_add_on_class = $this->get_feed_add_on_class_name();
        if ( ! class_exists( $feed_add_on_class ) ) {
            $is_supported = false;
        }

        return $is_supported;
    }

    /**
     * Returns the settings for this step.
     *
     * @return array
     */
    public function get_settings() {
        $fields = array();

        if ( ! $this->is_supported() ) {
            return $fields;
        }

        $feeds = $this->get_feeds();

        $feed_choices = array();
        foreach ( $feeds as $feed ) {
            if ( $feed['is_active'] ) {
                $label = $this->get_feed_label( $feed );

                $feed_choices[] = array(
                    'label' => $label,
                    'name'  => 'feed_' . $feed['id'],
                );
            }
        }

        if ( ! empty( $feed_choices ) ) {
            $fields[] = array(
                'name'     => 'feeds',
                'required' => true,
                'label'    => esc_html__( 'Feeds', 'gravityflow' ),
                'type'     => 'checkbox',
                'choices'  => $feed_choices,
            );
        }

        if ( empty( $fields ) ) {
            $html     = esc_html__( "You don't have any feeds set up.", 'gravityflow' );
            $fields[] = array(
                'name'  => 'no_feeds',
                'label' => esc_html__( 'Feeds', 'gravityflow' ),
                'type'  => 'html',
                'html'  => $html,
            );
        }

        return array(
            'title'  => $this->get_label(),
            'fields' => $fields,
        );
    }


    /**
     * Processes this step.
     *
     * @return bool Is the step complete?
     */
    public function process() {
        $form     = $this->get_form();
        $entry    = $this->get_entry();
        $complete = true;

        $add_on_feeds = $this->get_processed_add_on_feeds();
        $feeds        = $this->get_feeds();

        foreach ( $feeds as $feed ) {
            $setting_key = 'feed_' . $feed['id'];
            if ( $this->{$setting_key} ) {
                if ( $this->is_feed_condition_met( $feed, $form, $entry ) ) {

                    $complete = $this->process_feed( $feed );
                    $label    = $this->get_feed_label( $feed );

                    if ( $complete ) {
                        $note = sprintf( esc_html__( 'Processed: %s', 'gravityflow' ), $label );
                        $this->log_debug( __METHOD__ . '() - Feed processed: ' . $label );
                        $add_on_feeds = $this->maybe_set_processed_feed( $add_on_feeds, $feed['id'] );
                    } else {
                        $note = sprintf( esc_html__( 'Initiated: %s', 'gravityflow' ), $label );
                        $this->log_debug( __METHOD__ . '() - Feed processing initiated: ' . $label );
                        $add_on_feeds = $this->maybe_unset_processed_feed( $add_on_feeds, $feed['id'] );
                    }

                    $this->add_note( $note );
                } else {
                    $this->log_debug( __METHOD__ . '() - Feed condition not met' );
                }
            }
        }

        $this->update_processed_feeds( $add_on_feeds );

        return $complete;
    }

    /**
     * Returns the feeds for the add-on.
     *
     * @return array|mixed
     */
    public function get_feeds() {
        $form_id = $this->get_form_id();

        if ( $this->is_supported() ) {
            /* @var GFFeedAddOn $add_on */
            $add_on = $this->get_add_on_instance();
            $feeds  = $add_on->get_feeds( $form_id );
        } else {
            $feeds = array();
        }

        return $feeds;
    }

    /**
     * Processes the given feed for the add-on.
     *
     * @param array $feed The add-on feed properties.
     *
     * @return bool Is feed processing complete?
     */
    public function process_feed( $feed ) {
        $form   = $this->get_form();
        $entry  = $this->get_entry();
        $add_on = $this->get_add_on_instance();

        $add_on->process_feed( $feed, $entry, $form );

        return true;
    }

    /**
     * Prevent the feeds assigned to the current step from being processed by the associated add-on.
     */
    public function intercept_submission() {
        $form_id = $this->get_form_id();
        $slug    = $this->get_slug();
        add_filter( "gform_{$slug}_pre_process_feeds_{$form_id}", array( $this, 'pre_process_feeds' ), 10, 2 );
    }

    /**
     * Returns the label of the given feed.
     *
     * @param array $feed The add-on feed properties.
     *
     * @return string
     */
    public function get_feed_label( $feed ) {
        $label = $feed['meta']['feedName'];

        return $label;
    }

    /**
     * Determines if the supplied feed should be processed.
     *
     * @param array $feed  The current feed.
     * @param array $form  The current form.
     * @param array $entry The current entry.
     *
     * @return bool
     */
    public function is_feed_condition_met( $feed, $form, $entry ) {

        return gravity_flow()->is_feed_condition_met( $feed, $form, $entry );
    }

    /**
     * Retrieve an instance of the add-on associated with this step.
     *
     * @return GFFeedAddOn
     */
    public function get_add_on_instance() {
        $add_on = call_user_func( array( $this->get_feed_add_on_class_name(), 'get_instance' ) );

        return $add_on;
    }

    /**
     * Remove the feeds assigned to the current step from the array to be processed by the associated add-on.
     *
     * @param array $feeds An array of $feed objects for the add-on currently being processed.
     * @param array $entry The entry object currently being processed.
     *
     * @return array
     */
    public function pre_process_feeds( $feeds, $entry ) {
        if ( is_array( $feeds ) ) {
            foreach ( $feeds as $key => $feed ) {
                $setting_key = 'feed_' . $feed['id'];
                if ( $this->{$setting_key} ) {
                    $this->get_add_on_instance()->log_debug( __METHOD__ . "(): Delaying feed (#{$feed['id']} - {$this->get_feed_label( $feed )}) for entry #{$entry['id']}." );
                    $this->get_add_on_instance()->delay_feed( $feed, $entry, $this->get_form() );
                    unset( $feeds[ $key ] );
                }
            }
        }

        return $feeds;
    }

    /**
     * Ensure active steps are not processed if the associated add-on is not available.
     *
     * @return bool
     */
    public function is_active() {
        $is_active = parent::is_active();

        if ( $is_active && ! $this->is_supported() ) {
            $is_active = false;
        }

        return $is_active;
    }

    /**
     * Get the slug for the add-on associated with this step.
     *
     * @return string
     */
    public function get_slug() {
        if ( empty( $this->_slug ) ) {
            $this->_slug = $this->get_add_on_instance()->get_slug();
        }

        return $this->_slug;
    }

    /**
     * Retrieve an array containing the IDs of all the feeds processed for the current entry.
     *
     * @param bool|int $entry_id False or the ID of the entry the meta should be retrieved from.
     *
     * @return array
     */
    public function get_processed_feeds( $entry_id = false ) {
        if ( ! empty( $this->_processed_feeds ) ) {
            return $this->_processed_feeds;
        }

        if ( ! $entry_id ) {
            $entry_id = $this->get_entry_id();
        }

        $processed_feeds = gform_get_meta( $entry_id, 'processed_feeds' );
        if ( empty( $processed_feeds ) ) {
            $processed_feeds = array();
        }

        $this->_processed_feeds = $processed_feeds;

        return $processed_feeds;
    }


    /**
     * Retrieve an array of this add-ons feed IDs which have been processed for the current entry.
     *
     * @param bool|int $entry_id False or the ID of the entry the meta should be retrieved from.
     *
     * @return array
     */
    public function get_processed_add_on_feeds( $entry_id = false ) {
        $processed_feeds = $this->get_processed_feeds( $entry_id );
        $add_on_feeds    = rgar( $processed_feeds, $this->get_slug() );
        if ( empty( $add_on_feeds ) ) {
            $add_on_feeds = array();
        }

        return $add_on_feeds;
    }

    /**
     * Add the ID of the current feed to the processed feeds array for the current add-on.
     *
     * @param array $add_on_feeds The IDs of the processed feeds.
     * @param int   $feed_id      The ID of the processed feed.
     *
     * @return array
     */
    public function maybe_set_processed_feed( $add_on_feeds, $feed_id ) {
        if ( ! in_array( $feed_id, $add_on_feeds ) ) {
            $add_on_feeds[] = $feed_id;
        }

        return $add_on_feeds;
    }

    /**
     * If necessary remove the current feed from the processed feeds array for the current add-on.
     *
     * @param array $add_on_feeds The IDs of the processed feeds.
     * @param int   $feed_id      The ID of the processed feed.
     *
     * @return array
     */
    public function maybe_unset_processed_feed( $add_on_feeds, $feed_id ) {
        foreach ( $add_on_feeds as $key => $id ) {
            if ( $id == $feed_id ) {
                unset( $add_on_feeds[ $key ] );
                break;
            }
        }

        return $add_on_feeds;
    }

    /**
     * Update the processed_feeds array for the current entry.
     *
     * @param array    $add_on_feeds The IDs of the processed feeds for the current add-on.
     * @param bool|int $entry_id     False or the ID of the entry the meta should be saved for.
     */
    public function update_processed_feeds( $add_on_feeds, $entry_id = false ) {
        if ( ! $entry_id ) {
            $entry_id = $this->get_entry_id();
        }

        $processed_feeds                      = $this->get_processed_feeds( $entry_id );
        $processed_feeds[ $this->get_slug() ] = $add_on_feeds;
        $this->_processed_feeds               = $processed_feeds;

        gform_update_meta( $entry_id, 'processed_feeds', $processed_feeds );
    }

    /**
     * Evaluates the status for the step.
     *
     * The step is only complete when all the feeds for this step have been added to the entry meta processed_feeds array.
     *
     * @return string 'pending' or 'complete'
     */
    public function status_evaluation() {
        $add_on_feeds = $this->get_processed_add_on_feeds();
        $feeds        = $this->get_feeds();

        $form  = $this->get_form();
        $entry = $this->get_entry();

        foreach ( $feeds as $feed ) {
            $setting_key = 'feed_' . $feed['id'];
            if ( $this->{$setting_key} && ! in_array( $feed['id'], $add_on_feeds ) && $this->is_feed_condition_met( $feed, $form, $entry ) ) {
                return 'pending';
            }
        }

        return 'complete';
    }

}
Gravity Flow API documentation generated by ApiGen