Filter values by Nested Entry.

Instructions

Code

Filename: gpeb-filter-by-nested-field.php

<?php
/**
 * Gravity Perks // Entry Blocks // Filter values by Nested Entry.
 * https://gravitywiz.com/documentation/gravity-forms-entry-blocks/
 *
 * Instruction Video: https://www.loom.com/share/f795e8b5ef58489794dca96e83fcd230
 *
 */
class GPEB_Filter_By_Nested_Entry {

	private $parent_form_id;
	private $nested_form_id;
	private $parent_hidden_field_id;
	private $nested_target_field_id;

	public function __construct( $config = array() ) {
		// check if required parameters are provided
		if ( empty( $config['parent_form_id'] ) || empty( $config['nested_form_id'] ) || empty( $config['parent_hidden_field_id'] ) || empty( $config['nested_target_field_id'] ) ) {
			return;
		}

		$this->parent_form_id         = rgar( $config, 'parent_form_id' );
		$this->nested_form_id         = rgar( $config, 'nested_form_id' );
		$this->parent_hidden_field_id = rgar( $config, 'parent_hidden_field_id' );
		$this->nested_target_field_id = rgar( $config, 'nested_target_field_id' );

		add_action( 'init', array( $this, 'init' ) );
	}

	public function init() {
		add_filter( 'gpeb_filter_form', array( $this, 'modify_filter_form' ) );
		add_filter( 'gpeb_queryer_entries', array( $this, 'filter_entries_by_nested_value' ), 10, 2 );
	}

	private function is_applicable_form( $form_id = null ) {
		if ( $form_id === null ) {
			$form_id = rgget( 'filters_form_id' );
		}
		return $form_id == $this->parent_form_id;
	}

	public function modify_filter_form( $form ) {
		if ( ! $this->is_applicable_form( $form['id'] ) ) {
			return $form;
		}

		foreach ( $form['fields'] as &$field ) {
			if ( $field->id == $this->parent_hidden_field_id ) {
				$nested_form_field = GFAPI::get_field( $this->nested_form_id, $this->nested_target_field_id );
				if ( ! $nested_form_field ) {
					error_log( sprintf( 'Nested form field with ID %d not found in form %d.', $this->nested_target_field_id, $this->nested_form_id ) );
					continue;
				}
				$field = $nested_form_field;
				$field->id = $this->parent_hidden_field_id;
			}
		}

		return $form;
	}

	public function filter_entries_by_nested_value( $entries, $gf_queryer ) {
		if ( ! $this->is_applicable_form() ) {
			return $entries;
		}

		$filters = rgget( 'filters' );
		if ( ! isset( $filters[ $this->parent_hidden_field_id ] ) ) {
			return $entries;
		}

		$nested_entries = GFAPI::get_entries( $this->nested_form_id, array(
			'field_filters' => array(
				array(
					'key'   => $this->nested_target_field_id,
					'value' => $filters[ $this->parent_hidden_field_id ],
				),
			),
		) );

		if ( is_wp_error( $nested_entries ) ) {
			error_log( sprintf( 'Error retrieving nested entries: %s', $nested_entries->get_error_message() ) );
			return $entries;
		}

		$entries = array();
		$parent_entry_ids = array();
		
		foreach ( $nested_entries as $nested_entry ) {
			$parent_entry_id = rgar( $nested_entry, 'gpnf_entry_parent' );
			$entry = GFAPI::get_entry( $parent_entry_id );
			if ( ! in_array( $parent_entry_id, $parent_entry_ids ) && $entry && ! is_wp_error( $entry ) ) {
				$parent_entry_ids[] = $parent_entry_id;
				$entries[] = $entry;
			}
		}

		return $entries;
	}
}

new GPEB_Filter_By_Nested_Entry( array(
	'parent_form_id'         => 4,
	'nested_form_id'         => 3,
	'parent_hidden_field_id' => 10,
	'nested_target_field_id' => 4,
) );

Leave a Reply

Your email address will not be published. Required fields are marked *

  • Trouble installing this snippet? See our troubleshooting tips.
  • Need to include code? Create a gist and link to it in your comment.
  • Reporting a bug? Provide a URL where this issue can be recreated.

By commenting, I understand that I may receive emails related to Gravity Wiz and can unsubscribe at any time.