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