Dashboard
PHP:
8.4.22
OS:
Linux
User:
provencez
/
/
home
/
provencez
/
www
/
wp-content
/
plugins
/
flexa-block
/
build
/
blocks
/
data-table
📤 Upload
📝 New File
📁 New Folder
Close
Editing: render.php
<?php /** * Data Table block — server-side render. * * CSS is generated at save time by Data_Table_CSS and printed inline on the * front end. This file outputs a simple table: an optional header row of column * labels and one body row per data row, each cell aligned to its column and * escaped as plain text. The whole table sits in a horizontally scrollable * wrapper (Radix-style thin scrollbar) so a table wider than its max width — or * the viewport — scrolls sideways instead of overflowing. * Column labels and body cells are inline-editable on the front end: the label * span carries data-flexa-item (column index) and each text cell carries * data-flexa-cell (column index) inside a row stamped with data-flexa-item. * Text inherits the theme's typography unless the user overrode it. * * @package Flexa\Block * * @var array $attributes Block attributes. * @var string $content Save content (unused — dynamic block). * @var WP_Block $block Block instance. */ if ( ! defined( 'ABSPATH' ) ) { exit; } // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound -- $attributes provided by WP block API. use Flexa\Block\HTML_Helpers; $block_id = $attributes['blockId'] ?? ''; $anchor = $attributes['anchor'] ?? ''; $html_tag = HTML_Helpers::get_html_tag( $attributes, 'div' ); $columns = $attributes['columns'] ?? []; $rows = $attributes['rows'] ?? []; if ( ! is_array( $columns ) ) { $columns = []; } if ( ! is_array( $rows ) ) { $rows = []; } // Preserve original column keys ($col_source_keys) so the inline editor maps a // rendered column back to its exact `columns` entry after non-array ones drop. $columns_filtered = array_filter( $columns, 'is_array' ); $col_source_keys = array_keys( $columns_filtered ); $columns = array_values( $columns_filtered ); if ( empty( $columns ) ) { return; } $show_header = false !== ( $attributes['showHeader'] ?? true ); $col_count = count( $columns ); /** * Sanitize a per-column text alignment to one of the three allowed values. * * @param mixed $align Raw alignment. * @return string One of left|center|right. */ $align_of = static function ( $align ): string { return in_array( $align, [ 'left', 'center', 'right' ], true ) ? $align : 'left'; }; // --- Header row: one <th> per column, its label inline-editable. --- $head_html = ''; if ( $show_header ) { $cells = ''; foreach ( $columns as $ci => $col ) { $align = $align_of( $col['align'] ?? 'left' ); $col_index = $col_source_keys[ $ci ] ?? $ci; $cells .= '<th class="flexa-data-table__th" style="text-align:' . esc_attr( $align ) . '">' . '<span class="flexa-data-table__col-label"' . \Flexa\Block\Inline_Editor::item_attr( (int) $col_index ) . '>' . esc_html( (string) ( $col['label'] ?? '' ) ) . '</span></th>'; } $head_html = '<thead class="flexa-data-table__thead"><tr class="flexa-data-table__row">' . $cells . '</tr></thead>'; } // --- Body rows: one <td> per column, each text cell inline-editable. --- $body_html = ''; foreach ( $rows as $r => $row ) { if ( ! is_array( $row ) ) { continue; } $values = isset( $row['values'] ) && is_array( $row['values'] ) ? array_values( $row['values'] ) : []; $cells = ''; for ( $c = 0; $c < $col_count; $c++ ) { $align = $align_of( $columns[ $c ]['align'] ?? 'left' ); $cells .= '<td class="flexa-data-table__cell" style="text-align:' . esc_attr( $align ) . '"' . \Flexa\Block\Inline_Editor::cell_attr( $c ) . '>' . esc_html( isset( $values[ $c ] ) ? (string) $values[ $c ] : '' ) . '</td>'; } $body_html .= '<tr class="flexa-data-table__row"' . \Flexa\Block\Inline_Editor::item_attr( (int) $r ) . '>' . $cells . '</tr>'; } // --- Wrapper classes + attributes. --- $classes = [ 'flexa-data-table', ]; if ( '' !== $block_id ) { $classes[] = 'flexa-data-table-' . sanitize_html_class( $block_id ); } $classes = HTML_Helpers::build_wrapper_classes( $classes, $attributes ); $wrapper_args = [ 'class' => implode( ' ', $classes ) ]; if ( $anchor ) { $wrapper_args['id'] = sanitize_html_class( $anchor ); } $wrapper_attributes = get_block_wrapper_attributes( $wrapper_args ); $data_attrs = HTML_Helpers::build_data_attrs( $attributes ); // Lazy background marker. $background = $attributes['background'] ?? []; $is_lazy_bg = ! empty( $background['lazyLoad'] ) && 'image' === ( $background['type'] ?? 'none' ) && '' !== ( $background['image']['url'] ?? '' ); $lazy_marker = $is_lazy_bg ? ' data-flexa-lazy-bg' : ''; printf( '<%1$s %2$s%3$s%4$s><div class="flexa-data-table__scroll"><table class="flexa-data-table__table">%5$s<tbody class="flexa-data-table__tbody">%6$s</tbody></table></div></%1$s>', esc_html( $html_tag ), $wrapper_attributes, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- built via get_block_wrapper_attributes. $data_attrs, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- keys sanitized, values escaped in helper. $lazy_marker, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- static literal. $head_html, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- labels esc_html'd, align esc_attr'd. $body_html // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- cell text esc_html'd, align esc_attr'd. );
Save
Cancel