| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- <?php
- /**
- * Paragraph text field.
- *
- * @since 1.0.0
- */
- class WPForms_Field_Textarea extends WPForms_Field {
- /**
- * Primary class constructor.
- *
- * @since 1.0.0
- */
- public function init() {
- // Define field type information.
- $this->name = esc_html__( 'Paragraph Text', 'wpforms-lite' );
- $this->type = 'textarea';
- $this->icon = 'fa-paragraph';
- $this->order = 50;
- add_action( 'wpforms_frontend_js', array( $this, 'frontend_js' ) );
- }
- /**
- * Get the value, that is used to prefill via dynamic or fallback population.
- * Based on field data and current properties.
- *
- * @since 1.6.4
- *
- * @param string $raw_value Value from a GET param, always a string.
- * @param string $input Represent a subfield inside the field. May be empty.
- * @param array $properties Field properties.
- * @param array $field Current field specific data.
- *
- * @return array Modified field properties.
- */
- protected function get_field_populated_single_property_value( $raw_value, $input, $properties, $field ) {
- if ( ! is_string( $raw_value ) ) {
- return $properties;
- }
- if (
- ! empty( $input ) &&
- isset( $properties['inputs'][ $input ] )
- ) {
- $properties['inputs'][ $input ]['attr']['value'] = wpforms_sanitize_textarea_field( wp_unslash( $raw_value ) );
- }
- return $properties;
- }
- /**
- * Field options panel inside the builder.
- *
- * @since 1.0.0
- *
- * @param array $field Field data and settings.
- */
- public function field_options( $field ) {
- /*
- * Basic field options.
- */
- // Options open markup.
- $this->field_option(
- 'basic-options',
- $field,
- array(
- 'markup' => 'open',
- )
- );
- // Label.
- $this->field_option( 'label', $field );
- // Description.
- $this->field_option( 'description', $field );
- // Required toggle.
- $this->field_option( 'required', $field );
- // Options close markup.
- $this->field_option(
- 'basic-options',
- $field,
- array(
- 'markup' => 'close',
- )
- );
- /*
- * Advanced field options.
- */
- // Options open markup.
- $args = array(
- 'markup' => 'open',
- );
- $this->field_option( 'advanced-options', $field, $args );
- // Size.
- $this->field_option( 'size', $field );
- // Placeholder.
- $this->field_option( 'placeholder', $field );
- // Limit length.
- $args = array(
- 'slug' => 'limit_enabled',
- 'content' => $this->field_element(
- 'toggle',
- $field,
- array(
- 'slug' => 'limit_enabled',
- 'value' => isset( $field['limit_enabled'] ) ? '1' : '0',
- 'desc' => esc_html__( 'Limit Length', 'wpforms-lite' ),
- 'tooltip' => esc_html__( 'Check this option to limit text length by characters or words count.', 'wpforms-lite' ),
- ),
- false
- ),
- );
- $this->field_element( 'row', $field, $args );
- $count = $this->field_element(
- 'text',
- $field,
- array(
- 'type' => 'number',
- 'slug' => 'limit_count',
- 'attrs' => array(
- 'min' => 1,
- 'step' => 1,
- 'pattern' => '[0-9]',
- ),
- 'value' => ! empty( $field['limit_count'] ) ? $field['limit_count'] : 1,
- ),
- false
- );
- $mode = $this->field_element(
- 'select',
- $field,
- array(
- 'slug' => 'limit_mode',
- 'value' => ! empty( $field['limit_mode'] ) ? esc_attr( $field['limit_mode'] ) : 'characters',
- 'options' => array(
- 'characters' => esc_html__( 'Characters', 'wpforms-lite' ),
- 'words' => esc_html__( 'Words', 'wpforms-lite' ),
- ),
- ),
- false
- );
- $args = array(
- 'slug' => 'limit_controls',
- 'class' => ! isset( $field['limit_enabled'] ) ? 'wpforms-hide' : '',
- 'content' => $count . $mode,
- );
- $this->field_element( 'row', $field, $args );
- // Default value.
- $this->field_option( 'default_value', $field );
- // Custom CSS classes.
- $this->field_option( 'css', $field );
- // Hide label.
- $this->field_option( 'label_hide', $field );
- // Options close markup.
- $this->field_option(
- 'advanced-options',
- $field,
- [
- 'markup' => 'close',
- ]
- );
- }
- /**
- * Field preview inside the builder.
- *
- * @since 1.0.0
- *
- * @param array $field Field data and settings.
- */
- public function field_preview( $field ) {
- // Label.
- $this->field_preview_option( 'label', $field );
- // Primary input.
- $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : '';
- echo '<textarea placeholder="' . esc_attr( $placeholder ) . '" class="primary-input" readonly></textarea>';
- // Description.
- $this->field_preview_option( 'description', $field );
- }
- /**
- * Field display on the form front-end.
- *
- * @since 1.0.0
- *
- * @param array $field Field data and settings.
- * @param array $deprecated Deprecated.
- * @param array $form_data Form data and settings.
- */
- public function field_display( $field, $deprecated, $form_data ) {
- // Define data.
- $primary = $field['properties']['inputs']['primary'];
- $value = '';
- if ( isset( $primary['attr']['value'] ) ) {
- $value = wpforms_sanitize_textarea_field( $primary['attr']['value'] );
- unset( $primary['attr']['value'] );
- }
- if ( isset( $field['limit_enabled'] ) ) {
- $limit_count = isset( $field['limit_count'] ) ? absint( $field['limit_count'] ) : 0;
- $limit_mode = isset( $field['limit_mode'] ) ? sanitize_key( $field['limit_mode'] ) : 'characters';
- $primary['data']['form-id'] = $form_data['id'];
- $primary['data']['field-id'] = $field['id'];
- if ( 'characters' === $limit_mode ) {
- $primary['class'][] = 'wpforms-limit-characters-enabled';
- $primary['attr']['maxlength'] = $limit_count;
- $primary['data']['text-limit'] = $limit_count;
- } else {
- $primary['class'][] = 'wpforms-limit-words-enabled';
- $primary['data']['text-limit'] = $limit_count;
- }
- }
- // Primary field.
- printf(
- '<textarea %s %s>%s</textarea>',
- wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ),
- $primary['required'], // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
- $value // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
- );
- }
- /**
- * Enqueue frontend limit option js.
- *
- * @since 1.5.6
- *
- * @param array $forms Forms on the current page.
- */
- public function frontend_js( $forms ) {
- // Get fields.
- $fields = array_map(
- function( $form ) {
- return empty( $form['fields'] ) ? array() : $form['fields'];
- },
- (array) $forms
- );
- // Make fields flat.
- $fields = array_reduce(
- $fields,
- function( $accumulator, $current ) {
- return array_merge( $accumulator, $current );
- },
- array()
- );
- // Leave only fields with limit.
- $fields = array_filter(
- $fields,
- function( $field ) {
- return $field['type'] === $this->type && isset( $field['limit_enabled'] );
- }
- );
- if ( count( $fields ) ) {
- $min = \wpforms_get_min_suffix();
- wp_enqueue_script( 'wpforms-text-limit', WPFORMS_PLUGIN_URL . "assets/js/text-limit{$min}.js", array(), WPFORMS_VERSION, true );
- }
- }
- /**
- * Format and sanitize field.
- *
- * @since 1.5.6
- *
- * @param int $field_id Field ID.
- * @param mixed $field_submit Field value that was submitted.
- * @param array $form_data Form data and settings.
- */
- public function format( $field_id, $field_submit, $form_data ) {
- $field = $form_data['fields'][ $field_id ];
- if ( is_array( $field_submit ) ) {
- $field_submit = implode( "\r\n", array_filter( $field_submit ) );
- }
- $name = ! empty( $field['label'] ) ? sanitize_text_field( $field['label'] ) : '';
- // Sanitize but keep line breaks.
- $value = wpforms_sanitize_textarea_field( $field_submit );
- wpforms()->process->fields[ $field_id ] = array(
- 'name' => $name,
- 'value' => $value,
- 'id' => absint( $field_id ),
- 'type' => $this->type,
- );
- }
- /**
- * Validate field on form submit.
- *
- * @since 1.6.2
- *
- * @param int $field_id Field ID.
- * @param mixed $field_submit Field value that was submitted.
- * @param array $form_data Form data and settings.
- */
- public function validate( $field_id, $field_submit, $form_data ) {
- parent::validate( $field_id, $field_submit, $form_data );
- if ( empty( $form_data['fields'][ $field_id ] ) || empty( $form_data['fields'][ $field_id ]['limit_enabled'] ) ) {
- return;
- }
- if ( is_array( $field_submit ) ) {
- $field_submit = implode( "\r\n", array_filter( $field_submit ) );
- }
- $field = $form_data['fields'][ $field_id ];
- $limit = absint( $field['limit_count'] );
- $mode = ! empty( $field['limit_mode'] ) ? sanitize_key( $field['limit_mode'] ) : 'characters';
- $value = wpforms_sanitize_textarea_field( $field_submit );
- if ( 'characters' === $mode ) {
- if ( mb_strlen( str_replace( "\r\n", "\n", $value ) ) > $limit ) {
- /* translators: %s - limit characters number. */
- wpforms()->process->errors[ $form_data['id'] ][ $field_id ] = sprintf( _n( 'Text can\'t exceed %d character.', 'Text can\'t exceed %d characters.', $limit, 'wpforms-lite' ), $limit );
- return;
- }
- } else {
- if ( wpforms_count_words( $value ) > $limit ) {
- /* translators: %s - limit words number. */
- wpforms()->process->errors[ $form_data['id'] ][ $field_id ] = sprintf( _n( 'Text can\'t exceed %d word.', 'Text can\'t exceed %d words.', $limit, 'wpforms-lite' ), $limit );
- return;
- }
- }
- }
- }
- new WPForms_Field_Textarea();
|