public static function pre_update_option($new, $old = false)
 {
     if (false !== ($field_data = piklist_validate::check($new))) {
         $setting = $_REQUEST['option_page'];
         $_old = $old;
         foreach ($field_data[$setting] as $field => &$data) {
             if (!isset($data['display']) || isset($data['display']) && !$data['display']) {
                 if (!isset($new[$field]) && isset($_old[$field])) {
                     unset($_old[$field]);
                 }
                 if ((isset($data['add_more']) && !$data['add_more'] || !isset($data['add_more'])) && (isset($new[$field]) && isset($new[$field][0]) && count($new[$field]) == 1)) {
                     $new[$field] = is_array($new[$field][0]) && count($new[$field][0]) == 1 ? $new[$field][0][0] : $new[$field][0];
                 }
                 if (isset($new[$field]) && is_array($new[$field]) && count($new[$field]) > 1 && empty($new[$field][0]) && isset($new[$field][0])) {
                     unset($new[$field][0]);
                     $new[$field] = array_values($new[$field]);
                 }
                 if (isset($data['field'])) {
                     $path = array_merge(array($setting, 'name'), strstr($data['field'], ':') ? explode(':', $data['field']) : array($data['field']));
                     if (piklist::array_path_get($_FILES, $path) && $data['type'] == 'file') {
                         $data['request_value'] = piklist_form::save_upload($path, $data['request_value'], true);
                         $path = explode(':', $data['field']);
                         $parent_field = $path[0];
                         unset($path[0]);
                         piklist::array_path_set($new[$parent_field], $path, $data['request_value']);
                     }
                 }
             }
         }
         $settings = wp_parse_args($new, $_old);
         $settings = apply_filters('piklist_pre_update_option', $settings, $setting, $new, $old);
         $settings = apply_filters('piklist_pre_update_option_' . $setting, $settings, $new, $old);
     } else {
         $settings = $old;
     }
     return $settings;
 }
 public static function check(&$stored_data = null)
 {
     if (!isset($_REQUEST[piklist::$prefix]['fields_id']) || !($fields_data = get_transient(piklist::$prefix . $_REQUEST[piklist::$prefix]['fields_id']))) {
         return false;
     }
     $fields_id = $_REQUEST[piklist::$prefix]['fields_id'];
     foreach ($fields_data as $type => &$fields) {
         foreach ($fields as &$field) {
             if (!is_null($stored_data)) {
                 $request_data =& $stored_data;
             } else {
                 if (isset($_REQUEST['widget-id']) && isset($_REQUEST['multi_number']) && isset($_REQUEST['widget_number'])) {
                     $widget_index = !empty($_REQUEST['multi_number']) ? $_REQUEST['multi_number'] : $_REQUEST['widget_number'];
                     $request_data =& $_REQUEST[piklist::$prefix . $field['scope']][$widget_index];
                 } elseif (isset($field['scope']) && !empty($field['scope'])) {
                     $request_data =& $_REQUEST[piklist::$prefix . $field['scope']];
                 } else {
                     $request_data =& $_REQUEST;
                 }
             }
             if (isset($request_data) && isset($field['field'])) {
                 $field['request_value'] = !strstr($field['field'], ':') ? isset($request_data[$field['field']]) ? $request_data[$field['field']] : null : piklist::array_path_get($request_data, explode(':', $field['field']));
                 $field['valid'] = true;
                 if (stristr($field['field'], ':0:')) {
                     $_field = $field['field'];
                     $value = array();
                     $index = 0;
                     do {
                         $_value = piklist::array_path_get($request_data, explode(':', $_field));
                         if (isset($_value[$index]) && count($_value[$index]) > 1 && in_array($field['type'], piklist_form::$field_list_types['multiple_value']) && $field['add_more']) {
                             $_value[$index] = array_values(array_filter($_value[$index]));
                         }
                         if (isset($_value[$index])) {
                             array_push($value, $_value);
                             piklist::array_path_set($request_data, explode(':', $_field), $_value);
                             $_field = strrev(implode(strrev(':' . ($index + 1) . ':'), explode(':' . $index . ':', strrev($_field), 2)));
                         } else {
                             break;
                         }
                         $index++;
                     } while (isset($_value[$index]));
                     $field['request_value'] = $_value;
                 } elseif ($field['type'] == 'group' && empty($field['field'])) {
                     $field['request_value'] = array();
                     foreach ($field['fields'] as $_field) {
                         $field['request_value'][$_field['field']] = !strstr($_field['field'], ':') ? isset($request_data[$_field['field']]) ? $request_data[$_field['field']] : null : piklist::array_path_get($request_data, explode(':', $_field['field']));
                     }
                 } else {
                     $index = 0;
                     do {
                         if (isset($field['request_value'][$index]) && count($field['request_value'][$index]) > 1 && $field['type'] == 'checkbox') {
                             $field['request_value'][$index] = array_values(array_filter($field['request_value'][$index]));
                         }
                         $index++;
                     } while (isset($field['request_value'][$index]));
                     piklist::array_path_set($request_data, explode(':', $field['field']), $field['request_value']);
                 }
                 if (isset($field['sanitize'])) {
                     foreach ($field['sanitize'] as $sanitize) {
                         if (isset(self::$sanitization_rules[$sanitize['type']])) {
                             $sanitization = array_merge(self::$sanitization_rules[$sanitize['type']], $sanitize);
                             if (isset($sanitization['callback'])) {
                                 foreach ($field['request_value'] as $request_value) {
                                     $request_value = call_user_func_array($sanitization['callback'], array($request_value, $field, isset($sanitize['options']) ? $sanitize['options'] : array()));
                                     $request_value = is_array($request_value) ? $request_value : array($request_value);
                                     piklist::array_path_set($request_data, explode(':', $field['field']), $request_value);
                                 }
                             }
                         }
                     }
                 }
                 self::add_request_value($field);
                 if (isset($field['required']) && $field['required']) {
                     for ($index = 0; $index < count($field['request_value']); $index++) {
                         $request_value = is_array($field['request_value'][$index]) ? array_filter($field['request_value'][$index]) : $field['request_value'][$index];
                         if (empty($request_value)) {
                             self::add_error($field, $index, __('is a required field.', 'piklist'));
                         }
                     }
                 }
                 if (isset($field['validate'])) {
                     foreach ($field['validate'] as $validate) {
                         if (isset(self::$validation_rules[$validate['type']])) {
                             $validation = array_merge(self::$validation_rules[$validate['type']], $validate);
                             $request_values = $field['request_value'];
                             if ($field['type'] == 'group') {
                                 $_request_values = array();
                                 foreach ($request_values as $key => $values) {
                                     foreach ($values as $index => $value) {
                                         if (!isset($_request_values[$index])) {
                                             $_request_values[$index] = array();
                                         }
                                         $_request_values[$index][$key] = $value;
                                     }
                                 }
                                 $request_values = array($_request_values);
                             }
                             if (isset($validation['rule'])) {
                                 for ($index = 0; $index < count($request_values); $index++) {
                                     if (!empty($request_values[$index]) && !preg_match($validation['rule'], $request_values[$index])) {
                                         self::add_error($field, $index, $validation['message']);
                                     }
                                 }
                             }
                             if (isset($validation['callback'])) {
                                 for ($index = 0; $index < count($request_values); $index++) {
                                     if (!empty($request_values[$index]) || $field['type'] != 'group' && $field['add_more']) {
                                         $validation_result = call_user_func_array($validation['callback'], array($request_values[$index], $field, isset($validate['options']) ? $validate['options'] : array()));
                                         if ($validation_result !== true) {
                                             self::add_error($field, $index, isset($validation['message']) ? $validation['message'] : (is_string($validation_result) ? $validation_result : __('is not valid input', 'piklist')));
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     self::set_data($fields_id);
     return !empty(self::$submission['errors']) ? false : $fields_data;
 }
 public static function save_upload($path, $storage = array(), $return = false)
 {
     $files = $_FILES;
     $paths = array();
     $paths['name'] = $path;
     $path[1] = 'size';
     $paths['size'] = $path;
     $path[1] = 'tmp_name';
     $paths['tmp_name'] = $path;
     $path[1] = 'error';
     $paths['error'] = $path;
     $codes = piklist::array_path_get($files, $paths['error']);
     $names = piklist::array_path_get($files, $paths['name']);
     $sizes = piklist::array_path_get($files, $paths['size']);
     $tmp_names = piklist::array_path_get($files, $paths['tmp_name']);
     foreach ($codes as $set => $code_set) {
         $_storage = array();
         foreach ($code_set as $index => $code) {
             if (in_array($code, array(UPLOAD_ERR_OK, 0), true)) {
                 $attach_id = media_handle_sideload(array('name' => $names[$set][$index], 'size' => $sizes[$set][$index], 'tmp_name' => $tmp_names[$set][$index]), 0);
                 if (!is_wp_error($attach_id)) {
                     $_storage[$index] = $attach_id;
                 }
             }
         }
         if (isset($storage[$set])) {
             $storage[$set] = array_merge($storage[$set], $_storage);
             if ($return && isset($storage[$set]) && is_array($storage[$set]) && count($storage[$set]) > 1) {
                 $storage[$set] = array_values(array_filter($storage[$set]));
             }
         } else {
             $storage[$set] = array(0 => null);
         }
     }
     ksort($storage);
     return $storage;
 }
示例#4
0
 /**
  * check
  * Run all validation and sanitization checks against the rendered fields.
  *
  * @param array $stored_data The data to parse if the REQUEST object is not used by default.
  * @param string $fields_id The fields id.
  *
  * @return array Results of the check.
  *
  * @access public
  * @static
  * @since 1.0
  */
 public static function check($stored_data = null, $fields_id = null)
 {
     self::$valid = true;
     self::$checked = false;
     if (!$fields_id) {
         $fields_id = isset($_REQUEST[piklist::$prefix]['fields']) ? esc_attr($_REQUEST[piklist::$prefix]['fields']) : null;
     }
     if (!$fields_id || !($fields_data = get_transient(piklist::$prefix . $fields_id))) {
         return false;
     }
     $clones = array();
     foreach ($fields_data as $type => &$fields) {
         foreach ($fields as &$field) {
             if (!is_null($stored_data)) {
                 if ($field['prefix'] && isset($stored_data[piklist::$prefix . $field['scope']])) {
                     $request_data = $stored_data[piklist::$prefix . $field['scope']];
                 } elseif (!$field['prefix'] && isset($stored_data[$field['scope']])) {
                     $request_data = $stored_data[$field['scope']];
                 } else {
                     $request_data = $stored_data;
                 }
             } else {
                 if ($field['scope'] && isset($_REQUEST[piklist::$prefix . $field['scope']])) {
                     $request_data = $_REQUEST[piklist::$prefix . $field['scope']];
                 } elseif ($field['scope'] && $field['scope'] == piklist::$prefix && isset($_REQUEST[piklist::$prefix])) {
                     $request_data = $_REQUEST[piklist::$prefix];
                 } else {
                     $request_data = $_REQUEST;
                 }
             }
             if ($request_data && $field['field'] && $field['type'] != 'html') {
                 $field['errors'] = false;
                 if (!in_array($field['field'], $clones)) {
                     if (isset($request_data[$field['field']])) {
                         $field['request_value'] = $request_data[$field['field']];
                     } elseif (strstr($field['field'], ':')) {
                         $pluck = explode(':', $field['field']);
                         $pluck_field = array_pop($pluck);
                         if (is_numeric($pluck[count($pluck) - 1])) {
                             array_pop($pluck);
                         }
                         $pluck = implode(':', $pluck);
                         if (isset($request_data[$pluck][$pluck_field])) {
                             $field['request_value'] = $request_data[$pluck][$pluck_field];
                         } else {
                             $request_data = piklist::array_path_get($request_data, explode(':', $pluck));
                             if (isset($request_data[$pluck_field])) {
                                 $field['request_value'] = $request_data[$pluck_field];
                             } else {
                                 $field['request_value'] = $request_data ? piklist::pluck($request_data, $pluck_field) : null;
                             }
                         }
                     }
                 }
                 if ($field['type'] == 'group' && $field['field'] && !strstr($field['field'], ':')) {
                     $paths = piklist::array_paths($field['request_value']);
                     foreach ($paths as $path) {
                         $path = explode(':', $path);
                         if (is_numeric($path[count($path) - 1])) {
                             unset($path[count($path) - 1]);
                         }
                         $path = implode(':', $path);
                         $field_name = $field['field'] . ':' . $path;
                         if (!isset($fields[$path]) && !in_array($field_name, $clones)) {
                             $original = preg_replace('/\\:\\d+\\:/', ':0:', $field_name);
                             $original = explode(':', $original);
                             if (is_numeric($original[count($original) - 1])) {
                                 unset($original[count($original) - 1]);
                             }
                             $original = implode(':', $original);
                             if (isset($fields[$original])) {
                                 $clone = $fields[$original];
                                 $path = array_reverse(explode(':', $path));
                                 for ($i = 0; $i < count($path); $i++) {
                                     if (is_numeric($path[$i])) {
                                         $clone['index'] = (int) $path[$i];
                                         break;
                                     }
                                 }
                                 $path = array_reverse($path);
                                 $clone['field'] = $field_name;
                                 $clone['id'] = piklist_form::get_field_id($clone);
                                 $clone['name'] = piklist_form::get_field_name($clone);
                                 $clone['request_value'] = piklist::array_path_get($field['request_value'], $path);
                                 $original_path = explode(':', $original);
                                 $group = array_shift($original_path);
                                 $fields[$original]['request_value'] = piklist::array_path_get($field['request_value'], $original_path);
                                 $position = array_search($original, array_keys($fields)) + 1;
                                 $fields = array_slice($fields, 0, $position, true) + array($field_name => $clone) + array_slice($fields, $position, count($fields) - 1, true);
                                 array_push($clones, $field_name);
                             }
                         }
                     }
                 }
                 // Strip Slashes
                 $field['request_value'] = stripslashes_deep($field['request_value']);
                 // Required
                 if ($field['required']) {
                     $field = self::required_value($field);
                 }
                 // Sanitization
                 foreach ($field['sanitize'] as $sanitize) {
                     if (isset(self::$sanitization_rules[$sanitize['type']])) {
                         $sanitization = array_merge(self::$sanitization_rules[$sanitize['type']], $sanitize);
                         if (isset($sanitization['callback'])) {
                             $field = self::sanitize_value_callback($field, $sanitization);
                             if (strstr($field['field'], ':')) {
                                 $path = explode(':', $field['field']);
                                 $group = array_shift($path);
                                 piklist::array_path_set($fields[$group]['request_value'], $path, $field['request_value']);
                             }
                         }
                     } else {
                         $trigger_error = sprintf(__('Sanitization type "%s" is not valid.', 'piklist'), $sanitize['type']);
                         trigger_error($trigger_error, E_USER_NOTICE);
                     }
                 }
                 // Validation
                 foreach ($field['validate'] as $validate) {
                     if (isset(self::$validation_rules[$validate['type']])) {
                         $validation = array_merge(self::$validation_rules[$validate['type']], $validate);
                         if (isset($validation['rule'])) {
                             $field = self::validate_value_rule($field, $validation);
                         }
                         if (isset($validation['callback'])) {
                             $field = self::validate_value_callback($field, $validation, $fields_data);
                         }
                     } else {
                         $trigger_error = sprintf(__('Validation type "%s" is not valid.', 'piklist'), $validate['type']);
                         trigger_error($trigger_error, E_USER_NOTICE);
                     }
                 }
             }
         }
     }
     self::$checked = true;
     self::set_data($fields_id, $fields_data);
     return array('valid' => self::$valid, 'type' => $_SERVER['REQUEST_METHOD'], 'fields_data' => $fields_data);
 }
示例#5
0
 /**
  * save_upload
  * Save any FILES uploaded by a file field.
  *
  * @param array $path The file paths
  * @param array $storage The object to store the object ids in to return.
  *
  * @return array The object ids.
  *
  * @access public
  * @static
  * @since 1.0
  */
 public static function save_upload($path, $storage = array(), $url = false)
 {
     $files = $_FILES;
     if (!function_exists('media_handle_sideload')) {
         require_once ABSPATH . 'wp-admin/includes/image.php';
         require_once ABSPATH . 'wp-admin/includes/file.php';
         require_once ABSPATH . 'wp-admin/includes/media.php';
     }
     $paths = array();
     $paths['name'] = $path;
     $path[1] = 'size';
     $paths['size'] = $path;
     $path[1] = 'tmp_name';
     $paths['tmp_name'] = $path;
     $path[1] = 'error';
     $paths['error'] = $path;
     $codes = piklist::array_path_get($files, $paths['error']);
     $names = piklist::array_path_get($files, $paths['name']);
     $sizes = piklist::array_path_get($files, $paths['size']);
     $tmp_names = piklist::array_path_get($files, $paths['tmp_name']);
     if (!$storage) {
         $storage = array();
     }
     foreach ($codes as $set => $code) {
         if (in_array($code, array(UPLOAD_ERR_OK, 0), true)) {
             $attach_id = media_handle_sideload(array('name' => $names[$set], 'size' => $sizes[$set], 'tmp_name' => $tmp_names[$set]), 0);
             if (!is_wp_error($attach_id)) {
                 array_push($storage, $url ? wp_get_attachment_url($attach_id) : $attach_id);
             }
         }
     }
     return $storage;
 }