CMB2 Documentation
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  • Hooks
  • Download Docs
  • Github

Packages

  • CMB2
  • Demo
    • CMB2
  • None
  • Tests
    • CMB2

Classes

  • CMB2
  • CMB2_Ajax
  • CMB2_Base
  • CMB2_Bootstrap_2101
  • CMB2_Boxes
  • CMB2_Display_Checkbox
  • CMB2_Display_Colorpicker
  • CMB2_Display_File
  • CMB2_Display_File_List
  • CMB2_Display_Multicheck
  • CMB2_Display_oEmbed
  • CMB2_Display_Select
  • CMB2_Display_Taxonomy_Multicheck
  • CMB2_Display_Taxonomy_Radio
  • CMB2_Display_Text_Date
  • CMB2_Display_Text_Date_Timezone
  • CMB2_Display_Text_Money
  • CMB2_Display_Text_Time
  • CMB2_Display_Text_Url
  • CMB2_Display_Textarea
  • CMB2_Display_Textarea_Code
  • CMB2_Field
  • CMB2_Field_Display
  • CMB2_Hookup
  • CMB2_Hookup_Base
  • CMB2_Integration_Box
  • CMB2_JS
  • CMB2_Option
  • CMB2_Options
  • CMB2_Options_Hookup
  • CMB2_REST
  • CMB2_REST_Controller
  • CMB2_REST_Controller_Boxes
  • CMB2_REST_Controller_Fields
  • CMB2_Sanitize
  • CMB2_Show_Filters
  • CMB2_Type_Base
  • CMB2_Type_Checkbox
  • CMB2_Type_Colorpicker
  • CMB2_Type_Counter_Base
  • CMB2_Type_File
  • CMB2_Type_File_Base
  • CMB2_Type_File_List
  • CMB2_Type_Multi_Base
  • CMB2_Type_Multicheck
  • CMB2_Type_Oembed
  • CMB2_Type_Picker_Base
  • CMB2_Type_Radio
  • CMB2_Type_Select
  • CMB2_Type_Select_Timezone
  • CMB2_Type_Taxonomy_Base
  • CMB2_Type_Taxonomy_Multicheck
  • CMB2_Type_Taxonomy_Multicheck_Hierarchical
  • CMB2_Type_Taxonomy_Radio
  • CMB2_Type_Taxonomy_Radio_Hierarchical
  • CMB2_Type_Taxonomy_Select
  • CMB2_Type_Taxonomy_Select_Hierarchical
  • CMB2_Type_Text
  • CMB2_Type_Text_Date
  • CMB2_Type_Text_Datetime_Timestamp
  • CMB2_Type_Text_Datetime_Timestamp_Timezone
  • CMB2_Type_Text_Time
  • CMB2_Type_Textarea
  • CMB2_Type_Textarea_Code
  • CMB2_Type_Title
  • CMB2_Type_Wysiwyg
  • CMB2_Types
  • CMB2_Utils

Hooks

  • Hook Reference
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 
<?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 Documentation API documentation generated by ApiGen