<?php /** * Suppress "error - 0 - No summary was found for this file" on phpdoc generation * * @package WPDataAccess\Data_Publisher */ namespace WPDataAccess\Data_Publisher; use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Exist; use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Lists; use WPDataAccess\Data_Tables\WPDA_Data_Tables; use WPDataAccess\List_Table\WPDA_List_Table; use WPDataAccess\Plugin_Table_Models\WPDA_Publisher_Model; use WPDataAccess\Utilities\WPDA_Message_Box; use WPDataAccess\WPDA; /** * Class WPDA_Publisher_List_Table extends WPDA_List_Table * * List table to support Data Tables. * * @author Peter Schulz * @since 2.0.15 */ class WPDA_Publisher_List_Table extends WPDA_List_Table { public function __construct( $args = array() ) { $args['column_headers'] = self::column_headers_labels(); $args['title'] = 'Data Tables'; $args['subtitle'] = ''; parent::__construct( $args ); WPDA_Data_Tables::enqueue_styles_and_script(); } public function get_columns() { if ( is_array( $this->wpda_cached_columns ) ) { return $this->wpda_cached_columns; } $columns = parent::get_columns(); // Remove data source column. unset($columns['pub_data_source']); // Add data source column after schema name. $columns = WPDA::array_insert_after( $columns, 'pub_schema_name', array( 'pub_data_source' => __( 'Data Source', 'wp-data-access' ), ) ); return $columns; } /** * Overwrite method column_default * * Column pub_responsive should return 'Flat' or 'Responsive'. */ public function column_default( $item, $column_name ) { if ( 'pub_id' === $column_name ) { // Validate schema, table and column names $warning = WPDA::validate_names( $item['pub_schema_name'], $item['pub_table_name'] ); if ( '' !== $warning ) { return $item['pub_id'] . $warning . substr( parent::column_default( $item, $column_name ), strlen( $item['pub_id'] ) ); } } if ( 'pub_schema_name' === $column_name ) { if ( 'CPT' === $item['pub_data_source'] ) { return ''; } global $wpdb; if ( $wpdb->dbname === $item[$column_name] ) { return "WordPress database ({$item[$column_name]})"; } } if ( 'pub_data_source' === $column_name ) { switch ( $item[$column_name] ) { case 'Query': // Show SQL query. return '<div>' . 'Custom query ' . '<i class="fas fa-eye wpda_tooltip_cq" title="' . $this->render_column_content( $item, 'pub_query', false ) . '"></i>' . '</div>'; case 'CPT': // Show CPT query. return 'Custom post type: ' . $this->render_column_content( $item, 'pub_cpt' ); default: // Show database table. return $this->render_column_content( $item, 'pub_table_name' ); } } if ( 'pub_table_name' === $column_name ) { if ( 'Query' === $item['pub_data_source'] ) { return ''; } } if ( 'pub_responsive' === $column_name ) { if ( 'Yes' === $item[$column_name] ) { return 'Responsive'; } else { return 'Flat'; } } if ( 'pub_table_options_searching' === $column_name || 'pub_table_options_ordering' === $column_name || 'pub_table_options_paging' === $column_name || 'pub_table_options_serverside' === $column_name ) { if ( 'on' === $item[$column_name] ) { return 'Yes'; } else { return 'No'; } } return parent::column_default( $item, $column_name ); } /** * Overwrites method column_default_add_action * * Add a link to show the shortcode of a data table. * * @param array $item * @param string $column_name * @param array $actions */ public function column_default_add_action( $item, $column_name, &$actions ) { parent::column_default_add_action( $item, $column_name, $actions ); // Add copy data table to actions $wp_nonce_action = "wpda-copy-{$this->table_name}"; $wp_nonce = wp_create_nonce( $wp_nonce_action ); $form_id = '_' . (self::$list_number - 1); $esc_attr = 'esc_attr'; $input_fields = $this->get_key_input_fields( $item ); $page_field = $this->page_number_item; $copy_form = <<<EOT \t\t\t\t<form id='copy_form{$esc_attr( $form_id )}' method='post' \t\t\t\t\t action='?page={$esc_attr( $this->page )}' \t\t\t\t> \t\t\t\t\t{$input_fields} \t\t\t\t\t<input type='hidden' name='table_name' value='{$esc_attr( $this->table_name )}'> \t\t\t\t\t<input type='hidden' name='action' value='copy' /> \t\t\t\t\t<input type='hidden' name='_wpnonce' value='{$esc_attr( $wp_nonce )}'> \t\t\t\t\t{$page_field} \t\t\t\t</form> EOT; ?> <script type='text/javascript'> jQuery("#wpda_invisible_container").append("<?php echo str_replace( array("\n", "\r"), '', $copy_form ); // phpcs:ignore WordPress.Security.EscapeOutput ?>"); </script> <?php $copy_warning = __( "Copy table options set?\\n\\'Cancel\\' to stop, \\'OK\\' to copy.", 'wp-data-access' ); $actions['copy'] = sprintf( '<a href="javascript:void(0)" title="%s" class="edit wpda_tooltip" onclick="if (confirm(\'%s\')) jQuery(\'#%s\').submit()"> <span style="white-space: nowrap"> <i class="fas fa-copy wpda_icon_on_button"></i> %s </span> </a> ', __( 'Copy: new table name = old table name_ + n', 'wp-data-access' ), $copy_warning, "copy_form{$form_id}", __( 'Copy', 'wp-data-access' ) ); // Show Data Table shortcode directly from Data Tables main page $shortcode_enabled = 'on' === WPDA::get_option( WPDA::OPTION_PLUGIN_WPDATAACCESS_POST ) && 'on' === WPDA::get_option( WPDA::OPTION_PLUGIN_WPDATAACCESS_PAGE ); ?> <div id="wpda_publication_<?php echo esc_attr( $item['pub_id'] ); ?>" title="<?php echo __( 'Shortcode', 'wp-data-access' ); ?>" style="display:none" > <p class="wpda_shortcode_content"> Copy the shortcode below into your post or page to make this data table available on your website. </p> <p class="wpda_shortcode_text"> <strong> [wpdataaccess pub_id="<?php echo esc_attr( $item['pub_id'] ); ?>"] </strong> </p> <p class="wpda_shortcode_buttons"> <button class="button wpda_shortcode_clipboard wpda_shortcode_button" type="button" data-clipboard-text='[wpdataaccess pub_id="<?php echo esc_attr( $item['pub_id'] ); ?>"]' onclick="jQuery.notify('<?php echo __( 'Shortcode successfully copied to clipboard!' ); ?>','info')" > <?php echo __( 'Copy', 'wp-data-access' ); ?> </button> <button class="button button-primary wpda_shortcode_button" type="button" onclick="jQuery('.ui-dialog-content').dialog('close')" > <?php echo __( 'Close', 'wp-data-access' ); ?> </button> </p> <?php if ( !$shortcode_enabled ) { ?> <p> Shortcode wpdataaccess is not enabled for all output types. <a href="<?php echo admin_url( 'options-general.php' ); // phpcs:ignore WordPress.Security.EscapeOutput ?>?page=wpdataaccess" class="wpda_shortcode_link">&raquo; Manage settings</a> </p> <?php } ?> </div> <?php $actions['shortcode'] = sprintf( '<a href="javascript:void(0)" class="view wpda_tooltip" title="%s" onclick="jQuery(\'#wpda_publication_%s\').dialog()" <span style="white-space:nowrap"> <i class="fas fa-code wpda_icon_on_button"></i> %s </span> </a> ', __( 'Get shortcode', 'wp-data-access' ), esc_attr( $item['pub_id'] ), __( 'Shortcode', 'wp-data-access' ) ); $actions['test'] = sprintf( '<a href="javascript:void(0)" class="view wpda_tooltip" title="%s" onclick="test_publication(\'%s\', \'%s\')" <span style="white-space:nowrap"> <i class="fas fa-bug wpda_icon_on_button"></i> %s </span> </a> ', __( 'Test', 'wp-data-access' ), esc_attr( wp_create_nonce( "wpda-publication-{$item['pub_id']}" ) ), esc_attr( $item['pub_id'] ), __( 'Test', 'wp-data-access' ) ); } public function process_bulk_action() { if ( 'copy' === $this->current_action() ) { $wp_nonce_action = "wpda-copy-{$this->table_name}"; $wp_nonce = ( isset( $_REQUEST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['_wpnonce'] ) ) : '' ); // input var okay. if ( !wp_verify_nonce( $wp_nonce, $wp_nonce_action ) ) { die( __( 'ERROR: Not authorized', 'wp-data-access' ) ); } if ( isset( $_REQUEST['pub_id'] ) ) { $pub_id = sanitize_text_field( wp_unslash( $_REQUEST['pub_id'] ) ); // input var okay. } $unique_pu_name = $this->get_unique_pub_name( $pub_id ); global $wpdb; $pub_raw = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM `%1s` WHERE pub_id = %d', // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders array(WPDA::remove_backticks( $this->table_name ), $pub_id) ), 'ARRAY_A' ); if ( $wpdb->num_rows > 0 ) { $pub_raw[0]['pub_name'] = $unique_pu_name; unset($pub_raw[0]['pub_id']); $rows_inserted = $wpdb->insert( $this->table_name, $pub_raw[0] ); switch ( $rows_inserted ) { case 0: $msg = new WPDA_Message_Box(array( 'message_text' => __( 'Could not copy data table [source not found]', 'wp-data-access' ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); break; case 1: $msg = new WPDA_Message_Box(array( 'message_text' => __( 'Data table copied', 'wp-data-access' ), )); $msg->box(); break; default: $msg = new WPDA_Message_Box(array( 'message_text' => __( 'Could not copy data table [too many rows]', 'wp-data-access' ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); } } } else { parent::process_bulk_action(); } } protected function get_unique_pub_name( $pub_id ) { global $wpdb; $db_pub_name = $wpdb->get_results( $wpdb->prepare( 'select pub_name from `%1s` where pub_id = %d', // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders array(WPDA::remove_backticks( WPDA_Publisher_Model::get_base_table_name() ), $pub_id) ), 'ARRAY_A' ); if ( $wpdb->num_rows !== 1 ) { wp_die( __( 'ERROR: Data table not found', 'wp-data-access' ) ); } $i = 2; $pub_name = $db_pub_name[0]['pub_name']; $unique_pub_name = "{$pub_name}_{$i}"; $wpdb->get_results( $wpdb->prepare( "select 'x' from `%1s` where pub_name = %s", // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders array(WPDA::remove_backticks( WPDA_Publisher_Model::get_base_table_name() ), $unique_pub_name) ) ); while ( $wpdb->num_rows > 0 ) { // Search until a free options set is found $i++; $unique_pub_name = "{$pub_name}_{$i}"; $wpdb->get_results( $wpdb->prepare( "select 'x' from `%1s` where pub_name = %s", // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders array(WPDA::remove_backticks( WPDA_Publisher_Model::get_base_table_name() ), $unique_pub_name) ) ); } return $unique_pub_name; } public static function column_headers_labels() { return array( 'pub_id' => __( 'ID', 'wp-data-access' ), 'pub_name' => __( 'Name', 'wp-data-access' ), 'pub_schema_name' => __( 'Database', 'wp-data-access' ), 'pub_data_source' => __( 'Data Source', 'wp-data-access' ), 'pub_table_name' => __( 'Table/View Name', 'wp-data-access' ), 'pub_column_names' => __( 'Column Names', 'wp-data-access' ), 'pub_format' => __( 'Format', 'wp-data-access' ), 'pub_query' => __( 'Query', 'wp-data-access' ), 'pub_sort_icons' => __( 'Sort Icons', 'wp-data-access' ), 'pub_styles' => __( 'Styling', 'wp-data-access' ), 'pub_style_premium' => __( 'Enable Premium Styling', 'wp-data-access' ), 'pub_style_user' => __( 'Custom Style', 'wp-data-access' ), 'pub_style_color' => __( 'Style Color', 'wp-data-access' ), 'pub_style_space' => __( 'Style Spacing', 'wp-data-access' ), 'pub_style_corner' => __( 'Style Corner', 'wp-data-access' ), 'pub_style_modal_width' => __( 'Modal Width', 'wp-data-access' ), 'pub_responsive' => __( 'Output', 'wp-data-access' ), 'pub_table_options_searching' => __( 'Searching?', 'wp-data-access' ), 'pub_table_options_ordering' => __( 'Ordering?', 'wp-data-access' ), 'pub_table_options_paging' => __( 'Paging?', 'wp-data-access' ), 'pub_table_options_serverside' => __( 'Server Side Processing?', 'wp-data-access' ), 'pub_table_options_nl2br' => __( 'NL > BR', 'wp-data-access' ), 'pub_table_options_advanced' => __( 'Advanced Options', 'wp-data-access' ), 'pub_default_where' => __( 'Default Where', 'wp-data-access' ), 'pub_default_orderby' => __( 'Default Order By', 'wp-data-access' ), 'pub_responsive_popup_title' => __( 'Popup Title', 'wp-data-access' ), 'pub_responsive_cols' => __( 'Responsive Cols', 'wp-data-access' ), 'pub_responsive_type' => __( 'Responsive Type', 'wp-data-access' ), 'pub_responsive_modal_hyperlinks' => __( 'Modal Hyperlinks', 'wp-data-access' ), 'pub_responsive_icon' => __( 'Responsive Icon?', 'wp-data-access' ), 'pub_flat_scrollx' => __( 'Horizontal Scrollbar', 'wp-data-access' ), 'pub_extentions' => __( 'Extensions', 'wp-data-access' ), 'pub_cpt' => __( 'Custom post type', 'wp-data-access' ), 'pub_cpt_fields' => __( 'Custom fields', 'wp-data-access' ), 'pub_cpt_query' => __( 'CPT query', 'wp-data-access' ), 'pub_cpt_format' => __( 'Field labels', 'wp-data-access' ), ); } // Overwrite method public function show() { parent::show(); WPDA::shortcode_popup(); ?> <script type="application/javascript"> function test_publication(wpnonce, pub_id) { if (jQuery('#data_publisher_test_container_' + pub_id).length>0) { jQuery('#data_publisher_test_container_' + pub_id).show(); } else { jQuery.ajax({ type: "POST", url: "<?php echo admin_url( 'admin-ajax.php?action=wpda_test_publication' ); // phpcs:ignore WordPress.Security.EscapeOutput ?>", data: { wpnonce: wpnonce, pub_id: pub_id } }).done( function (html) { jQuery("body").append(html); jQuery('#data_publisher_test_container_' + pub_id).show(); } ); } } jQuery(function() { jQuery(".wpda_tooltip_cq").tooltip({ tooltipClass: "wpda_tooltip_cq wpda_tooltip_dashboard" }); }); </script> <style> table.wp-list-table td.pub_data_source div { overflow-x: hidden; max-height: 70px; overflow-y: auto; } .row-actions { white-space: nowrap; } .wpda_tooltip_cq { max-width: max-content; } </style> <?php } }