# tableberg/0.3.2/includes/Blocks/Table.php

Tableberg – Simple Gutenberg Table Block, version 0.3.2. 228 lines.

- Page: https://pluginprobe.com/plugins/tableberg/0.3.2/code/includes/Blocks/Table.php
- Raw: https://pluginprobe.com/plugins/tableberg/0.3.2/raw/includes/Blocks/Table.php
- Modified: 2024-02-17T06:46:06+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/tableberg/0.3.2/code/includes/Blocks/Table.php#L10-L20`.

```php
<?php
/**
 * Table Block
 *
 * @package Tableberg
 */

namespace Tableberg\Blocks;

use Tableberg;
use Tableberg\Utils\Utils;
use Tableberg\Utils\HtmlUtils;
use WP_Block;

/**
 * Handle the block registration on server side and rendering.
 */
class Table
{

	public static $lastRow = null;
	public static $lastRows = 0;

	/**
	 * Constructor
	 *
	 * @return void
	 */
	public function __construct()
	{
		add_action('init', array($this, 'block_registration'));
	}

	/**
	 * Get block styles.
	 *
	 * @param array $attributes - block attributes.
	 * @return string Generated CSS styles.
	 */
	public static function get_styles($attributes)
	{
		$even_row_bg_color = Utils::get_background_color($attributes, 'evenRowBackgroundColor', 'evenRowBackgroundGradient');
		$odd_row_bg_color = Utils::get_background_color($attributes, 'oddRowBackgroundColor', 'oddRowBackgroundGradient');

		$global_font_style = Utils::get_global_style_variables_css($attributes);

		$cell_padding = Utils::get_spacing_css($attributes['cellPadding']);
		$cellSpacing = $attributes['cellSpacing'] ?? [];
		$table_spacing = Utils::get_spacing_css($cellSpacing);


		$table_border_variables = Utils::get_border_variables_css($attributes['tableBorder'], 'table');
		$inner_border_variables = $attributes['enableInnerBorder'] ? Utils::get_border_variables_css($attributes['innerBorder'], 'inner') : array();

		$styles = array(
			'--tableber-table-width' => $attributes['tableWidth'],
			'--tableberg-even-row-bg-color' => $even_row_bg_color,
			'--tableberg-odd-row-bg-color' => $odd_row_bg_color,
			'--tableberg-cell-padding-top' => $cell_padding['top'] ?? '',
			'--tableberg-cell-padding-right' => $cell_padding['right'] ?? '',
			'--tableberg-cell-padding-bottom' => $cell_padding['bottom'] ?? '',
			'--tableberg-cell-padding-left' => $cell_padding['left'] ?? '',
			'--tableberg-cell-spacing-top' => $table_spacing['top'] ?? '',
			'--tableberg-cell-spacing-left' => $table_spacing['left'] ?? '',
		) + $table_border_variables + $inner_border_variables + $global_font_style;

		foreach (['top', 'left'] as $k) {
			if (isset($cellSpacing[$k]) && $cellSpacing[$k] !== '0') {
				$styles['--tableberg-border-collapse'] = 'separate';
			}
		}

		return Utils::generate_css_string($styles);
	}

	/**
	 * Class if styling is applied.
	 *
	 * @param array $attributes The block attributes.
	 * @return array CSS classes based on attributes.
	 */
	public function get_style_class($attributes)
	{
		$table_width = $attributes['tableWidth'];
		$table_alignment = $attributes['tableAlignment'];
		$enable_inner_border = $attributes['enableInnerBorder'];
		$classes = array();
		if ($enable_inner_border) {
			$classes[] = 'has-inner-border';
		}
		$is_value_empty = function ($value) {
			return (
				is_null($value) ||
				false === $value ||
				trim($value) === '' ||
				trim($value) === 'undefined undefined undefined' ||
				empty($value)
			);
		};

		if (!$is_value_empty($table_width)) {
			$classes[] = 'has-table-width';
		}
		if (!$is_value_empty($table_alignment)) {
			$classes[] = 'justify-table-' . $table_alignment;
		}

		return $classes;
	}



	private static function setRowColSizes($content, $heights, $widths)
	{
		$lastIdx = 0;
		foreach ($heights as $height) {
			$idx = strpos($content, '<tr', $lastIdx);
			if ($height) {
				$content = HtmlUtils::append_attr_value($content, 'tr', "height:{$height} !important;", 'style', $idx);
			}
			$lastIdx = $idx + 1;
		}
		$colgroup = '<colgroup>';
		foreach ($widths as $w) {
			$colgroup .= "<col width=\"$w\"/>";
		}
		$colgroup .= '</colgroup>';
		$content = HtmlUtils::insert_inside_tag($content, 'table', $colgroup);
		return $content;
	}

	private function even_odd_rows($attributes, $content)
	{
		$even_color = Utils::get_background_color($attributes, 'evenRowBackgroundColor', 'evenRowBackgroundGradient');
		$odd_color = Utils::get_background_color($attributes, 'oddRowBackgroundColor', 'oddRowBackgroundGradient');

		if (!$even_color && !$odd_color) {
			return $content;
		}

		$even_color = "background: {$even_color} !important;";
		$odd_color = "background: {$odd_color} !important;";

		$cursor = 0;
		$i = 1;
		$end = $attributes['rows'];
		if ($attributes['enableTableHeader']) {
			$i = 2;
			$content = HtmlUtils::append_attr_value($content, 'tr', '', 'style', 0, $cursor);
		}
		if ($attributes['enableTableFooter']) {
			$end -= 1;
		}


		for (; $i <= $end; $i++) {
			$content = HtmlUtils::append_attr_value($content, 'tr', $i % 2 ? $odd_color : $even_color, 'style', $cursor + 1, $cursor);
		}

		return $content;
	}

	/**
	 * Renders the custom table block on the server.
	 *
	 * @param array    $attributes The block attributes.
	 * @param string   $content    The block content.
	 * @param WP_Block $block      The block object.
	 * @return string Returns the HTML content for the custom table block.
	 */
	public function render_tableberg_table_block($attributes, $content, $block)
	{
		$class_names = $this->get_style_class($attributes);
		$style = $this->get_styles($attributes);
		$wrapper_attributes = get_block_wrapper_attributes(
			array(
				'class' => trim(join(' ', $class_names)),
				'style' => $style,
			)
		);

		$content = HtmlUtils::insert_inside_tag($content, 'table', '<tbody>');
		$content = HtmlUtils::replace_attrs_of_tag($content, 'table', $wrapper_attributes);
		$content = HtmlUtils::replace_closing_tag($content, 'table', '</tr></tbody></table>');

		if ($attributes['enableTableHeader']) {
			$content = HtmlUtils::append_attr_value($content, 'tr', ' tableberg-header', 'class');
			$bg_color = Utils::get_background_color($attributes, 'headerBackgroundColor', 'headerBackgroundGradient');
			if ($bg_color) {
				$content = HtmlUtils::append_attr_value($content, 'tr', "background: {$bg_color} !important;", 'style');
			}

		}
		if ($attributes['enableTableFooter']) {
			$footer_idx = strrpos($content, '<tr');
			$content = HtmlUtils::append_attr_value($content, 'tr', ' tableberg-footer', 'class', $footer_idx);
			$bg_color = Utils::get_background_color($attributes, 'footerBackgroundColor', 'footerBackgroundGradient');
			if ($bg_color) {
				$content = HtmlUtils::append_attr_value($content, 'tr', "background: {$bg_color} !important;", 'style', $footer_idx);
			}
		}

		$content = self::setRowColSizes($content, $attributes['rowHeights'], $attributes['colWidths']);
		$content = self::even_odd_rows($attributes, $content);

		self::$lastRow = null;
		return $content;
	}


	/**
	 * Register the block.
	 */
	public function block_registration()
	{
		$defaults = new \Tableberg\Defaults();
		$tableberg_assets = new \Tableberg\Assets();
		$tableberg_assets->register_blocks_assets();
		register_block_type(
			TABLEBERG_DIR_PATH . 'build/block.json',
			array(
				'attributes' => $defaults->get_default_attributes('tableberg/table'),
				'render_callback' => array($this, 'render_tableberg_table_block'),
			)
		);
	}
}

```
