File "WPDP_Child_List_Table_Selection.php"
Full Path: /home/vantageo/public_html/cache/cache/cache/cache/cache/.wp-cli/wp-content/plugins/wp-data-access/WPDataProjects/Parent_Child/WPDP_Child_List_Table_Selection.php
File size: 8.16 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Suppress "error - 0 - No summary was found for this file" on phpdoc generation
*
* @package WPDataProjects\Parent_Child
*/
namespace WPDataProjects\Parent_Child {
use WPDataAccess\Connection\WPDADB;
use WPDataAccess\Utilities\WPDA_Message_Box;
/**
* Class WPDP_Child_List_Table_Selection extends WPDP_Child_List_Table
*
* Provides a list table with lookup selection functionality. Rows can be selected from the list to be added to a
* relationship. This list table shows only rows that do not (yet) belong to the relationship.
*
* @see WPDP_Child_List_Table
*
* @author Peter Schulz
* @since 2.0.0
*/
class WPDP_Child_List_Table_Selection extends WPDP_Child_List_Table {
/**
* Overwrites WPDP_Child_List_Table_Selection constructor
*
* Turns off all standard links (all links are overwritten in this class).
*
* @param array $args
*/
public function __construct( $args = array() ) {
$this->page_number_item_name = 'child_selection_page_number';
$this->search_item_name = 'slov';
parent::__construct( $args );
$this->bulk_actions_enabled = true;
$this->show_view_link = 'off';
$this->allow_insert = 'off';
$this->allow_update = 'off';
$this->allow_delete = 'off';
$this->where_in = 'not in';
}
/**
* Overwrites method show to add a back button
*/
public function show() {
parent::show();
if ( ! is_admin() ) {
return; // Cannot show back button on web page
}
// Prepare url back button
$url = '?page=' . esc_attr( $this->page );
$url .= '&' . esc_attr( $this->add_parent_args_to_back_button() ) . $this->page_number_link;
?>
<div style="padding-top:5px;padding-left:3px;">
<button type="button"
onclick="javascript:window.location.href='<?php echo $url; // phpcs:ignore WordPress.Security.EscapeOutput ?>'"
class="button button-secondary">
<i class="fas fa-angle-left wpda_icon_on_button"></i>
<?php echo __( 'Child List', 'wp-data-access' ); ?>
</button>
</div>
<?php
}
/**
* Overwrites method add_parent_args to add argument list_table_selection
*/
protected function add_parent_args() {
parent::add_parent_args();
?>
<input type='hidden' name='list_table_selection' value='TRUE'>
<?php
}
/**
* Add parent args to back button as url argument string
*
* @return string
*/
protected function add_parent_args_to_back_button() {
if ( isset( $_REQUEST['child_tab'] ) ) {
$child_tab = sanitize_text_field( wp_unslash( $_REQUEST['child_tab'] ) ); // input var okay.
} else {
$child_tab = '';
}
$args = "&action=list&mode=edit&child_request=TRUE&child_tab=$child_tab";
foreach ( $this->parent['parent_key'] as $parent_key ) {
$args .= '&' . esc_attr( $parent_key ) . '=' . esc_attr( $this->parent['parent_key_value'][ $parent_key ] );
}
return $args;
}
/**
* Overwrite method get_bulk_actions to add 'Add selected rows' to bulk selection
*
* @return array
*/
public function get_bulk_actions() {
$actions = array(
'bulk-add' => __( 'Add selected rows', 'wp-data-access' ),
);
return $actions;
}
/**
* Overwrites method process_bulk_action to implement selection
*/
public function process_bulk_action() {
if ( 'bulk-add' === $this->current_action() ) {
if ( ! isset( $_REQUEST['bulk-selected'] ) ) { // input var okay.
$msg = new WPDA_Message_Box(
array(
'message_text' => __( 'Nothing selected', 'wp-data-access' ),
)
);
$msg->box();
return;
}
$bulk_rows = (array) $_REQUEST['bulk-selected']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
//phpcs:ignore - 8.1 proof
$no_rows = count( $bulk_rows ); // # rows to be added.
$rows_to_be_added = array(); // Gonna hold rows to be added.
for ( $i = 0; $i < $no_rows; $i ++ ) {
// Write "json" to named array. Need to strip slashes twice. Once for the normal conversion
// and once extra for the pre-conversion of double quotes in method column_cb().
$row_object = json_decode( stripslashes( stripslashes( $bulk_rows[ $i ] ) ), true );
if ( $row_object ) {
$j = 0; // Index used to build array.
// Check all key columns.
foreach ( $this->wpda_list_columns->get_table_primary_key() as $key ) {
// Check if key is available.
if ( ! isset( $row_object[ $key ] ) ) {
wp_die( __( 'ERROR: Invalid URL', 'wp-data-access' ) );
}
// Write key value pair to array.
$rows_to_be_added[ $i ][ $j ]['key'] = $key;
$rows_to_be_added[ $i ][ $j ]['value'] = $row_object[ $key ];
$j ++;
}
}
}
// Looks like everything is there. Add relationship.
$no_key_cols = count( $this->wpda_list_columns->get_table_primary_key() );//phpcs:ignore - 8.1 proof
$rows_successfully_added = 0; // Number of rows successfully added.
$rows_with_errors = 0; // Number of rows that could not be added.
for ( $i = 0; $i < $no_rows; $i ++ ) {
// Prepare named array for delete operation.
$next_row_to_be_added = array();
$row_found = true;
for ( $j = 0; $j < $no_key_cols; $j ++ ) {
if ( isset( $rows_to_be_added[ $i ][ $j ]['key'] ) ) {
$next_row_to_be_added[ $rows_to_be_added[ $i ][ $j ]['key'] ] = $rows_to_be_added[ $i ][ $j ]['value'];
} else {
$row_found = false;
}
}
if ( $row_found ) {
if ( $this->add_row( $next_row_to_be_added ) ) {
// Row(s) successfully added.
$rows_successfully_added ++;
} else {
// An error occurred during the insert operation: increase error count.
$rows_with_errors ++;
}
} else {
// An error occurred during the insert operation: increase error count.
$rows_with_errors ++;
}
}
// Inform user about the results of the operation.
$message = '';
if ( 1 === $rows_successfully_added ) {
$message = __( 'Row added', 'wp-data-access' );
} elseif ( $rows_successfully_added > 1 ) {
$message = "$rows_successfully_added " . __( 'rows added', 'wp-data-access' );
}
if ( '' !== $message ) {
$msg = new WPDA_Message_Box(
array(
'message_text' => $message,
)
);
$msg->box();
}
if ( $rows_with_errors > 0 ) {
$msg = new WPDA_Message_Box(
array(
'message_text' => __( 'Not all rows have been added', 'wp-data-access' ),
'message_type' => 'error',
'message_is_dismissible' => false,
)
);
$msg->box();
}
// Records added, redirect to list table
if ( isset( $this->child['tab_label'] ) ) {
?>
<script type='text/javascript'>
jQuery('#form_tab_<?php echo esc_attr( $this->child['tab_label'] ); ?>').submit();
</script>
<?php
}
}
}
/**
* Adds a relationship for every selected row
*
* @param array $next_row_to_be_added Rows to be added
*
* @return mixed Return value of SQL insert statement
*/
protected function add_row( $next_row_to_be_added ) {
$wpdadb = WPDADB::get_db_connection( $this->schema_name );
if ( null === $wpdadb ) {
if ( is_admin() ) {
wp_die( sprintf( __( 'ERROR - Remote database %s not available', 'wp-data-access' ), esc_attr( $this->schema_name ) ) );
} else {
die( sprintf( __( 'ERROR - Remote database %s not available', 'wp-data-access' ), esc_attr( $this->schema_name ) ) );
}
}
$child_columns = array();
$index = 0;
foreach ( $next_row_to_be_added as $row ) {
$child_columns[ $this->child['relation_nm']['child_table_select'][ $index ] ] =
$row;
$child_columns[ $this->child['relation_nm']['child_table_where'][ $index ] ] =
$this->parent['parent_key_value'][ $this->parent['parent_key'][ $index ] ];
$index ++;
}
return $wpdadb->insert( $this->child['relation_nm']['child_table'], $child_columns );
}
/**
* Overwrite method column_default_add_action to prevent parent action being executed
*
* @param array $item
* @param string $column_name
* @param array $actions
*/
protected function column_default_add_action( $item, $column_name, &$actions ) { }
}
}