示例#1
0
文件: 0.9.9.php 项目: a42/piklist
 public function needs_update($object)
 {
     return is_array($object) && !piklist::is_flat($object) && !isset($object[0]);
 }
示例#2
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;
 }
示例#3
0
 /**
  * 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));
                     }
                 }
             }
         }
     }
 }
示例#5
0
文件: show.php 项目: a42/piklist
    <?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