/** * Render a repeatable group row * @since 1.0.2 * @param CMB2_Field $field_group CMB2_Field group field object * @param string $remove_disabled Attribute string to disable the remove button */ public function render_group_row($field_group, $remove_disabled) { $field_group->peform_param_callback('before_group_row'); $closed_class = $field_group->options('closed') ? ' closed' : ''; echo ' <div class="postbox cmb-row cmb-repeatable-grouping', $closed_class, '" data-iterator="', $field_group->index, '">'; if ($field_group->args('repeatable')) { echo '<button ', $remove_disabled, 'data-selector="', $field_group->id(), '_repeat" class="dashicons-before dashicons-no-alt cmb-remove-group-row"></button>'; } echo ' <div class="cmbhandle" title="', __('Click to toggle', 'cmb2'), '"><br></div> <h3 class="cmb-group-title cmbhandle-title"><span>', $field_group->replace_hash($field_group->options('group_title')), '</span></h3> <div class="inside cmb-td cmb-nested cmb-field-list">'; // Loop and render repeatable group fields foreach (array_values($field_group->args('fields')) as $field_args) { if ('hidden' == $field_args['type']) { // Save rendering for after the metabox $this->add_hidden_field(array('field_args' => $field_args, 'group_field' => $field_group)); } else { $field_args['show_names'] = $field_group->args('show_names'); $field_args['context'] = $field_group->args('context'); $field = $this->get_field($field_args, $field_group)->render_field(); } } if ($field_group->args('repeatable')) { echo ' <div class="cmb-row cmb-remove-field-row"> <div class="cmb-remove-row"> <button ', $remove_disabled, 'data-selector="', $field_group->id(), '_repeat" class="button cmb-remove-group-row alignright">', $field_group->options('remove_button'), '</button> </div> </div> '; } echo ' </div> </div> '; $field_group->peform_param_callback('after_group_row'); }
/** * Render a repeatable group */ public function render_group($args) { // If field is requesting to be conditionally shown if (isset($args['show_on_cb']) && is_callable($args['show_on_cb']) && !call_user_func($args['show_on_cb'], $this)) { return; } if (!isset($args['id'], $args['fields']) || !is_array($args['fields'])) { return; } $args['count'] = 0; $field_group = new CMB2_Field(array('field_args' => $args, 'object_type' => $this->object_type(), 'object_id' => $this->object_id())); $desc = $field_group->args('description'); $label = $field_group->args('name'); $sortable = $field_group->options('sortable') ? ' sortable' : ''; $group_val = (array) $field_group->value(); $nrows = count($group_val); $remove_disabled = $nrows <= 1 ? 'disabled="disabled" ' : ''; echo '<div class="cmb-row cmb-repeat-group-wrap"><div class="cmb-td"><div id="', $field_group->id(), '_repeat" class="cmb-nested cmb-field-list cmb-repeatable-group', $sortable, '" style="width:100%;">'; if ($desc || $label) { $class = $desc ? ' cmb-group-description' : ''; echo '<div class="cmb-row', $class, '"><div class="cmb-th">'; if ($label) { echo '<h2 class="cmb-group-name">', $label, '</h2>'; } if ($desc) { echo '<p class="cmb2-metabox-description">', $desc, '</p>'; } echo '</div></div>'; } if (!empty($group_val)) { foreach ($group_val as $iterator => $field_id) { $this->render_group_row($field_group, $remove_disabled); } } else { $this->render_group_row($field_group, $remove_disabled); } echo '<div class="cmb-row"><div class="cmb-td"><p class="cmb-add-row"><button data-selector="', $field_group->id(), '_repeat" data-grouptitle="', $field_group->options('group_title'), '" class="cmb-add-group-row button">', $field_group->options('add_button'), '</button></p></div></div>'; echo '</div></div></div>'; }
/** * Render a repeatable group */ public function render_group($args) { if (!isset($args['id'], $args['fields']) || !is_array($args['fields'])) { return; } $args['count'] = 0; $field_group = new CMB2_Field(array('field_args' => $args, 'object_type' => $this->object_type(), 'object_id' => $this->object_id())); $desc = $field_group->args('description'); $label = $field_group->args('name'); $sortable = $field_group->options('sortable') ? ' sortable' : ''; $group_val = (array) $field_group->value(); $nrows = count($group_val); $remove_disabled = $nrows <= 1 ? 'disabled="disabled" ' : ''; echo '<li class="cmb-row cmb-repeat-group-wrap"><div class="cmb-td"><ul id="', $field_group->id(), '_repeat" class="cmb-nested repeatable-group' . $sortable . '" style="width:100%;">'; if ($desc || $label) { $class = $desc ? ' cmb-group-description' : ''; echo '<li class="cmb-row' . $class . '"><div class="cmb-th">'; if ($label) { echo '<h2 class="cmb-group-name">' . $label . '</h2>'; } if ($desc) { echo '<p class="cmb2_metabox_description">' . $desc . '</p>'; } echo '</div></li>'; } if (!empty($group_val)) { foreach ($group_val as $iterator => $field_id) { $this->render_group_row($field_group, $remove_disabled); } } else { $this->render_group_row($field_group, $remove_disabled); } echo '<li class="cmb-row"><div class="cmb-td"><p class="add-row"><button data-selector="', $field_group->id(), '_repeat" data-grouptitle="', $field_group->options('group_title'), '" class="add-group-row button">' . $field_group->options('add_button') . '</button></p></div></li>'; echo '</ul></div></li>'; }
/** * Handle indexing the various date/time fields. * * This method also serves as an example of the 'facetwp_cmb2_default_index' filter, although it should be noted * that since it is part of the class, it does not use the $obj class object, but makes method calls directly. * For use outside of this class, be sure to use $obj->index_row() or $obj->index_multiple(). * * @since 1.0.0 * * @param bool $filter Continue with normal indexing. * @param CMB2_Field $field The field object. * @param array $defaults Array of default data. * * @return bool Whether to continue with the normal indexing. */ public function time_date_indexing($filter, $field, $defaults) { $date_format = 'Y-m-d'; $extended_format = "{$date_format} H:i:s"; $index = array('facet_display_value' => $field->args('name')); // Check for special field types if ('text_data' == $field->type()) { $index['facet_value'] = date($date_format, strtotime($field->value())); $this->index_row($index, $defaults); return false; } elseif ('text_date_timestamp' == $field->type()) { $index['facet_value'] = date($date_format, $field->value()); $this->index_row($index, $defaults); return false; } elseif ('text_datetime_timestamp' == $field->type()) { $index['facet_value'] = date($extended_format, $field->value()); $this->index_row($index, $defaults); return false; } elseif ('text_datetime_timestamp_timezone' == $field->type()) { $value = maybe_unserialize($field->value()); if ($value instanceof DateTime) { $index['facet_value'] = $value->format($extended_format); $this->index_row($index, $defaults); return false; } } return $filter; }
public function test_show_option_none() { $args = array('name' => 'Test Radio inline', 'desc' => 'field description (optional)', 'id' => 'radio_inline', 'type' => 'radio_inline', 'options' => array('standard' => 'Option One', 'custom' => 'Option Two', 'none' => 'Option Three')); $field = new CMB2_Field(array('field_args' => $args)); $this->assertFalse($field->args('show_option_none')); $this->assertHTMLstringsAreEqual('<div class="cmb-row cmb-type-radio-inline cmb2-id-radio-inline cmb-inline"><div class="cmb-th"><label for="radio_inline">Test Radio inline</label></div><div class="cmb-td"><ul class="cmb2-radio-list cmb2-list"><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline1" value="standard"/><label for="radio_inline1">Option One</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline2" value="custom"/><label for="radio_inline2">Option Two</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline3" value="none"/><label for="radio_inline3">Option Three</label></li></ul><p class="cmb2-metabox-description">field description (optional)</p></div></div>', $this->render_field($field)); $args['show_option_none'] = true; $field = new CMB2_Field(array('field_args' => $args)); $this->assertEquals(__('None', 'cmb2'), $field->args('show_option_none')); $this->assertHTMLstringsAreEqual('<div class="cmb-row cmb-type-radio-inline cmb2-id-radio-inline cmb-inline"><div class="cmb-th"><label for="radio_inline">Test Radio inline</label></div><div class="cmb-td"><ul class="cmb2-radio-list cmb2-list"><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline1" value="" checked="checked"/><label for="radio_inline1">None</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline2" value="standard"/><label for="radio_inline2">Option One</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline3" value="custom"/><label for="radio_inline3">Option Two</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline4" value="none"/><label for="radio_inline4">Option Three</label></li></ul><p class="cmb2-metabox-description">field description (optional)</p></div></div>', $this->render_field($field)); $args['show_option_none'] = 'No Value'; $field = new CMB2_Field(array('field_args' => $args)); $this->assertEquals('No Value', $field->args('show_option_none')); $this->assertHTMLstringsAreEqual('<div class="cmb-row cmb-type-radio-inline cmb2-id-radio-inline cmb-inline"><div class="cmb-th"><label for="radio_inline">Test Radio inline</label></div><div class="cmb-td"><ul class="cmb2-radio-list cmb2-list"><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline1" value="" checked="checked"/><label for="radio_inline1">No Value</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline2" value="standard"/><label for="radio_inline2">Option One</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline3" value="custom"/><label for="radio_inline3">Option Two</label></li><li><input type="radio" class="cmb2-option" name="radio_inline" id="radio_inline4" value="none"/><label for="radio_inline4">Option Three</label></li></ul><p class="cmb2-metabox-description">field description (optional)</p></div></div>', $this->render_field($field)); }
/** * Manually render a field column display. * * @param array $field_args Array of field arguments. * @param CMB2_Field $field The field object */ function yourprefix_display_text_small_column($field_args, $field) { ?> <div class="custom-column-display <?php echo $field->row_classes(); ?> "> <p><?php echo $field->escaped_value(); ?> </p> <p class="description"><?php echo $field->args('description'); ?> </p> </div> <?php }
/** * 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(); // Check if group field has sanitization_cb $group_vals = $field_group->sanitization_cb($this->data_to_save[$base_id]); $saved = array(); $field_group->index = 0; $field_group->data_to_save = $this->data_to_save; 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 (is_array($new_val) && $field->args('has_supporting_data')) { if ($field->args('repeatable')) { $_new_val = array(); foreach ($new_val as $group_index => $grouped_data) { // Add the supporting data to the $saved array stack $saved[$field_group->index][$grouped_data['supporting_field_id']][] = $grouped_data['supporting_field_value']; // Reset var to the actual value $_new_val[$group_index] = $grouped_data['value']; } $new_val = $_new_val; } else { // Add the supporting data to the $saved array stack $saved[$field_group->index][$new_val['supporting_field_id']] = $new_val['supporting_field_value']; // Reset var to the actual value $new_val = $new_val['value']; } } // 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); }
public function field_should_apply_term(CMB2_Field $field) { if ('term_select' !== $field->args('type')) { return false; } if (!isset($field->args['apply_term'])) { return true; } return (bool) $field->args['apply_term']; }
/** * Manually render amount field. * * @since 1.7 * * @param array $field_args Array of field arguments. * @param CMB2_Field $field The field object * * @return void */ function give_cmb_amount_field_render_row_cb($field_args, $field) { // Get args. $id = $field->args('id'); $label = $field->args('name'); $name = $field->args('_name'); $description = $field->args('description'); $attributes = $field->args('attributes'); $attributes_string = ''; $row_class = $field->row_classes(); // Get attributes. if (!empty($attributes)) { foreach ($attributes as $attribute_name => $attribute_val) { $attributes_string[] = "{$attribute_name}=\"{$attribute_val}\""; } $attributes_string = implode(' ', $attributes_string); } // Get row class. if (!empty($row_class) && is_array($row_class)) { $row_class = implode(' ', $row_class); } ?> <div class="cmb-row <?php echo $row_class; ?> "> <div class="cmb-th"> <label for="<?php echo $id; ?> "><?php echo $label; ?> </label> </div> <div class="cmb-td"> <?php echo give_get_option('currency_position') == 'before' ? '<span class="give-money-symbol give-money-symbol-before">' . give_currency_symbol() . '</span>' : ''; ?> <input id="<?php echo $id; ?> " type="text" name="<?php echo $name; ?> " <?php echo $attributes_string; ?> /> <?php echo give_get_option('currency_position') == 'after' ? '<span class="give-money-symbol give-money-symbol-after">' . give_currency_symbol() . '</span>' : ''; ?> <span class="cmb2-metabox-description"><?php echo $description; ?> </span> </div> </div> <?php }