| Current File : /home/bwalansa/www/wp-content/plugins/the-events-calendar/src/Tribe/Importer/Admin_Page.php |
<?php
/**
* Class Tribe__Events__Importer__Admin_Page
*/
class Tribe__Events__Importer__Admin_Page {
private $state = '';
private $output = '';
private $messages = array();
private $errors = array();
public function register_admin_page() {
add_submenu_page(
'edit.php?post_type='.Tribe__Events__Main::POSTTYPE,
__( 'Import', 'the-events-calendar' ),
__( 'Import', 'the-events-calendar' ),
'import',
'events-importer',
array( $this, 'render_admin_page_contents' )
);
}
public function render_admin_page_contents() {
$tab = $this->get_active_tab();
switch ( $tab ) {
case 'general' :
$this->render_general_tab();
break;
case 'csv-importer':
$this->render_csv_tab();
break;
default:
include Tribe__Events__Importer__Plugin::path( 'src/io/csv/admin-views/header.php' );
do_action( 'tribe-import-render-tab-' . $tab );
include Tribe__Events__Importer__Plugin::path( 'src/io/csv/admin-views/footer.php' );
break;
}
}
public function render_general_tab() {
include Tribe__Events__Importer__Plugin::path( 'src/io/csv/admin-views/general.php' );
}
public function render_csv_tab() {
switch ( $this->state ) {
case 'map':
try {
$file = new Tribe__Events__Importer__File_Reader( Tribe__Events__Importer__File_Uploader::get_file_path() );
} catch ( RuntimeException $e ) {
$this->errors[] = __( 'The file went away. Please try again.', 'the-events-calendar' );
$this->state = '';
return $this->render_admin_page_contents();
}
$header = $file->get_header();
if ( get_option( 'tribe_events_importer_has_header', 0 ) == 0 ) {
$letter = 'A';
$size = count( $header );
$header = array();
for ( $i = 0 ; $i < $size ; $i++ ) {
$header[] = $letter++;
}
}
$import_type = get_option( 'tribe_events_import_type' );
$messages = $this->errors;
include Tribe__Events__Importer__Plugin::path( 'src/io/csv/admin-views/columns.php' );
break;
case 'importing':
$messages = $this->messages;
include Tribe__Events__Importer__Plugin::path( 'src/io/csv/admin-views/in-progress.php' );
break;
case 'complete':
$log = get_option( 'tribe_events_import_log' );
$skipped = get_option( 'tribe_events_import_failed_rows', array() );
include Tribe__Events__Importer__Plugin::path( 'src/io/csv/admin-views/result.php' );
break;
default:
$messages = $this->errors;
include Tribe__Events__Importer__Plugin::path( 'src/io/csv/admin-views/import.php' );
break;
}
}
public function get_active_tab() {
$tabs = (array) $this->get_available_tabs();
$default = array_shift( $tabs );
return empty( $_REQUEST[ 'tab' ] ) ? $default : $_REQUEST[ 'tab' ];
}
public function get_available_tabs() {
$tabs = array(
__( 'General', 'the-events-calendar' ) => 'general',
__( 'Import: CSV', 'the-events-calendar' ) => 'csv-importer',
);
return apply_filters( 'tribe-import-tabs', $tabs );
}
public function handle_submission() {
$action = $this->get_action();
if ( empty( $action ) ) {
return;
}
ob_start();
switch ( $action ) {
case 'map':
$this->handle_file_submission();
break;
case 'import':
if ( $this->handle_column_mapping() ) {
$this->begin_import();
} else {
$this->state = 'map';
}
break;
case 'continue':
$this->continue_import();
break;
default:
// Should never get here.
break;
}
$this->output = ob_get_clean();
}
private function get_action() {
$action = '';
if ( isset( $_POST[ 'ecp_import_action' ] ) ) {
$action = trim( $_POST[ 'ecp_import_action' ] );
}
if ( isset( $_GET['action'] ) ) {
$action = trim( $_GET[ 'action' ] );
}
if ( ! empty( $action ) ) {
if ( ! in_array( $action, array( 'import', 'map', 'continue' ) ) ) {
$action = '';
}
}
return $action;
}
private function handle_file_submission() {
$this->state = 'map';
if ( empty( $_POST['import_type'] ) || empty( $_FILES['import_file']['name'] ) ) {
$this->errors[] = __( 'We were unable to process your request. Please try again.', 'the-events-calendar' );
$this->state = '';
return;
}
$import_type = $_POST[ 'import_type' ];
update_option( 'tribe_events_import_type', $import_type );
try {
$file_handler = new Tribe__Events__Importer__File_Uploader( $_FILES['import_file'] );
$file_handler->save_file();
} catch ( RuntimeException $e ) {
$this->errors[] = $e->getMessage();
$this->state = '';
return;
}
if ( isset( $_POST[ 'import_header' ] ) && $_POST[ 'import_header' ] ) {
update_option( 'tribe_events_importer_has_header', 1 );
} else {
update_option( 'tribe_events_importer_has_header', 0 );
}
}
private function handle_column_mapping() {
// Deconstruct mapping.
if ( empty( $_POST['column_map'] ) ) {
return FALSE;
}
$column_mapping = $_POST['column_map'];
try {
$importer = $this->get_importer();
} catch ( RuntimeException $e ) {
$this->errors[] = __( 'The file went away. Please try again.', 'the-events-calendar' );
return FALSE;
}
$required_fields = $importer->get_required_fields();
$missing = array_diff( $required_fields, $column_mapping );
if ( ! empty( $missing ) ) {
$mapper = new Tribe__Events__Importer__Column_Mapper( get_option( 'tribe_events_import_type' ) );
$message = __( '<p>The following fields are required for a successful import:</p>', 'the-events-calendar' );
$message .= '<ul style="list-style-type: disc; margin-left: 1.5em;">';
foreach ( $missing as $key ) {
$message .= '<li>' . $mapper->get_column_label( $key ) . '</li>';
}
$message .= '</ul>';
$this->errors[] = $message;
return FALSE;
}
update_option( 'tribe_events_import_column_mapping', $column_mapping );
return TRUE;
}
private function begin_import() {
$this->reset_tracking_options();
$this->continue_import();
}
private function reset_tracking_options() {
update_option( 'tribe_events_importer_offset', get_option( 'tribe_events_importer_has_header', 0 ) );
update_option( 'tribe_events_import_log', array( 'updated' => 0, 'created' => 0, 'skipped' => 0 ) );
update_option( 'tribe_events_import_failed_rows', array() );
}
private function continue_import() {
$importer = $this->get_importer();
$offset = get_option( 'tribe_events_importer_offset' );
if ( $offset == -1 ) {
$this->state = 'complete';
$this->clean_up_after_import();
} else {
$this->state = 'importing';
$importer->set_offset( $offset );
$this->do_import( $importer );
$this->log_import_results( $importer );
}
}
private function do_import( Tribe__Events__Importer__File_Importer $importer ) {
$importer->do_import();
$this->messages = $importer->get_log_messages();
$new_offset = $importer->import_complete() ? -1 : $importer->get_last_completed_row();
update_option( 'tribe_events_importer_offset', $new_offset );
if ( -1 === $new_offset ) do_action( 'tribe_events_csv_import_complete' );
}
private function get_importer() {
$type = get_option( 'tribe_events_import_type' );
$file_reader = new Tribe__Events__Importer__File_Reader( Tribe__Events__Importer__File_Uploader::get_file_path() );
$importer = Tribe__Events__Importer__File_Importer::get_importer( $type, $file_reader );
$importer->set_map( get_option( 'tribe_events_import_column_mapping', array() ) );
$importer->set_type( get_option( 'tribe_events_import_type' ) );
$importer->set_limit( absint( apply_filters( 'tribe_events_csv_batch_size', 100 ) ) );
$importer->set_offset( get_option( 'tribe_events_importer_has_header', 0 ) );
return $importer;
}
private function log_import_results( Tribe__Events__Importer__File_Importer $importer ) {
$log = get_option( 'tribe_events_import_log' );
$log['updated'] += $importer->get_updated_post_count();
$log['created'] += $importer->get_new_post_count();
$log['skipped'] += $importer->get_skipped_row_count();
update_option( 'tribe_events_import_log', $log );
$skipped_rows = $importer->get_skipped_row_numbers();
$previously_skipped_rows = get_option( 'tribe_events_import_failed_rows', array() );
$skipped_rows = $previously_skipped_rows + $skipped_rows;
update_option( 'tribe_events_import_failed_rows', $skipped_rows );
}
private function clean_up_after_import() {
Tribe__Events__Importer__File_Uploader::clear_old_files();
}
}