PodsField_Pick::validate PHP Method

validate() public method

Validate a value before it's saved
Since: 2.0
public validate ( mixed $value, string $name = null, array $options = null, array $fields = null, array $pod = null, integer $id = null, null $params = null ) : array | boolean
$value mixed
$name string
$options array
$fields array
$pod array
$id integer
$params null
return array | boolean
    public function validate($value, $name = null, $options = null, $fields = null, $pod = null, $id = null, $params = null)
    {
        if (empty(self::$api)) {
            self::$api = pods_api();
        }
        $simple_tableless_objects = $this->simple_objects();
        $related_pick_limit = 0;
        $related_field = $related_pod = $current_related_ids = false;
        // Bidirectional relationship requirement checks
        $related_object = pods_var(self::$type . '_object', $options, '');
        // pod, post_type, taxonomy, etc..
        $related_val = pods_var(self::$type . '_val', $options, $related_object, null, true);
        // pod name, post type name, taxonomy name, etc..
        if (empty($related_val)) {
            $related_val = $related_object;
        }
        $related_sister_id = (int) pods_var('sister_id', $options, 0);
        $options['id'] = (int) $options['id'];
        if (!isset(self::$related_data[$options['id']]) || empty(self::$related_data[$options['id']])) {
            self::$related_data[$options['id']] = array();
        }
        if (!empty($related_sister_id) && !in_array($related_object, $simple_tableless_objects)) {
            $related_pod = self::$api->load_pod(array('name' => $related_val, 'table_info' => false), false);
            if (false !== $related_pod && ('pod' == $related_object || $related_object == $related_pod['type'])) {
                $related_field = false;
                // Ensure sister_id exists on related Pod
                foreach ($related_pod['fields'] as $related_pod_field) {
                    if ('pick' == $related_pod_field['type'] && $related_sister_id == $related_pod_field['id']) {
                        $related_field = $related_pod_field;
                        break;
                    }
                }
                if (!empty($related_field)) {
                    $current_ids = self::$api->lookup_related_items($fields[$name]['id'], $pod['id'], $id, $fields[$name], $pod);
                    self::$related_data[$options['id']]['current_ids'] = $current_ids;
                    $value_ids = $value;
                    // Convert values from a comma-separated string into an array
                    if (!is_array($value_ids)) {
                        $value_ids = explode(',', $value_ids);
                    }
                    $value_ids = array_unique(array_filter($value_ids));
                    // Get ids to remove
                    $remove_ids = array_diff($current_ids, $value_ids);
                    $related_required = (bool) pods_var('required', $related_field['options'], 0);
                    $related_pick_limit = (int) pods_var(self::$type . '_limit', $related_field['options'], 0);
                    if ('single' == pods_var_raw(self::$type . '_format_type', $related_field['options'])) {
                        $related_pick_limit = 1;
                    }
                    // Validate Required
                    if ($related_required && !empty($remove_ids)) {
                        foreach ($remove_ids as $related_id) {
                            $bidirectional_ids = self::$api->lookup_related_items($related_field['id'], $related_pod['id'], $related_id, $related_field, $related_pod);
                            self::$related_data[$options['id']]['related_ids_' . $related_id] = $bidirectional_ids;
                            if (empty($bidirectional_ids) || in_array($id, $bidirectional_ids) && 1 == count($bidirectional_ids)) {
                                return sprintf(__('The %s field is required and cannot be removed by the %s field', 'pods'), $related_field['label'], $options['label']);
                            }
                        }
                    }
                } else {
                    $related_pod = false;
                }
            } else {
                $related_pod = false;
            }
        }
        if (empty(self::$related_data[$options['id']])) {
            unset(self::$related_data[$options['id']]);
        } else {
            self::$related_data[$options['id']]['related_pod'] = $related_pod;
            self::$related_data[$options['id']]['related_field'] = $related_field;
            self::$related_data[$options['id']]['related_pick_limit'] = $related_pick_limit;
            $pick_limit = (int) pods_var(self::$type . '_limit', $options['options'], 0);
            if ('single' == pods_var_raw(self::$type . '_format_type', $options['options'])) {
                $pick_limit = 1;
            }
            $related_field['id'] = (int) $related_field['id'];
            if (!isset(self::$related_data[$related_field['id']]) || empty(self::$related_data[$related_field['id']])) {
                self::$related_data[$related_field['id']] = array('related_pod' => $pod, 'related_field' => $options, 'related_pick_limit' => $pick_limit);
            }
        }
        return true;
    }