public function needs_update($object) { return is_array($object) && !piklist::is_flat($object) && !isset($object[0]); }
/** * validate_value_callback * Run validation callback rules * * @param array $field The field object. * @param array $validation The validation rule. * @param array $fields_data Collection of fields. * * @return array The field object. * * @access private * @static * @since 1.0 */ private static function validate_value_callback($field, $validation, $fields_data) { $options = isset($validation['options']) ? $validation['options'] : array(); if (is_array($field['request_value']) && ($field['add_more'] || !piklist::is_flat($field['request_value'])) && $field['type'] != 'group') { $index = 0; foreach ($field['request_value'] as $request_value) { $validation_result = call_user_func_array($validation['callback'], array($index, $request_value, $options, $field, $fields_data)); if ($validation_result !== true) { $field = self::add_error($field, $index, !empty($validation['message']) ? $validation['message'] : (is_string($validation_result) ? $validation_result : __('is not valid input', 'piklist'))); } $index++; } } elseif ($field['request_value']) { $validation_result = call_user_func_array($validation['callback'], array(0, $field['request_value'], $options, $field, $fields_data)); if ($validation_result !== true) { $field = self::add_error($field, 0, !empty($validation['message']) ? $validation['message'] : (is_string($validation_result) ? $validation_result : __('is not valid input', 'piklist'))); } } return $field; }
/** * save * Save the form data, excludes widgets and settings api fields. * * @return bool Whether or not data was saved. * * @access public * @static * @since 1.0 */ public static function save() { global $wpdb, $wp_post_types, $wp_taxonomies; $check = piklist_validate::check(); // Get our field data after its been sanitized and validated if (!isset($_REQUEST[piklist::$prefix]['fields']) || isset($_REQUEST[piklist::$prefix]['filter']) || !$check['valid'] || $check['type'] != 'POST') { self::$form_submission = $check['fields_data']; return false; } $fields_data = $check['fields_data']; // Handle normal file uploads foreach ($fields_data as $scope => &$fields) { if (in_array($scope, array('post_meta', 'term_meta', 'user_meta', 'comment_meta'))) { $meta_type = substr($scope, 0, strpos($scope, '_')); foreach ($fields as &$field) { if (!$field['display'] && array_key_exists(piklist::$prefix . $scope, $_FILES) && array_key_exists($field['field'], $_FILES[piklist::$prefix . $scope]['name'])) { $paths = piklist::array_paths($_FILES[piklist::$prefix . $scope]['name'][$field['field']]); if (!empty($paths)) { if (strstr($paths[0], ':')) { foreach ($paths as $path) { $files_path = explode(':', $path); unset($files_path[count($files_path) - 1]); $files_path = array_merge(array(piklist::$prefix . $scope, 'name'), explode(':', $field['field'] . ':' . implode(':', $files_path))); $field_name = explode(':', $path); $field_name = $field_name[1]; $options = $field['options']; foreach ($field['fields'] as $_field) { if ($_field['field'] == $field_name) { $options = $_field['options']; break; } } $storage = array(); $storage_type = isset($field['options']['save']) && $field['options']['save'] == 'url'; $upload = self::save_upload($files_path, $storage, $storage_type); if ($upload) { piklist::array_path_set($field['request_value'], explode(':', $path), current($upload)); } } } else { $path = array_merge(array(piklist::$prefix . $scope, 'name'), array($field['field'])); $storage = is_array($field['request_value']) ? array_filter($field['request_value']) : $field['request_value']; $storage_type = isset($field['options']['save']) && $field['options']['save'] == 'url'; $upload = self::save_upload($path, $storage, $storage_type); if ($upload) { $field['request_value'] = $upload; } } } } } } } $object_ids = array(); // Save field data foreach ($fields_data as $scope => &$fields) { if (in_array($scope, array('post', 'user', 'comment'))) { $objects = array(); foreach ($fields as &$field) { $values = is_array($field['request_value']) ? $field['request_value'] : array($field['request_value']); foreach ($values as $index => $value) { if (is_array($field['object_id'])) { $id = isset($field['object_id'][$index]) ? $field['object_id'][$index] : 'insert-' . $index; } else { $id = isset($field['object_id']) ? $field['object_id'] : 'insert-' . $index; } if (isset($field['object_id'][$id]) && !isset($objects[$field['object_id'][$id]])) { $objects[$id] = array(); } if (isset($field['object_id'][$index]) || $field['object_id']) { $objects[$id][$scope == 'comment' ? $field['relate'] ? 'comment_ID' : 'comment_post_ID' : 'ID'] = $id; } if ($field['request_value'] && !$field['display']) { $field_name = strrpos($field['field'], ':') > 0 ? substr($field['field'], strrpos($field['field'], ':') + 1) : $field['field']; $objects[$id][$field_name] = $value; } } } foreach ($fields as &$field) { if ($field['relate']) { $_object_ids = is_array($field['object_id']) ? $field['object_id'] : array($field['object_id']); foreach ($_object_ids as $_object_id) { if (!isset($objects[$_object_id])) { if (!isset($field['relate']['remove'])) { $field['relate']['remove'] = array(); } array_push($field['relate']['remove'], $_object_id); } } } } foreach ($objects as $id => $object) { $result_id = self::save_object($scope, $object); if (strstr($id, 'insert-')) { foreach ($fields as &$field) { if ($field['object_id']) { $field['object_id'] = is_array($field['object_id']) ? $field['object_id'] : array($field['object_id']); array_push($field['object_id'], $result_id); } else { $field['object_id'] = $result_id; } } } if (!isset($object_ids[$scope])) { $object_ids[$scope] = $result_id; } } } elseif (in_array($scope, array('post_meta', 'term_meta', 'user_meta', 'comment_meta'))) { $meta_type = substr($scope, 0, strpos($scope, '_')); $meta = piklist_meta::get_meta_properties($meta_type); foreach ($fields as &$field) { $field['object_id'] = $field['object_id'] ? $field['object_id'] : $object_ids[$meta_type]; if ($field['object_id'] && !$field['display'] && !strstr($field['field'], ':')) { $save_as = is_string($field['save_as']) ? $field['save_as'] : $field['field']; $grouped = in_array($field['type'], self::$field_list_types['multiple_value']); $current_meta_ids = $wpdb->get_col($wpdb->prepare("SELECT {$meta->id} FROM {$meta->table} WHERE {$meta->object_id} = %d AND meta_key = %s", $field['object_id'], $save_as)); if ($grouped) { $current_group_meta_ids = $wpdb->get_col($wpdb->prepare("SELECT {$meta->id} FROM {$meta->table} WHERE {$meta->object_id} = %d AND meta_key = %s", $field['object_id'], '_' . piklist::$prefix . $save_as)); } if (is_array($field['request_value']) && $field['type'] != 'group') { foreach ($field['request_value'] as $values) { if (is_array($values)) { $meta_ids = array(); foreach ($values as $value) { if (!empty($current_meta_ids)) { $meta_id = array_shift($current_meta_ids); update_metadata_by_mid($meta_type, $meta_id, $value); } else { $meta_id = add_metadata($meta_type, $field['object_id'], $save_as, $value); } if ($meta_id) { array_push($meta_ids, $meta_id); } } if ($grouped) { if (!empty($current_group_meta_ids)) { $group_meta_id = array_shift($current_group_meta_ids); update_metadata_by_mid($meta_type, $group_meta_id, $meta_ids); } else { add_metadata($meta_type, $field['object_id'], '_' . piklist::$prefix . $save_as, $meta_ids); } } } else { if (is_array($values) && count($values) == 1) { $values = current($values); } if (!empty($current_meta_ids)) { $meta_id = array_shift($current_meta_ids); update_metadata_by_mid($meta_type, $meta_id, $values); } else { add_metadata($meta_type, $field['object_id'], $save_as, $values); } } } if (!empty($current_group_meta_ids)) { foreach ($current_group_meta_ids as $current_group_meta_id) { delete_metadata_by_mid($meta_type, $current_group_meta_id); } } } else { if (!empty($current_meta_ids)) { if (is_numeric($field['index_force'])) { if (isset($current_meta_ids[$field['index_force']])) { $meta_id = $current_meta_ids[$field['index_force']]; update_metadata_by_mid($meta_type, $meta_id, $field['request_value']); } else { add_metadata($meta_type, $field['object_id'], $save_as, $field['request_value']); } $current_meta_ids = array(); } else { $meta_id = array_shift($current_meta_ids); } if (isset($meta_id)) { update_metadata_by_mid($meta_type, $meta_id, $field['request_value']); } } else { add_metadata($meta_type, $field['object_id'], $save_as, $field['request_value']); } } if (!empty($current_meta_ids)) { foreach ($current_meta_ids as $current_meta_id) { delete_metadata_by_mid($meta_type, $current_meta_id); } } } } } elseif ($scope == 'taxonomy') { $taxonomies = array(); $append = array(); $ids = array(); foreach ($fields as &$field) { if (!$field['display']) { $taxonomy = is_string($field['save_as']) ? $field['save_as'] : $field['field']; $append[$taxonomy] = isset($field['options']['append']) && is_bool($field['options']['append']) ? $field['options']['append'] : false; if (!isset($taxonomies[$taxonomy])) { $taxonomies[$taxonomy] = array(); $field['object_id'] = $field['object_id'] ? $field['object_id'] : $object_ids[$wp_taxonomies[$taxonomy]->object_type[0]]; $ids[$taxonomy] = $field['object_id']; } if ($field['request_value']) { $request_value = is_array($field['request_value']) ? $field['request_value'] : array($field['request_value']); foreach ($request_value as $terms) { if (!empty($terms)) { $terms = !is_array($terms) ? array($terms) : $terms; foreach ($terms as $term) { if (!in_array($term, $taxonomies[$taxonomy])) { array_push($taxonomies[$taxonomy], is_numeric($term) ? (int) $term : $term); } } } } } } } foreach ($taxonomies as $taxonomy => $terms) { if (isset($wp_taxonomies[$taxonomy]->object_type[0])) { switch ($wp_taxonomies[$taxonomy]->object_type[0]) { case 'user': if (current_user_can('edit_user', $field['object_id']) && current_user_can($wp_taxonomies[$taxonomy]->cap->assign_terms)) { $id = $ids[$taxonomy]; } break; default: $id = $ids[$taxonomy]; break; } } if (isset($id)) { wp_set_object_terms($id, $terms, $taxonomy, $append[$taxonomy]); clean_object_term_cache($id, $taxonomy); } } } elseif ($scope == 'option') { foreach ($fields as &$field) { if ($field['field'] && !stristr($field['field'], ':')) { $value = $field['request_value']; if (is_array($value) && piklist::is_flat($value) && count($value) == 1) { $value = current($value); } if (!isset($field['options']['type'])) { $auto_load = isset($field['options']['auto_load']) ? $field['options']['auto_load'] : null; update_option($field['field'], $value, $auto_load); } elseif ($field['options']['type'] == 'blog' && $field['object_id']) { $deprecated = isset($field['options']['deprecated']) ? $field['options']['deprecated'] : null; update_blog_option($field['object_id'], $field['field'], $value, $deprecated); } elseif ($field['options']['type'] == 'user' && $field['object_id']) { $global = isset($field['options']['global']) ? $field['options']['global'] : false; update_user_option($field['object_id'], $field['field'], $value, $global); } elseif ($field['options']['type'] == 'site') { update_site_option($field['field'], $value); } } } } /** * piklist_save_field * Fires after fields have been saved * * @param $type Field type. * * @since 1.0 */ do_action('piklist_save_field', $scope, $fields); /** * piklist_save_field-{$scope} * Fires after fields have been saved and is scope specific * * @param $type Field type. * * @since 1.0 */ do_action("piklist_save_field-{$scope}", $fields); } self::$form_submission = $fields_data; self::relate(); return true; }
public static function save($ids = null) { global $wpdb, $wp_post_types, $wp_taxonomies; if (!isset($_REQUEST[piklist::$prefix]['fields_id']) || isset($_REQUEST[piklist::$prefix]['filter']) || false === ($field_data = piklist_validate::check())) { return false; } foreach ($field_data as $scope => $fields) { switch ($scope) { case 'post_meta': case 'term_meta': case 'user_meta': $meta_type = substr($scope, 0, strpos($scope, '_')); foreach ($fields as $field) { if (isset($field['display']) && !$field['display']) { $path = array_merge(array(piklist::$prefix . $scope, 'name'), strstr($field['field'], ':') ? explode(':', $field['field']) : array($field['field'])); if (piklist::array_path_get($_FILES, $path) && $field['type'] == 'file') { $field['request_value'] = self::save_upload($path, $field['request_value'], true); $path = explode(':', $field['field']); $parent_field = $path[0]; unset($path[0]); piklist::array_path_set($field_data[$scope][$parent_field]['request_value'], $path, $field['request_value']); } } } break; } } foreach ($field_data as $scope => $fields) { switch ($scope) { case 'post': case 'comment': case 'user': $belongs_to = false; if (isset($fields[piklist::$prefix])) { foreach ($fields[piklist::$prefix] as $field) { if ($field['field'] == $scope . '_id') { $belongs_to = $field['request_value']; } } } $object = array(); foreach ($fields as $field) { if (isset($field['request_value']) && !$field['display']) { $object[$field['field']] = is_array($field['request_value']) ? current($field['request_value']) : $field['request_value']; } } if (!empty($object)) { if (isset($ids[$scope])) { $object_id = ($scope == 'comment' ? $scope . '_' : null) . 'ID'; $object[$object_id] = $ids[$scope]; } $ids[$scope] = self::save_object($scope, $object, $belongs_to); } break; case 'post_meta': case 'term_meta': case 'user_meta': $meta_type = substr($scope, 0, strpos($scope, '_')); foreach ($fields as $field) { if (isset($ids[$meta_type])) { $grouped = isset($field['type']) && in_array($field['type'], self::$field_list_types['multiple_value']) && ($field['add_more'] || $field['group_field']); if (isset($field['display']) && !$field['display']) { delete_metadata($meta_type, $ids[$meta_type], $field['field']); if ($grouped) { delete_metadata($meta_type, $ids[$meta_type], '_' . piklist::$prefix . $field['field']); } if (isset($field['request_value']) && !strstr($field['field'], ':')) { if (!piklist::is_flat($field['request_value']) && !isset($field['request_value'][0])) { add_metadata($meta_type, $ids[$meta_type], $field['field'], $field['request_value']); } else { foreach ($field['request_value'] as $values) { if (is_array($values) && $field['type'] != 'group') { $meta_ids = array(); foreach ($values as $value) { if ($meta_id = add_metadata($meta_type, $ids[$meta_type], $field['field'], $value)) { array_push($meta_ids, $meta_id); } } if ($grouped) { add_metadata($meta_type, $ids[$meta_type], '_' . piklist::$prefix . $field['field'], $meta_ids); } } else { if (is_array($values) && count($values) == 1) { $values = current($values); } add_metadata($meta_type, $ids[$meta_type], $field['field'], $values); } } } } } } } break; case 'taxonomy': if (isset($ids['post']) || isset($ids['user'])) { $taxonomies = array(); foreach ($fields as $field) { if (isset($field['display']) && !$field['display']) { $taxonomy = $field['field']; if (!isset($taxonomies[$taxonomy])) { $taxonomies[$taxonomy] = array(); } if (isset($field['request_value'])) { foreach ($field['request_value'] as $terms) { if (!empty($terms)) { $terms = !is_array($terms) ? array($terms) : $terms; foreach ($terms as $term) { if (!in_array($term, $taxonomies[$taxonomy])) { array_push($taxonomies[$taxonomy], is_numeric($term) ? (int) $term : $term); } } } } } } } foreach ($taxonomies as $taxonomy => $terms) { if (isset($wp_taxonomies[$taxonomy]->object_type[0])) { switch ($wp_taxonomies[$taxonomy]->object_type[0]) { case 'user': if (current_user_can('edit_user', $ids['user']) && current_user_can($wp_taxonomies[$taxonomy]->cap->assign_terms)) { $id = $ids['user']; } break; default: $id = $ids['post']; break; } } if (isset($id)) { wp_set_object_terms($id, $terms, $taxonomy, false); clean_object_term_cache($id, $taxonomy); } } } break; } do_action('piklist_save_field', $scope, $fields); } self::$save_ids = $ids; if (isset($field_data['relate'])) { foreach ($field_data['relate'] as $key => $value) { if (substr_compare($key, '_post_id', -strlen('_post_id'), strlen('_post_id')) === 0) { foreach ($field_data['relate'][$key]['request_value'] as $post_id) { self::relate($ids['post'], $post_id); } } if (substr_compare($key, '_relate_remove', -strlen('_relate_remove'), strlen('_relate_remove')) === 0) { $remove = array_filter(explode(',', $field_data['relate'][$key]['request_value'][0])); foreach ($remove as $has) { if ($found = $wpdb->get_var($wpdb->prepare("SELECT relate_id FROM {$wpdb->prefix}post_relationships WHERE post_id = %d AND has_post_id = %d", $ids['post'], $has))) { $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}post_relationships WHERE relate_id = %d", $found)); } } } } } }
<?php if (is_array($value)) { ?> <?php if (count($value) > 1) { ?> <?php if (piklist::is_flat($value)) { echo implode('<br />', $value); } else { $depth = count(current($value)); for ($i = 0; $i < $depth; $i++) { foreach ($value as $_key => $_value) { if (piklist::is_flat($_value)) { echo $_value[$i] . '<br />'; } else { foreach ($_value[$i] as $__value) { echo $__value . '<br />'; } } } if ($depth != $i + 1) { echo '<hr />'; } } } ?> <?php