예제 #1
0
 public function test_empty_field_with_empty_object_id()
 {
     $field = new CMB2_Field(array('field_args' => $this->field_args));
     // data should be empty since we have no object id
     $this->assertEmpty($field->get_data());
     // add some xss for good measure
     $dirty_val = 'test<html><stuff><script>xss</script><a href="http://xssattackexamples.com/">Click to Download</a>';
     $cleaned_val = sanitize_text_field($dirty_val);
     // Make sure it sanitizes as expected
     $this->assertEquals($cleaned_val, $field->sanitization_cb($dirty_val));
     // Sanitize/store the field
     $this->assertTrue($field->save_field($dirty_val));
     // Retrieve saved value(s)
     $this->assertEquals($cleaned_val, cmb2_options(0)->get($field->id()));
     $this->assertEquals(array('test_test' => $cleaned_val), cmb2_options(0)->get_options());
 }
예제 #2
0
 /**
  * Save a repeatable group
  */
 public function save_group($args)
 {
     if (!isset($args['id'], $args['fields'], $this->data_to_save[$args['id']]) || !is_array($args['fields'])) {
         return;
     }
     $field_group = new CMB2_Field(array('field_args' => $args, 'object_type' => $this->object_type(), 'object_id' => $this->object_id()));
     $base_id = $field_group->id();
     $old = $field_group->get_data();
     $group_vals = $this->data_to_save[$base_id];
     $saved = array();
     $field_group->index = 0;
     foreach (array_values($field_group->fields()) as $field_args) {
         $field = new CMB2_Field(array('field_args' => $field_args, 'group_field' => $field_group));
         $sub_id = $field->id(true);
         foreach ((array) $group_vals as $field_group->index => $post_vals) {
             // Get value
             $new_val = isset($group_vals[$field_group->index][$sub_id]) ? $group_vals[$field_group->index][$sub_id] : false;
             // Sanitize
             $new_val = $field->sanitization_cb($new_val);
             if ('file' == $field->type() && is_array($new_val)) {
                 // Add image ID to the array stack
                 $saved[$field_group->index][$new_val['field_id']] = $new_val['attach_id'];
                 // Reset var to url string
                 $new_val = $new_val['url'];
             }
             // Get old value
             $old_val = is_array($old) && isset($old[$field_group->index][$sub_id]) ? $old[$field_group->index][$sub_id] : false;
             $is_updated = !empty($new_val) && $new_val != $old_val;
             $is_removed = empty($new_val) && !empty($old_val);
             // Compare values and add to `$updated` array
             if ($is_updated || $is_removed) {
                 $this->updated[] = $base_id . '::' . $field_group->index . '::' . $sub_id;
             }
             // Add to `$saved` array
             $saved[$field_group->index][$sub_id] = $new_val;
         }
         $saved[$field_group->index] = array_filter($saved[$field_group->index]);
     }
     $saved = array_filter($saved);
     $field_group->update_data($saved, true);
 }
예제 #3
0
 /**
  * Peforms saving of `file` attachement's ID
  * @since  1.1.0
  */
 public function _save_file_id()
 {
     $group = $this->field->group;
     $args = $this->field->args();
     $args['id'] = $args['_id'] . '_id';
     unset($args['_id'], $args['_name']);
     // And get new field object
     $field = new CMB2_Field(array('field_args' => $args, 'group_field' => $group, 'object_id' => $this->field->object_id, 'object_type' => $this->field->object_type));
     $id_key = $field->_id();
     $id_val_old = $field->escaped_value('absint');
     if ($group) {
         // Check group $_POST data
         $i = $group->index;
         $base_id = $group->_id();
         $id_val = isset($_POST[$base_id][$i][$id_key]) ? absint($_POST[$base_id][$i][$id_key]) : 0;
     } else {
         // Check standard $_POST data
         $id_val = isset($_POST[$field->id()]) ? $_POST[$field->id()] : null;
     }
     // If there is no ID saved yet, try to get it from the url
     if ($this->value && !$id_val) {
         $id_val = cmb2_utils()->image_id_from_url($this->value);
     }
     if ($group) {
         return array('attach_id' => $id_val, 'field_id' => $id_key);
     }
     if ($id_val && $id_val != $id_val_old) {
         return $field->update_data($id_val);
     } elseif (empty($id_val) && $id_val_old) {
         return $field->remove_data($id_val_old);
     }
 }
예제 #4
0
 /**
  * Get a field object
  *
  * @since  2.0.3
  *
  * @param  string|array|CMB2_Field $field       Metabox field id or field config array or CMB2_Field object
  * @param  CMB2_Field              $field_group (optional) CMB2_Field object (group parent)
  *
  * @return CMB2_Field|false CMB2_Field object (or false)
  */
 public function get_field($field, $field_group = null)
 {
     if (is_a($field, 'CMB2_Field')) {
         return $field;
     }
     $field_id = is_string($field) ? $field : $field['id'];
     $parent_field_id = !empty($field_group) ? $field_group->id() : '';
     $ids = $this->get_field_ids($field_id, $parent_field_id, true);
     if (!$ids) {
         return false;
     }
     list($field_id, $sub_field_id) = $ids;
     $index = implode('', $ids) . ($field_group ? $field_group->index : '');
     if (array_key_exists($index, $this->fields)) {
         return $this->fields[$index];
     }
     $this->fields[$index] = new CMB2_Field($this->get_field_args($field_id, $field, $sub_field_id, $field_group));
     return $this->fields[$index];
 }