| Current Path : /home/bechata/mp/wp-content/uploads/2022/ejn73c/ |
| Current File : /home/bechata/mp/wp-content/uploads/2022/ejn73c/types.tar |
CMB2_Type_Taxonomy_Select_Hierarchical.php 0000666 00000002754 15175314405 0014615 0 ustar 00 <?php
/**
* CMB taxonomy_select_hierarchical field type
*
* @since 2.6.1
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Taxonomy_Select_Hierarchical extends CMB2_Type_Taxonomy_Select {
/**
* Parent term ID when looping hierarchical terms.
*
* @since 2.6.1
*
* @var integer
*/
protected $parent = 0;
/**
* Child loop depth.
*
* @since 2.6.1
*
* @var integer
*/
protected $level = 0;
public function render() {
return $this->rendered(
$this->types->select( array(
'options' => $this->get_term_options(),
), 'taxonomy_select_hierarchical' )
);
}
public function select_option( $args = array() ) {
if ( $this->level > 0 ) {
$args['label'] = str_repeat( ' ', $this->level ) . $args['label'];
}
$option = parent::select_option( $args );
$children = $this->build_children( $this->current_term, $this->saved_term );
if ( ! empty( $children ) ) {
$option .= $children;
}
return $option;
}
/**
* Build children hierarchy.
*
* @since 2.6.1
*
* @param array $terms Array of child terms.
* @param array|string $saved Array of terms set to the object, or single term slug.
*
* @return string Child option output.
*/
public function child_option_output( $terms, $saved ) {
$this->level++;
$output = $this->loop_terms( $terms, $saved );
$this->level--;
return $output;
}
}
CMB2_Type_Taxonomy_Multicheck_Hierarchical.php 0000666 00000001620 15175314405 0015455 0 ustar 00 <?php
/**
* CMB taxonomy_multicheck_hierarchical field type
*
* @since 2.2.5
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Taxonomy_Multicheck_Hierarchical extends CMB2_Type_Taxonomy_Multicheck {
/**
* Parent term ID when looping hierarchical terms.
*
* @var integer
*/
protected $parent = 0;
public function render() {
return $this->rendered(
$this->types->radio( array(
'class' => $this->get_wrapper_classes(),
'options' => $this->get_term_options(),
), 'taxonomy_multicheck_hierarchical' )
);
}
protected function list_term_input( $term, $saved_terms ) {
$options = parent::list_term_input( $term, $saved_terms );
$children = $this->build_children( $term, $saved_terms );
if ( ! empty( $children ) ) {
$options .= $children;
}
return $options;
}
}
CMB2_Type_Select_Timezone.php 0000666 00000001227 15175314405 0012125 0 ustar 00 <?php
/**
* CMB select_timezone field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Select_Timezone extends CMB2_Type_Select {
public function render() {
$this->field->args['default'] = $this->field->get_default()
? $this->field->get_default()
: CMB2_Utils::timezone_string();
$this->args = wp_parse_args( $this->args, array(
'class' => 'cmb2_select cmb2-select-timezone',
'options' => wp_timezone_choice( $this->field->escaped_value() ),
'desc' => $this->_desc(),
) );
return parent::render();
}
}
CMB2_Type_Multi_Base.php 0000666 00000005675 15175314405 0011073 0 ustar 00 <?php
/**
* CMB Multi base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
abstract class CMB2_Type_Multi_Base extends CMB2_Type_Base {
/**
* Generates html for an option element
*
* @since 1.1.0
* @param array $args Arguments array containing value, label, and checked boolean
* @return string Generated option element html
*/
public function select_option( $args = array() ) {
return sprintf( "\t" . '<option value="%s" %s>%s</option>', $args['value'], selected( isset( $args['checked'] ) && $args['checked'], true, false ), $args['label'] ) . "\n";
}
/**
* Generates html for list item with input
*
* @since 1.1.0
* @param array $args Override arguments
* @param int $i Iterator value
* @return string Gnerated list item html
*/
public function list_input( $args = array(), $i ) {
$a = $this->parse_args( 'list_input', array(
'type' => 'radio',
'class' => 'cmb2-option',
'name' => $this->_name(),
'id' => $this->_id( $i ),
'value' => $this->field->escaped_value(),
'label' => '',
), $args );
return sprintf( "\t" . '<li><input%s/> <label for="%s">%s</label></li>' . "\n", $this->concat_attrs( $a, array( 'label' ) ), $a['id'], $a['label'] );
}
/**
* Generates html for list item with checkbox input
*
* @since 1.1.0
* @param array $args Override arguments
* @param int $i Iterator value
* @return string Gnerated list item html
*/
public function list_input_checkbox( $args, $i ) {
$saved_value = $this->field->escaped_value();
if ( is_array( $saved_value ) && in_array( $args['value'], $saved_value ) ) {
$args['checked'] = 'checked';
}
$args['type'] = 'checkbox';
return $this->list_input( $args, $i );
}
/**
* Generates html for concatenated items
*
* @since 1.1.0
* @param array $args Optional arguments
* @return string Concatenated html items
*/
public function concat_items( $args = array() ) {
$field = $this->field;
$method = isset( $args['method'] ) ? $args['method'] : 'select_option';
unset( $args['method'] );
$value = null !== $field->escaped_value()
? $field->escaped_value()
: $field->get_default();
$value = CMB2_Utils::normalize_if_numeric( $value );
$concatenated_items = '';
$i = 1;
$options = array();
if ( $option_none = $field->args( 'show_option_none' ) ) {
$options[''] = $option_none;
}
$options = $options + (array) $field->options();
foreach ( $options as $opt_value => $opt_label ) {
// Clone args & modify for just this item
$a = $args;
$a['value'] = $opt_value;
$a['label'] = $opt_label;
// Check if this option is the value of the input
if ( $value === CMB2_Utils::normalize_if_numeric( $opt_value ) ) {
$a['checked'] = 'checked';
}
$concatenated_items .= $this->$method( $a, $i++ );
}
return $concatenated_items;
}
}
CMB2_Type_Title.php 0000666 00000001745 15175314405 0010122 0 ustar 00 <?php
/**
* CMB title field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Title extends CMB2_Type_Base {
/**
* Handles outputting an 'title' element
*
* @return string Heading element
*/
public function render() {
$name = $this->field->args( 'name' );
$tag = 'span';
if ( ! empty( $name ) ) {
$tag = $this->field->object_type == 'post' ? 'h5' : 'h3';
}
$a = $this->parse_args( 'title', array(
'tag' => $tag,
'class' => empty( $name ) ? 'cmb2-metabox-title-anchor' : 'cmb2-metabox-title',
'name' => $name,
'desc' => $this->_desc( true ),
'id' => str_replace( '_', '-', sanitize_html_class( $this->field->id() ) ),
) );
return $this->rendered(
sprintf(
'<%1$s %2$s>%3$s</%1$s>%4$s',
$a['tag'],
$this->concat_attrs( $a, array( 'tag', 'name', 'desc' ) ),
$a['name'],
$a['desc']
)
);
}
}
CMB2_Type_Colorpicker.php 0000666 00000004461 15175314405 0011313 0 ustar 00 <?php
/**
* CMB colorpicker field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Colorpicker extends CMB2_Type_Text {
/**
* The optional value for the colorpicker field
*
* @var string
*/
public $value = '';
/**
* Constructor
*
* @since 2.2.2
*
* @param CMB2_Types $types Object for the field type.
* @param array $args Array of arguments for the type.
* @param string $value Value that the field type is currently set to, or default value.
*/
public function __construct( CMB2_Types $types, $args = array(), $value = '' ) {
parent::__construct( $types, $args );
$this->value = $value ? $value : $this->value;
}
/**
* Render the field for the field type.
*
* @since 2.2.2
*
* @param array $args Array of arguments for the rendering.
*
* @return CMB2_Type_Base|string
*/
public function render( $args = array() ) {
$meta_value = $this->value ? $this->value : $this->field->escaped_value();
$hex_color = '(([a-fA-F0-9]){3}){1,2}$';
if ( preg_match( '/^' . $hex_color . '/i', $meta_value ) ) {
// Value is just 123abc, so prepend #.
$meta_value = '#' . $meta_value;
} elseif (
// If value doesn't match #123abc...
! preg_match( '/^#' . $hex_color . '/i', $meta_value )
// And value doesn't match rgba()...
&& 0 !== strpos( trim( $meta_value ), 'rgba' )
) {
// Then sanitize to just #.
$meta_value = '#';
}
wp_enqueue_style( 'wp-color-picker' );
$args = wp_parse_args( $args, array(
'class' => 'cmb2-text-small',
) );
$args['class'] .= ' cmb2-colorpicker';
$args['value'] = $meta_value;
$args['js_dependencies'] = array( 'wp-color-picker' );
if ( $this->field->options( 'alpha' ) ) {
$args['js_dependencies'][] = 'wp-color-picker-alpha';
$args['data-alpha'] = 'true';
}
$args = wp_parse_args( $this->args, $args );
return parent::render( $args );
}
/**
* Provide the option to use a rgba colorpicker.
*
* @since 2.2.6.2
*/
public static function dequeue_rgba_colorpicker_script() {
if ( wp_script_is( 'jw-cmb2-rgba-picker-js', 'enqueued' ) ) {
wp_dequeue_script( 'jw-cmb2-rgba-picker-js' );
CMB2_JS::register_colorpicker_alpha( true );
}
}
}
CMB2_Type_Taxonomy_Multicheck.php 0000666 00000003421 15175314405 0013020 0 ustar 00 <?php
/**
* CMB taxonomy_multicheck field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Taxonomy_Multicheck extends CMB2_Type_Taxonomy_Base {
protected $counter = 0;
public function render() {
return $this->rendered(
$this->types->radio( array(
'class' => $this->get_wrapper_classes(),
'options' => $this->get_term_options(),
), 'taxonomy_multicheck' )
);
}
protected function get_term_options() {
$all_terms = $this->get_terms();
if ( ! $all_terms || is_wp_error( $all_terms ) ) {
return $this->no_terms_result( $all_terms );
}
return $this->loop_terms( $all_terms, $this->get_object_term_or_default() );
}
protected function loop_terms( $all_terms, $saved_terms ) {
$options = '';
foreach ( $all_terms as $term ) {
$options .= $this->list_term_input( $term, $saved_terms );
}
return $options;
}
protected function list_term_input( $term, $saved_terms ) {
$args = array(
'value' => $term->slug,
'label' => $term->name,
'type' => 'checkbox',
'name' => $this->_name() . '[]',
);
if ( is_array( $saved_terms ) && in_array( $term->slug, $saved_terms ) ) {
$args['checked'] = 'checked';
}
return $this->list_input( $args, ++$this->counter );
}
public function get_object_term_or_default() {
$saved_terms = $this->get_object_terms();
return is_wp_error( $saved_terms ) || empty( $saved_terms )
? $this->field->get_default()
: wp_list_pluck( $saved_terms, 'slug' );
}
protected function get_wrapper_classes() {
$classes = 'cmb2-checkbox-list cmb2-list';
if ( false === $this->field->args( 'select_all_button' ) ) {
$classes .= ' no-select-all';
}
return $classes;
}
}
CMB2_Type_Base 2.php 0000666 00000010756 15175314405 0010037 0 ustar 00 <?php
/**
* CMB base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
abstract class CMB2_Type_Base {
/**
* The CMB2_Types object
*
* @var CMB2_Types
*/
public $types;
/**
* Arguments for use in the render method
*
* @var array
*/
public $args;
/**
* Rendered output (if 'rendered' argument is set to false)
*
* @var string
*/
protected $rendered = '';
/**
* Constructor
*
* @since 2.2.2
* @param CMB2_Types $types
* @param array $args
*/
public function __construct( CMB2_Types $types, $args = array() ) {
$this->types = $types;
$args['rendered'] = isset( $args['rendered'] ) ? (bool) $args['rendered'] : true;
$this->args = $args;
}
/**
* Handles rendering this field type.
*
* @since 2.2.2
* @return string Rendered field type.
*/
abstract public function render();
/**
* Stores the rendered field output.
*
* @since 2.2.2
* @param string|CMB2_Type_Base $rendered Rendered output.
* @return string|CMB2_Type_Base Rendered output or this object.
*/
public function rendered( $rendered ) {
$this->field->register_js_data();
if ( $this->args['rendered'] ) {
return is_a( $rendered, __CLASS__ ) ? $rendered->rendered : $rendered;
}
$this->rendered = is_a( $rendered, __CLASS__ ) ? $rendered->rendered : $rendered;
return $this;
}
/**
* Returns the stored rendered field output.
*
* @since 2.2.2
* @return string Stored rendered output (if 'rendered' argument is set to false).
*/
public function get_rendered() {
return $this->rendered;
}
/**
* Handles parsing and filtering attributes while preserving any passed in via field config.
*
* @since 1.1.0
* @param string $element Element for filter
* @param array $type_defaults Type default arguments
* @param array $type_overrides Type override arguments
* @return array Parsed and filtered arguments
*/
public function parse_args( $element, $type_defaults, $type_overrides = array() ) {
$args = $this->parse_args_from_overrides( $type_overrides );
/**
* Filter attributes for a field type.
* The dynamic portion of the hook name, $element, refers to the field type.
*
* @since 1.1.0
* @param array $args The array of attribute arguments.
* @param array $type_defaults The array of default values.
* @param array $field The `CMB2_Field` object.
* @param object $field_type_object This `CMB2_Types` object.
*/
$args = apply_filters( "cmb2_{$element}_attributes", $args, $type_defaults, $this->field, $this->types );
$args = wp_parse_args( $args, $type_defaults );
if ( ! empty( $args['js_dependencies'] ) ) {
$this->field->add_js_dependencies( $args['js_dependencies'] );
}
return $args;
}
/**
* Handles parsing and filtering attributes while preserving any passed in via field config.
*
* @since 2.2.4
* @param array $type_overrides Type override arguments
* @return array Parsed arguments
*/
protected function parse_args_from_overrides( $type_overrides = array() ) {
$type_overrides = empty( $type_overrides ) ? $this->args : $type_overrides;
if ( true !== $this->field->args( 'disable_hash_data_attribute' ) ) {
$type_overrides['data-hash'] = $this->field->hash_id();
}
$field_overrides = $this->field->args( 'attributes' );
return ! empty( $field_overrides )
? wp_parse_args( $field_overrides, $type_overrides )
: $type_overrides;
}
/**
* Fall back to CMB2_Types methods
*
* @param string $method
* @param array $arguments
* @throws Exception Throws an exception if the field is invalid.
* @return mixed
*/
public function __call( $method, $arguments ) {
switch ( $method ) {
case '_id':
case '_name':
case '_desc':
case '_text':
case 'concat_attrs':
return call_user_func_array( array( $this->types, $method ), $arguments );
default:
throw new Exception( sprintf( esc_html__( 'Invalid %1$s method: %2$s', 'cmb2' ), __CLASS__, $method ) );
}
}
/**
* Magic getter for our object.
*
* @param string $field
* @throws Exception Throws an exception if the field is invalid.
* @return mixed
*/
public function __get( $field ) {
switch ( $field ) {
case 'field':
return $this->types->field;
default:
throw new Exception( sprintf( esc_html__( 'Invalid %1$s property: %2$s', 'cmb2' ), __CLASS__, $field ) );
}
}
}
CMB2_Type_File_List.php 0000666 00000004417 15175314405 0010712 0 ustar 00 <?php
/**
* CMB file_list field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_File_List extends CMB2_Type_File_Base {
public function render( $args = array() ) {
$field = $this->field;
$meta_value = $field->escaped_value();
$name = $this->_name();
$img_size = $field->args( 'preview_size' );
$query_args = $field->args( 'query_args' );
$output = '';
// get an array of image size meta data, fallback to 'thumbnail'
$img_size_data = parent::get_image_size_data( $img_size, 'thumbnail' );
$output .= parent::render( array(
'type' => 'hidden',
'class' => 'cmb2-upload-file cmb2-upload-list',
'size' => 45,
'desc' => '',
'value' => '',
'data-previewsize' => sprintf( '[%d,%d]', $img_size_data['width'], $img_size_data['height'] ),
'data-sizename' => $img_size_data['name'],
'data-queryargs' => ! empty( $query_args ) ? json_encode( $query_args ) : '',
'js_dependencies' => 'media-editor',
) );
$output .= parent::render( array(
'type' => 'button',
'class' => 'cmb2-upload-button button-secondary cmb2-upload-list',
'value' => esc_attr( $this->_text( 'add_upload_files_text', esc_html__( 'Add or Upload Files', 'cmb2' ) ) ),
'name' => '',
'id' => '',
) );
$output .= '<ul id="' . $this->_id( '-status', false ) . '" class="cmb2-media-status cmb-attach-list">';
if ( $meta_value && is_array( $meta_value ) ) {
foreach ( $meta_value as $id => $fullurl ) {
$id_input = parent::render( array(
'type' => 'hidden',
'value' => $fullurl,
'name' => $name . '[' . $id . ']',
'id' => 'filelist-' . $id,
'data-id' => $id,
'desc' => '',
'class' => false,
) );
if ( $this->is_valid_img_ext( $fullurl ) ) {
$output .= $this->img_status_output( array(
'image' => wp_get_attachment_image( $id, $img_size ),
'tag' => 'li',
'id_input' => $id_input,
) );
} else {
$output .= $this->file_status_output( array(
'value' => $fullurl,
'tag' => 'li',
'id_input' => $id_input,
) );
}
}
}
$output .= '</ul>';
return $this->rendered( $output );
}
}
CMB2_Type_Text_Time.php 0000666 00000001222 15175314405 0010731 0 ustar 00 <?php
/**
* CMB text_time field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Text_Time extends CMB2_Type_Text_Date {
public function render( $args = array() ) {
$this->args = $this->parse_picker_options( 'time', wp_parse_args( $this->args, array(
'class' => 'cmb2-timepicker text-time',
'value' => $this->field->get_timestamp_format( 'time_format' ),
'js_dependencies' => array( 'jquery-ui-core', 'jquery-ui-datepicker', 'jquery-ui-datetimepicker' ),
) ) );
return parent::render();
}
}
CMB2_Type_Textarea.php 0000666 00000002021 15175314405 0010602 0 ustar 00 <?php
/**
* CMB textarea field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Textarea extends CMB2_Type_Counter_Base {
/**
* Handles outputting an 'textarea' element
*
* @since 1.1.0
* @param array $args Override arguments
* @return string Form textarea element
*/
public function render( $args = array() ) {
$args = empty( $args ) ? $this->args : $args;
$a = $this->parse_args( 'textarea', array(
'class' => 'cmb2_textarea',
'name' => $this->_name(),
'id' => $this->_id(),
'cols' => 60,
'rows' => 10,
'value' => $this->field->escaped_value( 'esc_textarea' ),
'desc' => $this->_desc( true ),
), $args );
// Add character counter?
$a = $this->maybe_update_attributes_for_char_counter( $a );
return $this->rendered(
sprintf( '<textarea%s>%s</textarea>%s', $this->concat_attrs( $a, array( 'desc', 'value' ) ), $a['value'], $a['desc'] )
);
}
}
CMB2_Type_Radio.php 0000666 00000002034 15175314405 0010067 0 ustar 00 <?php
/**
* CMB radio field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Radio extends CMB2_Type_Multi_Base {
/**
* The type of radio field
*
* @var string
*/
public $type = 'radio';
/**
* Constructor
*
* @since 2.2.2
*
* @param CMB2_Types $types
* @param array $args
*/
public function __construct( CMB2_Types $types, $args = array(), $type = '' ) {
parent::__construct( $types, $args );
$this->type = $type ? $type : $this->type;
}
public function render() {
$args = $this->parse_args( $this->type, array(
'class' => 'cmb2-radio-list cmb2-list',
'options' => $this->concat_items( array(
'label' => 'test',
'method' => 'list_input',
) ),
'desc' => $this->_desc( true ),
) );
return $this->rendered( $this->ul( $args ) );
}
protected function ul( $a ) {
return sprintf( '<ul class="%s">%s</ul>%s', $a['class'], $a['options'], $a['desc'] );
}
}
CMB2_Type_Wysiwyg.php 0000666 00000006407 15175314405 0010523 0 ustar 00 <?php
/**
* CMB wysiwyg field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*
* @method string _id()
* @method string _desc()
*/
class CMB2_Type_Wysiwyg extends CMB2_Type_Textarea {
/**
* Handles outputting a 'wysiwyg' element
* @since 1.1.0
* @return string Form wysiwyg element
*/
public function render( $args = array() ) {
$field = $this->field;
$a = $this->parse_args( 'wysiwyg', array(
'id' => $this->_id( '', false ),
'value' => $field->escaped_value( 'stripslashes' ),
'desc' => $this->_desc( true ),
'options' => $field->options(),
) );
if ( ! $field->group ) {
$a = $this->maybe_update_attributes_for_char_counter( $a );
if ( $this->has_counter ) {
$a['options']['editor_class'] = ! empty( $a['options']['editor_class'] )
? $a['options']['editor_class'] . ' cmb2-count-chars'
: 'cmb2-count-chars';
}
return $this->rendered( $this->get_wp_editor( $a ) . $a['desc'] );
}
// Character counter not currently working for grouped WYSIWYG
$this->field->args['char_counter'] = false;
// wysiwyg fields in a group need some special handling.
$field->add_js_dependencies( 'wp-util', 'cmb2-wysiwyg' );
// Hook in our template-output to the footer.
add_action( is_admin() ? 'admin_footer' : 'wp_footer', array( $this, 'add_wysiwyg_template_for_group' ) );
return $this->rendered(
sprintf( '<div class="cmb2-wysiwyg-wrap">%s', parent::render( array(
'class' => 'cmb2_textarea cmb2-wysiwyg-placeholder',
'data-groupid' => $field->group->id(),
'data-iterator' => $field->group->index,
'data-fieldid' => $field->id( true ),
'desc' => '</div>' . $this->_desc( true ),
) ) )
);
}
protected function get_wp_editor( $args ) {
ob_start();
wp_editor( $args['value'], $args['id'], $args['options'] );
return ob_get_clean();
}
public function add_wysiwyg_template_for_group() {
$group_id = $this->field->group->id();
$field_id = $this->field->id( true );
$hash = $this->field->hash_id();
$options = $this->field->options();
$options['textarea_name'] = 'cmb2_n_' . $group_id . $field_id;
// Initate the editor with special id/value/name so we can retrieve the options in JS.
$editor = $this->get_wp_editor( array(
'value' => 'cmb2_v_' . $group_id . $field_id,
'id' => 'cmb2_i_' . $group_id . $field_id,
'options' => $options,
) );
// Then replace the special id/value/name with underscore placeholders.
$editor = str_replace( array(
'cmb2_n_' . $group_id . $field_id,
'cmb2_v_' . $group_id . $field_id,
'cmb2_i_' . $group_id . $field_id,
), array(
'{{ data.name }}',
'{{{ data.value }}}',
'{{ data.id }}',
), $editor );
// And put the editor instance in a JS template wrapper.
echo '<script type="text/template" id="tmpl-cmb2-wysiwyg-' . $group_id . '-' . $field_id . '">';
// Need to wrap the template in a wrapper div w/ specific data attributes which will be used when adding/removing rows.
echo '<div class="cmb2-wysiwyg-inner-wrap" data-iterator="{{ data.iterator }}" data-groupid="' . $group_id . '" data-id="' . $field_id . '" data-hash="' . $hash . '">' . $editor . '</div>';
echo '</script>';
}
}
CMB2_Type_Oembed.php 0000666 00000002011 15175314405 0010217 0 ustar 00 <?php
/**
* CMB oembed field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Oembed extends CMB2_Type_Text {
public function render( $args = array() ) {
$field = $this->field;
$meta_value = trim( $field->escaped_value() );
$oembed = ! empty( $meta_value )
? cmb2_ajax()->get_oembed( array(
'url' => $field->escaped_value(),
'object_id' => $field->object_id,
'object_type' => $field->object_type,
'oembed_args' => array(
'width' => '640',
),
'field_id' => $this->_id( '', false ),
) )
: '';
return parent::render( array(
'class' => 'cmb2-oembed regular-text',
'data-objectid' => $field->object_id,
'data-objecttype' => $field->object_type,
) )
. '<p class="cmb-spinner spinner"></p>'
. '<div id="' . $this->_id( '-status' ) . '" class="cmb2-media-status ui-helper-clearfix embed_wrap">' . $oembed . '</div>';
}
}
CMB2_Type_Taxonomy_Radio.php 0000666 00000004222 15175314405 0011766 0 ustar 00 <?php
/**
* CMB taxonomy_radio field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Taxonomy_Radio extends CMB2_Type_Taxonomy_Base {
protected $counter = 0;
public function render() {
return $this->rendered(
$this->types->radio( array(
'options' => $this->get_term_options(),
), 'taxonomy_radio' )
);
}
protected function get_term_options() {
$all_terms = $this->get_terms();
if ( ! $all_terms || is_wp_error( $all_terms ) ) {
return $this->no_terms_result( $all_terms );
}
$saved_term = $this->get_object_term_or_default();
$option_none = $this->field->args( 'show_option_none' );
$options = '';
if ( ! empty( $option_none ) ) {
$field_id = $this->_id( '', false );
/**
* Default (option-none) taxonomy-radio value.
*
* @since 1.3.0
*
* @param string $option_none_value Default (option-none) taxonomy-radio value.
*/
$option_none_value = apply_filters( 'cmb2_taxonomy_radio_default_value', '' );
/**
* Default (option-none) taxonomy-radio value.
*
* The dynamic portion of the hook name, $field_id, refers to the field id attribute.
*
* @since 1.3.0
*
* @param string $option_none_value Default (option-none) taxonomy-radio value.
*/
$option_none_value = apply_filters( "cmb2_taxonomy_radio_{$field_id}_default_value", $option_none_value );
$options .= $this->list_term_input( (object) array(
'slug' => $option_none_value,
'name' => $option_none,
), $saved_term );
}
$options .= $this->loop_terms( $all_terms, $saved_term );
return $options;
}
protected function loop_terms( $all_terms, $saved_term ) {
$options = '';
foreach ( $all_terms as $term ) {
$options .= $this->list_term_input( $term, $saved_term );
}
return $options;
}
protected function list_term_input( $term, $saved_term ) {
$args = array(
'value' => $term->slug,
'label' => $term->name,
);
if ( $saved_term == $term->slug ) {
$args['checked'] = 'checked';
}
return $this->list_input( $args, ++$this->counter );
}
}
CMB2_Type_Text_Date.php 0000666 00000001340 15175314405 0010711 0 ustar 00 <?php
/**
* CMB text_date field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Text_Date extends CMB2_Type_Picker_Base {
public function render( $args = array() ) {
$args = $this->parse_args( 'text_date', array(
'class' => 'cmb2-text-small cmb2-datepicker',
'value' => $this->field->get_timestamp_format(),
'desc' => $this->_desc(),
'js_dependencies' => array( 'jquery-ui-core', 'jquery-ui-datepicker' ),
) );
if ( false === strpos( $args['class'], 'timepicker' ) ) {
$this->parse_picker_options( 'date' );
}
return parent::render( $args );
}
}
CMB2_Type_Textarea_Code.php 0000666 00000001652 15175314405 0011545 0 ustar 00 <?php
/**
* CMB textarea_code field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Textarea_Code extends CMB2_Type_Textarea {
/**
* Handles outputting an 'textarea' element
*
* @since 1.1.0
* @param array $args Override arguments
* @return string Form textarea element
*/
public function render( $args = array() ) {
$args = wp_parse_args( $args, array(
'class' => 'cmb2-textarea-code',
'desc' => '</pre>' . $this->_desc( true ),
) );
if ( true !== $this->field->options( 'disable_codemirror' )
&& function_exists( 'wp_enqueue_code_editor' ) ) {
$args['js_dependencies'] = array( 'code-editor' );
} else {
$args['class'] = rtrim( $args['class'] ) . ' disable-codemirror';
}
return $this->rendered(
sprintf( '<pre>%s', parent::render( $args ) )
);
}
}
CMB2_Type_Counter_Base.php 0000666 00000006630 15175314405 0011410 0 ustar 00 <?php
/**
* CMB base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
abstract class CMB2_Type_Counter_Base extends CMB2_Type_Base {
/**
* Whether this type has the counter added.
*
* @since 2.7.0
*
* @var boolean
*/
public $has_counter = false;
/**
* Return character counter markup for this field.
*
* @since 2.7.0
*
* @param string $val The actual value of this field.
*
* @return string
*/
public function char_counter_markup( $val ) {
$markup = '';
if ( ! $this->field->args( 'char_counter' ) ) {
return $markup;
}
$type = (string) $this->field->args( 'char_counter' );
$field_id = $this->_id( '', false );
$char_max = (int) $this->field->prop( 'char_max' );
if ( $char_max ) {
$char_max = 'data-max="' . $char_max . '"';
}
switch ( $type ) {
case 'words':
$label = $char_max
? $this->_text( 'words_left_text', esc_html__( 'Words left', 'cmb2' ) )
: $this->_text( 'words_text', esc_html__( 'Words', 'cmb2' ) );
break;
default:
$type = 'characters';
$label = $char_max
? $this->_text( 'characters_left_text', esc_html__( 'Characters left', 'cmb2' ) )
: $this->_text( 'characters_text', esc_html__( 'Characters', 'cmb2' ) );
break;
}
$msg = $char_max
? sprintf( '<span class="cmb2-char-max-msg">%s</span>', $this->_text( 'characters_truncated_text', esc_html__( 'Your text may be truncated.', 'cmb2' ) ) )
: '';
$length = strlen( $val );
$width = $length > 1 ? ( 8 * strlen( (string) $length ) ) + 15 : false;
$markup .= '<p class="cmb2-char-counter-wrap">';
$markup .= sprintf(
'<label><span class="cmb2-char-counter-label">%2$s:</span> <input id="%1$s" data-field-id="%3$s" data-counter-type="%4$s" %5$s class="cmb2-char-counter" type="text" value="%6$s" readonly="readonly" style="%7$s"></label>%8$s',
esc_attr( 'char-counter-' . $field_id ),
$label,
esc_attr( $field_id ),
$type,
$char_max,
$length,
$width ? "width: {$width}px;" : '',
$msg
);
$markup .= '</p>';
// Enqueue the required JS.
$this->field->add_js_dependencies( array(
'word-count',
'wp-util',
'cmb2-char-counter',
) );
$this->has_counter = true;
return $markup;
}
/**
* Maybe update attributes for the character counter.
*
* @since 2.7.0
*
* @param array $attributes Array of parsed attributes.
*
* @return array Potentially modified attributes.
*/
public function maybe_update_attributes_for_char_counter( $attributes ) {
$char_counter = $this->char_counter_markup( $attributes['value'] );
// Has character counter?
if ( $char_counter ) {
$attributes['class'] = ! empty( $attributes['class'] ) ? $attributes['class'] . ' cmb2-count-chars' : ' cmb2-count-chars';
// Enforce max chars?
$max = $this->enforce_max();
if ( $max ) {
$attributes['maxlength'] = $max;
}
$attributes['desc'] = $char_counter . $attributes['desc'];
}
return $attributes;
}
/**
* Enforce max chars?
*
* @since 2.7.0
*
* @return bool Whether to enforce max characters.
*/
public function enforce_max() {
$char_max = (int) $this->field->args( 'char_max' );
// Enforce max chars?
return ( $this->field->args( 'char_max_enforce' ) && $char_max > 0
&& 'words' !== $this->field->args( 'char_counter' ) )
? $char_max
: false;
}
}
CMB2_Type_Text.php 0000666 00000002601 15175314405 0007755 0 ustar 00 <?php
/**
* CMB text field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Text extends CMB2_Type_Counter_Base {
/**
* The type of field
*
* @var string
*/
public $type = 'input';
/**
* Constructor
*
* @since 2.2.2
*
* @param CMB2_Types $types
* @param array $args
*/
public function __construct( CMB2_Types $types, $args = array(), $type = '' ) {
parent::__construct( $types, $args );
$this->type = $type ? $type : $this->type;
}
/**
* Handles outputting an 'input' element
*
* @since 1.1.0
* @param array $args Override arguments
* @return string Form input element
*/
public function render( $args = array() ) {
$args = empty( $args ) ? $this->args : $args;
$a = $this->parse_args( $this->type, array(
'type' => 'text',
'class' => 'regular-text',
'name' => $this->_name(),
'id' => $this->_id(),
'value' => $this->field->escaped_value(),
'desc' => $this->_desc( true ),
'js_dependencies' => array(),
), $args );
// Add character counter?
$a = $this->maybe_update_attributes_for_char_counter( $a );
return $this->rendered(
sprintf( '<input%s/>%s', $this->concat_attrs( $a, array( 'desc' ) ), $a['desc'] )
);
}
}
CMB2_Type_Select.php 0000666 00000001237 15175314405 0010254 0 ustar 00 <?php
/**
* CMB select field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Select extends CMB2_Type_Multi_Base {
public function render() {
$a = $this->parse_args( 'select', array(
'class' => 'cmb2_select',
'name' => $this->_name(),
'id' => $this->_id(),
'desc' => $this->_desc( true ),
'options' => $this->concat_items(),
) );
$attrs = $this->concat_attrs( $a, array( 'desc', 'options' ) );
return $this->rendered(
sprintf( '<select%s>%s</select>%s', $attrs, $a['options'], $a['desc'] )
);
}
}
CMB2_Type_Picker_Base.php 0000666 00000002546 15175314405 0011210 0 ustar 00 <?php
/**
* CMB Picker base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
abstract class CMB2_Type_Picker_Base extends CMB2_Type_Text {
/**
* Parse the picker attributes.
*
* @since 2.2.0
* @param string $arg 'date' or 'time'
* @param array $args Optional arguments to modify (else use $this->field->args['attributes'])
* @return array Array of field attributes
*/
public function parse_picker_options( $arg = 'date', $args = array() ) {
$att = 'data-' . $arg . 'picker';
$update = empty( $args );
$atts = array();
$format = $this->field->args( $arg . '_format' );
if ( $js_format = CMB2_Utils::php_to_js_dateformat( $format ) ) {
if ( $update ) {
$atts = $this->field->args( 'attributes' );
} else {
$atts = isset( $args['attributes'] )
? $args['attributes']
: $atts;
}
// Don't override user-provided datepicker values
$data = isset( $atts[ $att ] )
? json_decode( $atts[ $att ], true )
: array();
$data[ $arg . 'Format' ] = $js_format;
$atts[ $att ] = function_exists( 'wp_json_encode' )
? wp_json_encode( $data )
: json_encode( $data );
}
if ( $update ) {
$this->field->args['attributes'] = $atts;
}
return array_merge( $args, $atts );
}
}
CMB2_Type_File.php 0000666 00000012644 15175314405 0007720 0 ustar 00 <?php
/**
* CMB file field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_File extends CMB2_Type_File_Base {
/**
* Handles outputting an 'file' field
*
* @param array $args Override arguments.
* @return string Form input element
*/
public function render( $args = array() ) {
$args = empty( $args ) ? $this->args : $args;
$field = $this->field;
$options = (array) $field->options();
$a = $this->args = $this->parse_args( 'file', array(
'class' => 'cmb2-upload-file regular-text',
'id' => $this->_id(),
'name' => $this->_name(),
'value' => $field->escaped_value(),
'id_value' => null,
'desc' => $this->_desc( true ),
'size' => 45,
'js_dependencies' => 'media-editor',
'preview_size' => $field->args( 'preview_size' ),
'query_args' => $field->args( 'query_args' ),
// if options array and 'url' => false, then hide the url field.
'type' => array_key_exists( 'url', $options ) && false === $options['url']
? 'hidden'
: 'text',
), $args );
// get an array of image size meta data, fallback to 'large'.
$this->args['img_size_data'] = $img_size_data = parent::get_image_size_data(
$a['preview_size'],
'large'
);
$output = '';
$output .= parent::render( array(
'type' => $a['type'],
'class' => $a['class'],
'value' => $a['value'],
'id' => $a['id'],
'name' => $a['name'],
'size' => $a['size'],
'desc' => '',
'data-previewsize' => sprintf( '[%d,%d]', $img_size_data['width'], $img_size_data['height'] ),
'data-sizename' => $img_size_data['name'],
'data-queryargs' => ! empty( $a['query_args'] ) ? json_encode( $a['query_args'] ) : '',
'js_dependencies' => $a['js_dependencies'],
) );
// Now remove the data-iterator attribute if it exists.
// (Possible if being used within a custom field)
// This is not elegant, but compensates for CMB2_Types::_id
// automagically & inelegantly adding the data-iterator attribute.
// Single responsibility principle? pffft.
$parts = explode( '"', $this->args['id'] );
$this->args['id'] = $parts[0];
$output .= sprintf(
'<input class="cmb2-upload-button button-secondary" type="button" value="%1$s" />',
esc_attr( $this->_text( 'add_upload_file_text', esc_html__( 'Add or Upload File', 'cmb2' ) ) )
);
$output .= $a['desc'];
$output .= $this->get_id_field_output();
$output .= '<div id="' . esc_attr( $field->id() ) . '-status" class="cmb2-media-status">';
if ( ! empty( $a['value'] ) ) {
$output .= $this->get_file_preview_output();
}
$output .= '</div>';
return $this->rendered( $output );
}
/**
* Return attempted file preview output for a provided file.
*
* @since 2.2.5
*
* @return string
*/
public function get_file_preview_output() {
if ( ! $this->is_valid_img_ext( $this->args['value'] ) ) {
return $this->file_status_output( array(
'value' => $this->args['value'],
'tag' => 'div',
'cached_id' => $this->args['id'],
) );
}
if ( $this->args['id_value'] ) {
$image = wp_get_attachment_image( $this->args['id_value'], $this->args['preview_size'], null, array(
'class' => 'cmb-file-field-image',
) );
} else {
$image = '<img style="max-width: ' . absint( $this->args['img_size_data']['width'] ) . 'px; width: 100%;" src="' . esc_url( $this->args['value'] ) . '" class="cmb-file-field-image" alt="" />';
}
return $this->img_status_output( array(
'image' => $image,
'tag' => 'div',
'cached_id' => $this->args['id'],
) );
}
/**
* Return field ID output as a hidden field.
*
* @since 2.2.5
*
* @return string
*/
public function get_id_field_output() {
$field = $this->field;
/*
* A little bit of magic (tsk tsk) replacing the $this->types->field object,
* So that the render function is using the proper field object.
*/
$this->types->field = $this->get_id_field();
$output = parent::render( array(
'type' => 'hidden',
'class' => 'cmb2-upload-file-id',
'value' => $this->types->field->value,
'desc' => '',
) );
// We need to put the original field object back
// or other fields in a custom field will be broken.
$this->types->field = $field;
return $output;
}
/**
* Return field ID data.
*
* @since 2.2.5
*
* @return mixed
*/
public function get_id_field() {
// reset field args for attachment id.
$args = array(
// if we're looking at a file in a group, we need to get the non-prefixed id.
'id' => ( $this->field->group ? $this->field->args( '_id' ) : $this->args['id'] ) . '_id',
'disable_hash_data_attribute' => true,
);
// and get new field object
// (need to set it to the types field property).
$id_field = $this->field->get_field_clone( $args );
$id_value = absint( null !== $this->args['id_value'] ? $this->args['id_value'] : $id_field->escaped_value() );
// we don't want to output "0" as a value.
if ( ! $id_value ) {
$id_value = '';
}
// if there is no id saved yet, try to get it from the url.
if ( $this->args['value'] && ! $id_value ) {
$id_value = CMB2_Utils::image_id_from_url( esc_url_raw( $this->args['value'] ) );
}
$id_field->value = $id_value;
return $id_field;
}
}
CMB2_Type_Base.php 0000666 00000011215 15175314405 0007704 0 ustar 00 <?php
/**
* CMB base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
abstract class CMB2_Type_Base {
/**
* The CMB2_Types object
*
* @var CMB2_Types
*/
public $types;
/**
* Arguments for use in the render method
*
* @var array
*/
public $args;
/**
* Rendered output (if 'rendered' argument is set to false)
*
* @var string
*/
protected $rendered = '';
/**
* Constructor
*
* @since 2.2.2
* @param CMB2_Types $types Object for the field type.
* @param array $args Array of arguments for the type.
*/
public function __construct( CMB2_Types $types, $args = array() ) {
$this->types = $types;
$args['rendered'] = isset( $args['rendered'] ) ? (bool) $args['rendered'] : true;
$this->args = $args;
}
/**
* Handles rendering this field type.
*
* @since 2.2.2
* @return string Rendered field type.
*/
abstract public function render();
/**
* Stores the rendered field output.
*
* @since 2.2.2
* @param string|CMB2_Type_Base $rendered Rendered output.
* @return string|CMB2_Type_Base Rendered output or this object.
*/
public function rendered( $rendered ) {
$this->field->register_js_data();
if ( $this->args['rendered'] ) {
return is_a( $rendered, __CLASS__ ) ? $rendered->rendered : $rendered;
}
$this->rendered = is_a( $rendered, __CLASS__ ) ? $rendered->rendered : $rendered;
return $this;
}
/**
* Returns the stored rendered field output.
*
* @since 2.2.2
* @return string Stored rendered output (if 'rendered' argument is set to false).
*/
public function get_rendered() {
return $this->rendered;
}
/**
* Handles parsing and filtering attributes while preserving any passed in via field config.
*
* @since 1.1.0
* @param string $element Element for filter.
* @param array $type_defaults Type default arguments.
* @param array $type_overrides Type override arguments.
* @return array Parsed and filtered arguments.
*/
public function parse_args( $element, $type_defaults, $type_overrides = array() ) {
$args = $this->parse_args_from_overrides( $type_overrides );
/**
* Filter attributes for a field type.
* The dynamic portion of the hook name, $element, refers to the field type.
*
* @since 1.1.0
* @param array $args The array of attribute arguments.
* @param array $type_defaults The array of default values.
* @param array $field The `CMB2_Field` object.
* @param object $field_type_object This `CMB2_Types` object.
*/
$args = apply_filters( "cmb2_{$element}_attributes", $args, $type_defaults, $this->field, $this->types );
$args = wp_parse_args( $args, $type_defaults );
if ( ! empty( $args['js_dependencies'] ) ) {
$this->field->add_js_dependencies( $args['js_dependencies'] );
}
return $args;
}
/**
* Handles parsing and filtering attributes while preserving any passed in via field config.
*
* @since 2.2.4
* @param array $type_overrides Type override arguments.
* @return array Parsed arguments
*/
protected function parse_args_from_overrides( $type_overrides = array() ) {
$type_overrides = empty( $type_overrides ) ? $this->args : $type_overrides;
if ( true !== $this->field->args( 'disable_hash_data_attribute' ) ) {
$type_overrides['data-hash'] = $this->field->hash_id();
}
$field_overrides = $this->field->args( 'attributes' );
return ! empty( $field_overrides )
? wp_parse_args( $field_overrides, $type_overrides )
: $type_overrides;
}
/**
* Fall back to CMB2_Types methods
*
* @param string $method Method name being invoked.
* @param array $arguments Arguments passed for the method.
* @throws Exception Throws an exception if the field is invalid.
* @return mixed
*/
public function __call( $method, $arguments ) {
switch ( $method ) {
case '_id':
case '_name':
case '_desc':
case '_text':
case 'concat_attrs':
return call_user_func_array( array( $this->types, $method ), $arguments );
default:
throw new Exception( sprintf( esc_html__( 'Invalid %1$s method: %2$s', 'cmb2' ), __CLASS__, $method ) );
}
}
/**
* Magic getter for our object.
*
* @param string $field Property being requested.
* @throws Exception Throws an exception if the field is invalid.
* @return mixed
*/
public function __get( $field ) {
switch ( $field ) {
case 'field':
return $this->types->field;
default:
throw new Exception( sprintf( esc_html__( 'Invalid %1$s property: %2$s', 'cmb2' ), __CLASS__, $field ) );
}
}
}
CMB2_Type_Multicheck.php 0000666 00000001502 15175314405 0011120 0 ustar 00 <?php
/**
* CMB multicheck field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Multicheck extends CMB2_Type_Radio {
/**
* The type of radio field
*
* @var string
*/
public $type = 'checkbox';
public function render( $args = array() ) {
$classes = false === $this->field->args( 'select_all_button' )
? 'cmb2-checkbox-list no-select-all cmb2-list'
: 'cmb2-checkbox-list cmb2-list';
$args = $this->parse_args( $this->type, array(
'class' => $classes,
'options' => $this->concat_items( array(
'name' => $this->_name() . '[]',
'method' => 'list_input_checkbox',
) ),
'desc' => $this->_desc( true ),
) );
return $this->rendered( $this->ul( $args ) );
}
}
CMB2_Type_Text_Datetime_Timestamp_Timezone.php 0000666 00000003315 15175314405 0015471 0 ustar 00 <?php
/**
* CMB text_datetime_timestamp_timezone field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Text_Datetime_Timestamp_Timezone extends CMB2_Type_Base {
public function render( $args = array() ) {
$field = $this->field;
$value = $field->escaped_value();
if ( empty( $value ) ) {
$value = $field->get_default();
}
$args = wp_parse_args( $this->args, array(
'value' => $value,
'desc' => $this->_desc( true ),
'text_datetime_timestamp' => array(),
'select_timezone' => array(),
) );
$args['value'] = $value;
if ( is_array( $args['value'] ) ) {
$args['value'] = '';
}
$datetime = maybe_unserialize( $args['value'] );
$value = $tzstring = '';
if ( $datetime && $datetime instanceof DateTime ) {
$tz = $datetime->getTimezone();
$tzstring = $tz->getName();
$value = $datetime->getTimestamp();
}
$timestamp_args = wp_parse_args( $args['text_datetime_timestamp'], array(
'desc' => '',
'value' => $value,
'rendered' => true,
) );
$datetime_timestamp = $this->types->text_datetime_timestamp( $timestamp_args );
$timezone_select_args = wp_parse_args( $args['select_timezone'], array(
'class' => 'cmb2_select cmb2-select-timezone',
'name' => $this->_name( '[timezone]' ),
'id' => $this->_id( '_timezone' ),
'options' => wp_timezone_choice( $tzstring ),
'desc' => $args['desc'],
'rendered' => true,
) );
$select = $this->types->select( $timezone_select_args );
return $this->rendered(
$datetime_timestamp . "\n" . $select
);
}
}
CMB2_Type_Taxonomy_Select.php 0000666 00000004407 15175314405 0012154 0 ustar 00 <?php
/**
* CMB taxonomy_select field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Taxonomy_Select extends CMB2_Type_Taxonomy_Base {
/**
* Current Term Object.
*
* @since 2.6.1
*
* @var null|WP_Term
*/
public $current_term = null;
/**
* Saved Term Object.
*
* @since 2.6.1
*
* @var null|WP_Term
*/
public $saved_term = null;
public function render() {
return $this->rendered(
$this->types->select( array(
'options' => $this->get_term_options(),
) )
);
}
protected function get_term_options() {
$all_terms = $this->get_terms();
if ( ! $all_terms || is_wp_error( $all_terms ) ) {
return $this->no_terms_result( $all_terms, 'strong' );
}
$this->saved_term = $this->get_object_term_or_default();
$option_none = $this->field->args( 'show_option_none' );
$options = '';
if ( ! empty( $option_none ) ) {
$field_id = $this->_id( '', false );
/**
* Default (option-none) taxonomy-select value.
*
* @since 1.3.0
*
* @param string $option_none_value Default (option-none) taxonomy-select value.
*/
$option_none_value = apply_filters( 'cmb2_taxonomy_select_default_value', '' );
/**
* Default (option-none) taxonomy-select value.
*
* The dynamic portion of the hook name, $field_id, refers to the field id attribute.
*
* @since 1.3.0
*
* @param string $option_none_value Default (option-none) taxonomy-select value.
*/
$option_none_value = apply_filters( "cmb2_taxonomy_select_{$field_id}_default_value", $option_none_value );
$options .= $this->select_option( array(
'label' => $option_none,
'value' => $option_none_value,
'checked' => $this->saved_term == $option_none_value,
) );
}
$options .= $this->loop_terms( $all_terms, $this->saved_term );
return $options;
}
protected function loop_terms( $all_terms, $saved_term ) {
$options = '';
foreach ( $all_terms as $term ) {
$this->current_term = $term;
$options .= $this->select_option( array(
'label' => $term->name,
'value' => $term->slug,
'checked' => $this->saved_term === $term->slug,
) );
}
return $options;
}
}
CMB2_Type_File_Base.php 0000666 00000020163 15175314405 0010645 0 ustar 00 <?php
/**
* CMB File base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_File_Base extends CMB2_Type_Text {
/**
* Determines if a file has a valid image extension
*
* @since 1.0.0
* @param string $file File url
* @return bool Whether file has a valid image extension
*/
public function is_valid_img_ext( $file, $blah = false ) {
$file_ext = CMB2_Utils::get_file_ext( $file );
$valid_types = array( 'jpg', 'jpeg', 'png', 'gif', 'ico', 'icon' );
/**
* Which image types are considered valid image file extensions.
*
* @since 2.0.9
*
* @param array $valid_types The valid image file extensions.
*/
$is_valid_types = apply_filters( 'cmb2_valid_img_types', $valid_types );
$is_valid = $file_ext && in_array( $file_ext, (array) $is_valid_types );
$field_id = $this->field->id();
/**
* Filter for determining if a field value has a valid image file-type extension.
*
* The dynamic portion of the hook name, $field_id, refers to the field id attribute.
*
* @since 2.0.9
*
* @param bool $is_valid Whether field value has a valid image file-type extension.
* @param string $file File url.
* @param string $file_ext File extension.
*/
return (bool) apply_filters( "cmb2_{$field_id}_is_valid_img_ext", $is_valid, $file, $file_ext );
}
/**
* file/file_list image wrap
*
* @since 2.0.2
* @param array $args Array of arguments for output
* @return string Image wrap output
*/
public function img_status_output( $args ) {
return sprintf( '<%1$s class="img-status cmb2-media-item">%2$s<p class="cmb2-remove-wrapper"><a href="#" class="cmb2-remove-file-button"%3$s>%4$s</a></p>%5$s</%1$s>',
$args['tag'],
$args['image'],
isset( $args['cached_id'] ) ? ' rel="' . esc_attr( $args['cached_id'] ) . '"' : '',
esc_html( $this->_text( 'remove_image_text', esc_html__( 'Remove Image', 'cmb2' ) ) ),
isset( $args['id_input'] ) ? $args['id_input'] : ''
);
}
/**
* file/file_list file wrap
*
* @since 2.0.2
* @param array $args Array of arguments for output
* @return string File wrap output
*/
public function file_status_output( $args ) {
return sprintf( '<%1$s class="file-status cmb2-media-item"><span>%2$s <strong>%3$s</strong></span> (<a href="%4$s" target="_blank" rel="external">%5$s</a> / <a href="#" class="cmb2-remove-file-button"%6$s>%7$s</a>)%8$s</%1$s>',
$args['tag'],
esc_html( $this->_text( 'file_text', esc_html__( 'File:', 'cmb2' ) ) ),
esc_html( CMB2_Utils::get_file_name_from_path( $args['value'] ) ),
esc_url( $args['value'] ),
esc_html( $this->_text( 'file_download_text', esc_html__( 'Download', 'cmb2' ) ) ),
isset( $args['cached_id'] ) ? ' rel="' . esc_attr( $args['cached_id'] ) . '"' : '',
esc_html( $this->_text( 'remove_text', esc_html__( 'Remove', 'cmb2' ) ) ),
isset( $args['id_input'] ) ? $args['id_input'] : ''
);
}
/**
* Outputs the file/file_list underscore Javascript templates in the footer.
*
* @since 2.2.4
* @return void
*/
public static function output_js_underscore_templates() {
?>
<script type="text/html" id="tmpl-cmb2-single-image">
<div class="img-status cmb2-media-item">
<img width="{{ data.sizeWidth }}" height="{{ data.sizeHeight }}" src="{{ data.sizeUrl }}" class="cmb-file-field-image" alt="{{ data.filename }}" title="{{ data.filename }}" />
<p><a href="#" class="cmb2-remove-file-button" rel="{{ data.mediaField }}">{{ data.stringRemoveImage }}</a></p>
</div>
</script>
<script type="text/html" id="tmpl-cmb2-single-file">
<div class="file-status cmb2-media-item">
<span>{{ data.stringFile }} <strong>{{ data.filename }}</strong></span> (<a href="{{ data.url }}" target="_blank" rel="external">{{ data.stringDownload }}</a> / <a href="#" class="cmb2-remove-file-button" rel="{{ data.mediaField }}">{{ data.stringRemoveFile }}</a>)
</div>
</script>
<script type="text/html" id="tmpl-cmb2-list-image">
<li class="img-status cmb2-media-item">
<img width="{{ data.sizeWidth }}" height="{{ data.sizeHeight }}" src="{{ data.sizeUrl }}" class="cmb-file_list-field-image" alt="{{ data.filename }}">
<p><a href="#" class="cmb2-remove-file-button" rel="{{ data.mediaField }}[{{ data.id }}]">{{ data.stringRemoveImage }}</a></p>
<input type="hidden" id="filelist-{{ data.id }}" data-id="{{ data.id }}" name="{{ data.mediaFieldName }}[{{ data.id }}]" value="{{ data.url }}">
</li>
</script>
<script type="text/html" id="tmpl-cmb2-list-file">
<li class="file-status cmb2-media-item">
<span>{{ data.stringFile }} <strong>{{ data.filename }}</strong></span> (<a href="{{ data.url }}" target="_blank" rel="external">{{ data.stringDownload }}</a> / <a href="#" class="cmb2-remove-file-button" rel="{{ data.mediaField }}[{{ data.id }}]">{{ data.stringRemoveFile }}</a>)
<input type="hidden" id="filelist-{{ data.id }}" data-id="{{ data.id }}" name="{{ data.mediaFieldName }}[{{ data.id }}]" value="{{ data.url }}">
</li>
</script>
<?php
}
/**
* Utility method to return an array of meta data for a registered image size
*
* Uses CMB2_Utils::get_named_size() to get the closest available named size
* from an array of width and height values and CMB2_Utils::get_available_image_sizes()
* to get the meta data associated with a named size.
*
* @since 2.2.4
* @param array|string $img_size Image size. Accepts an array of width and height (in that order)
* @param string $fallback Size to use if the supplied named size doesn't exist
* @return array Array containing the image size meta data
* $size = (
* 'width' => (int) image size width
* 'height' => (int) image size height
* 'name' => (string) e.g. 'thumbnail'
* )
*/
static function get_image_size_data( $img_size = '', $fallback = 'thumbnail' ) {
$data = array();
if ( is_array( $img_size ) ) {
$data['width'] = intval( $img_size[0] );
$data['height'] = intval( $img_size[1] );
$data['name'] = '';
// Try and get the closest named size from our array of dimensions
if ( $named_size = CMB2_Utils::get_named_size( $img_size ) ) {
$data['name'] = $named_size;
}
} else {
$image_sizes = CMB2_Utils::get_available_image_sizes();
// The 'thumb' alias, which works elsewhere, doesn't work in the wp.media uploader
if ( 'thumb' == $img_size ) {
$img_size = 'thumbnail';
}
// Named size doesn't exist, use $fallback
if ( ! array_key_exists( $img_size, $image_sizes ) ) {
$img_size = $fallback;
}
// Get image dimensions from named sizes
$data['width'] = intval( $image_sizes[ $img_size ]['width'] );
$data['height'] = intval( $image_sizes[ $img_size ]['height'] );
$data['name'] = $img_size;
}
return $data;
}
/**
* Filters attachment data prepared for JavaScript.
*
* Adds the url, width, height, and orientation for custom sizes to the JavaScript
* object returned by the wp.media uploader. Hooked to 'wp_prepare_attachment_for_js'.
*
* @since 2.2.4
* @param array $response Array of prepared attachment data
* @param int|object $attachment Attachment ID or object
* @param array $meta Array of attachment meta data ( from wp_get_attachment_metadata() )
* @return array filtered $response array
*/
public static function prepare_image_sizes_for_js( $response, $attachment, $meta ) {
foreach ( CMB2_Utils::get_available_image_sizes() as $size => $info ) {
// registered image size exists for this attachment
if ( isset( $meta['sizes'][ $size ] ) ) {
$attachment_url = wp_get_attachment_url( $attachment->ID );
$base_url = str_replace( wp_basename( $attachment_url ), '', $attachment_url );
$size_meta = $meta['sizes'][ $size ];
$response['sizes'][ $size ] = array(
'url' => $base_url . $size_meta['file'],
'height' => $size_meta['height'],
'width' => $size_meta['width'],
'orientation' => $size_meta['height'] > $size_meta['width'] ? 'portrait' : 'landscape',
);
}
}
return $response;
}
}
CMB2_Type_Taxonomy_Base.php 0000666 00000011237 15175314405 0011606 0 ustar 00 <?php
/**
* CMB Taxonomy base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
abstract class CMB2_Type_Taxonomy_Base extends CMB2_Type_Multi_Base {
/**
* Parent term ID when looping hierarchical terms.
*
* @var integer|null
*/
protected $parent = null;
/**
* Checks if we can get a post object, and if so, uses `get_the_terms` which utilizes caching.
*
* @since 1.0.2
* @return mixed Array of terms on success
*/
public function get_object_terms() {
switch ( $this->field->object_type ) {
case 'options-page':
case 'term':
return $this->options_terms();
case 'post':
// WP caches internally so it's better to use
return get_the_terms( $this->field->object_id, $this->field->args( 'taxonomy' ) );
default:
return $this->non_post_object_terms();
}
}
/**
* Gets the term objects for the terms stored via options boxes.
*
* @since 2.2.4
* @return mixed Array of terms on success
*/
public function options_terms() {
if ( empty( $this->field->value ) ) {
return array();
}
$terms = (array) $this->field->value;
foreach ( $terms as $index => $term ) {
$terms[ $index ] = get_term_by( 'slug', $term, $this->field->args( 'taxonomy' ) );
}
return $terms;
}
/**
* For non-post objects, wraps the call to wp_get_object_terms with transient caching.
*
* @since 2.2.4
* @return mixed Array of terms on success
*/
public function non_post_object_terms() {
$object_id = $this->field->object_id;
$taxonomy = $this->field->args( 'taxonomy' );
$cache_key = "cmb-cache-{$taxonomy}-{$object_id}";
// Check cache
$cached = get_transient( $cache_key );
if ( ! $cached ) {
$cached = wp_get_object_terms( $object_id, $taxonomy );
// Do our own (minimal) caching. Long enough for a page-load.
set_transient( $cache_key, $cached, 60 );
}
return $cached;
}
/**
* Wrapper for `get_terms` to account for changes in WP 4.6 where taxonomy is expected
* as part of the arguments.
*
* @since 2.2.2
* @return mixed Array of terms on success
*/
public function get_terms() {
$args = array(
'taxonomy' => $this->field->args( 'taxonomy' ),
'hide_empty' => false,
);
if ( null !== $this->parent ) {
$args['parent'] = $this->parent;
}
$args = wp_parse_args( $this->field->prop( 'query_args', array() ), $args );
return CMB2_Utils::wp_at_least( '4.5.0' )
? get_terms( $args )
: get_terms( $this->field->args( 'taxonomy' ), http_build_query( $args ) );
}
protected function no_terms_result( $error, $tag = 'li' ) {
if ( is_wp_error( $error ) ) {
$message = $error->get_error_message();
$data = 'data-error="' . esc_attr( $error->get_error_code() ) . '"';
} else {
$message = $this->_text( 'no_terms_text', esc_html__( 'No terms', 'cmb2' ) );
$data = '';
}
$this->field->args['select_all_button'] = false;
return sprintf( '<%3$s><label %1$s>%2$s</label></%3$s>', $data, esc_html( $message ), $tag );
}
public function get_object_term_or_default() {
$saved_terms = $this->get_object_terms();
return is_wp_error( $saved_terms ) || empty( $saved_terms )
? $this->field->get_default()
: array_shift( $saved_terms )->slug;
}
/**
* Takes a list of all tax terms and outputs.
*
* @since 2.2.5
*
* @param array $all_terms Array of all terms.
* @param array|string $saved Array of terms set to the object, or single term slug.
*
* @return string List of terms.
*/
protected function loop_terms( $all_terms, $saved_terms ) {
return '';
}
/**
* Build children hierarchy.
*
* @param object $parent_term The parent term object.
* @param array|string $saved Array of terms set to the object, or single term slug.
*
* @return string List of terms.
*/
protected function build_children( $parent_term, $saved ) {
if ( empty( $parent_term->term_id ) ) {
return '';
}
$this->parent = $parent_term->term_id;
$terms = $this->get_terms();
$options = '';
if ( ! empty( $terms ) && is_array( $terms ) ) {
$options .= $this->child_option_output( $terms, $saved );
}
return $options;
}
/**
* Build child terms output.
*
* @since 2.6.1
*
* @param array $terms Array of child terms.
* @param array|string $saved Array of terms set to the object, or single term slug.
*
* @return string Child option output.
*/
public function child_option_output( $terms, $saved ) {
$output = '<li class="cmb2-indented-hierarchy"><ul>';
$output .= $this->loop_terms( $terms, $saved );
$output .= '</ul></li>';
return $output;
}
}
CMB2_Type_Text_Datetime_Timestamp.php 0000666 00000004526 15175314405 0013624 0 ustar 00 <?php
/**
* CMB text_datetime_timestamp field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Text_Datetime_Timestamp extends CMB2_Type_Picker_Base {
public function render( $args = array() ) {
$field = $this->field;
$value = $field->escaped_value();
if ( empty( $value ) ) {
$value = $field->get_default();
}
$args = wp_parse_args( $this->args, array(
'value' => $value,
'desc' => $this->_desc(),
'datepicker' => array(),
'timepicker' => array(),
) );
if ( empty( $args['value'] ) ) {
$args['value'] = $value;
// This will be used if there is a select_timezone set for this field
$tz_offset = $field->field_timezone_offset();
if ( ! empty( $tz_offset ) ) {
$args['value'] -= $tz_offset;
}
}
$has_good_value = ! empty( $args['value'] ) && ! is_array( $args['value'] );
$date_input = parent::render( $this->date_args( $args, $has_good_value ) );
$time_input = parent::render( $this->time_args( $args, $has_good_value ) );
return $this->rendered( $date_input . "\n" . $time_input );
}
public function date_args( $args, $has_good_value ) {
$date_args = wp_parse_args( $args['datepicker'], array(
'class' => 'cmb2-text-small cmb2-datepicker',
'name' => $this->_name( '[date]' ),
'id' => $this->_id( '_date' ),
'value' => $has_good_value ? $this->field->get_timestamp_format( 'date_format', $args['value'] ) : '',
'desc' => '',
) );
$date_args['rendered'] = true;
// Let's get the date-format, and set it up as a data attr for the field.
return $this->parse_picker_options( 'date', $date_args );
}
public function time_args( $args, $has_good_value ) {
$time_args = wp_parse_args( $args['timepicker'], array(
'class' => 'cmb2-timepicker text-time',
'name' => $this->_name( '[time]' ),
'id' => $this->_id( '_time' ),
'value' => $has_good_value ? $this->field->get_timestamp_format( 'time_format', $args['value'] ) : '',
'desc' => $args['desc'],
'js_dependencies' => array( 'jquery-ui-core', 'jquery-ui-datepicker', 'jquery-ui-datetimepicker' ),
) );
$time_args['rendered'] = true;
// Let's get the time-format, and set it up as a data attr for the field.
return $this->parse_picker_options( 'time', $time_args );
}
}
CMB2_Type_Checkbox.php 0000666 00000003005 15175314405 0010556 0 ustar 00 <?php
/**
* CMB checkbox field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Checkbox extends CMB2_Type_Text {
/**
* If checkbox is checked
*
* @var mixed
*/
public $is_checked = null;
/**
* Constructor
*
* @since 2.2.2
*
* @param CMB2_Types $types Object for the field type.
* @param array $args Array of arguments for the type.
* @param mixed $is_checked Whether or not the field is checked, or default value.
*/
public function __construct( CMB2_Types $types, $args = array(), $is_checked = null ) {
parent::__construct( $types, $args );
$this->is_checked = $is_checked;
}
/**
* Render the field for the field type.
*
* @since 2.2.2
*
* @param array $args Array of arguments for the rendering.
* @return CMB2_Type_Base|string
*/
public function render( $args = array() ) {
$defaults = array(
'type' => 'checkbox',
'class' => 'cmb2-option cmb2-list',
'value' => 'on',
'desc' => '',
);
$meta_value = $this->field->escaped_value();
$is_checked = null === $this->is_checked
? ! empty( $meta_value )
: $this->is_checked;
if ( $is_checked ) {
$defaults['checked'] = 'checked';
}
$args = $this->parse_args( 'checkbox', $defaults );
return $this->rendered(
sprintf(
'%s <label for="%s">%s</label>',
parent::render( $args ),
$this->_id( '', false ),
$this->_desc()
)
);
}
}
CMB2_Type_Taxonomy_Radio_Hierarchical.php 0000666 00000001512 15175314405 0014423 0 ustar 00 <?php
/**
* CMB taxonomy_radio_hierarchical field type
*
* @since 2.2.5
*
* @category WordPress_Plugin
* @package CMB2
* @author CMB2 team
* @license GPL-2.0+
* @link https://cmb2.io
*/
class CMB2_Type_Taxonomy_Radio_Hierarchical extends CMB2_Type_Taxonomy_Radio {
/**
* Parent term ID when looping hierarchical terms.
*
* @var integer
*/
protected $parent = 0;
public function render() {
return $this->rendered(
$this->types->radio( array(
'options' => $this->get_term_options(),
), 'taxonomy_radio_hierarchical' )
);
}
protected function list_term_input( $term, $saved_term ) {
$options = parent::list_term_input( $term, $saved_term );
$children = $this->build_children( $term, $saved_term );
if ( ! empty( $children ) ) {
$options .= $children;
}
return $options;
}
}