File "class-table.php"

Full path: /home/dora/public_html/wp-content/plugins/wp-grid-builder/includes/settings/fields/class-table.php
File size: 4.86 KB
MIME-type: --
Charset: utf-8

<?php
/**
 * Repeater field
 *
 * @package   WP Grid Builder
 * @author    Loïc Blascos
 * @copyright 2019-2022 Loïc Blascos
 */

namespace WP_Grid_Builder\Includes\Settings\Fields;

use WP_Grid_Builder\Includes\Settings\Settings;

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Settings API Field
 *
 * @class WP_Grid_Builder\Includes\Settings\Fields\Table
 * @since 1.0.0
 * @see WP_Grid_Builder\Includes\Settings\Field
 */
class Table extends Field {

	/**
	 * Render HTML field
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $args Holds field parameters.
	 */
	public function render( $args ) {

		if ( empty( $args['fields'] ) ) {
			return;
		}

		echo '<div class="wpgb-table-wrapper">';
		echo '<table class="wpgb-table ' . sanitize_html_class( $args['class'] ) . '">';
		$this->do_header( $args );
		$this->do_body( $args );
		echo '</table>';
		echo '</div>';

	}

	/**
	 * Render table header
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $args Holds field parameters.
	 */
	public function do_header( $args ) {

		echo '<thead><tr>';
		echo '<td data-colname="label"></td>';

		foreach ( $args['fields'] as $field ) {

			echo '<td data-colname="' . esc_attr( $field['id'] ) . '">';
			echo isset( $field['label'] ) ? esc_html( $field['label'] ) : '';
			echo '</td>';

		}

		echo '</tr></thead>';

	}

	/**
	 * Render table body
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $args Holds field parameters.
	 */
	public function do_body( $args ) {

		$cell_nb = count( $args['rows'] );

		echo '<tbody>';

		for ( $i = 0; $i < $cell_nb; $i++ ) {

			echo '<tr>';

			echo '<td data-colname="label">';

			if ( ! empty( $args['rows'][ $i ]['label'] ) ) {
				echo esc_html( $args['rows'][ $i ]['label'] );
			}

			if ( ! empty( $args['rows'][ $i ]['icon'] ) ) {
				echo '<svg><use xlink:href="' . esc_url( $args['rows'][ $i ]['icon'] ) . '"></use></svg>';
			}

			echo '</td>';

			$this->do_cell( $args, $i );
			echo '</tr>';

		}

		echo '</tbody>';

	}

	/**
	 * Render table cell
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array   $args  Holds field parameters.
	 * @param integer $index Table row index.
	 */
	public function do_cell( $args, $index ) {

		$fields = $this->get_table_fields( $args, $index );

		foreach ( $fields as $field ) {

			echo '<td data-colname="' . esc_attr( $field['id'] ) . '">';
			Settings::get_instance()->do_field( $field );
			echo '</td>';

		}

	}

	/**
	 * Get table fields
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array   $args  Holds fields parameters.
	 * @param integer $index Table row index.
	 */
	public function get_table_fields( $args, $index ) {

		return array_map(
			function( $field ) use ( $args, $index ) {

				$field['label'] = '';
				$field['value'] = $this->get_field_value( $args, $field, $index );
				$field['name']  = $this->get_field_name( $args, $field, $index );

				if ( ! empty( $field['fields'] ) ) {

					$field_id = $field['id'];
					$field['id'] = rtrim( str_replace( 'wpgb[', '', $field['name'] ), ']' );
					$field['fields'] = $this->get_table_fields( $field, '' );
					$field['id'] = $field_id;

				}

				return $field;

			},
			$args['fields']
		);

	}

	/**
	 * Render table cell
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array   $args  Holds fields parameters.
	 * @param array   $field Holds field parameters.
	 * @param integer $index Table row index.
	 */
	public function get_field_name( $args, $field, $index ) {

		$name = array_filter(
			[ $args['id'], $index, $field['id'] ],
			function( $val ) {
				return '' !== $val;
			}
		);

		$name = implode( '][', $name );
		$name = 'wpgb[' . $name . ']';

		return $name;

	}

	/**
	 * Render table cell
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array   $args  Holds fields parameters.
	 * @param array   $field Holds field parameters.
	 * @param integer $index Table row index.
	 */
	public function get_field_value( $args, $field, $index ) {

		if ( ! isset( $args['value'][ $index ][ $field['id'] ] ) ) {
			return ! empty( $field['default'] ) ? $field['default'] : '';
		}

		return $args['value'][ $index ][ $field['id'] ];

	}

	/**
	 * Normalize field parameters
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $field Holds field parameters.
	 * @return array
	 */
	public function normalize( $field ) {

		return wp_parse_args(
			$field,
			[
				'rows'    => [
					[
						'label' => '',
						'icon'  => '',
					],
				],
				'class'   => '',
				'fields'  => [],
				'default' => [],
			]
		);

	}

	/**
	 * Sanitize field value
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param mixed $val  Fields values.
	 * @param array $args Holds field parameters.
	 * @return array
	 */
	public function sanitize( $val, $args = [] ) {

		// We do nothing because we recursively sanitize subfields.
		// Subfields were already sanitized at this stage.
		return $val;

	}
}