_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'; } }