| Current File : /home/digitaw/www/wp-content/plugins/event-tickets/src/Tribe/Editor/Attendee_Registration.php |
<?php
/**
* Attendee Registration
*
* @since 4.9
*
* @todo: replace this entire stinky miasma with a React powered block
*/
class Tribe__Tickets__Editor__Attendee_Registration {
public $post;
public $ticket_id;
public $ticket;
/**
* @since 4.9
*
* @return void
*/
public function hook() {
if ( ! is_admin() ) {
return;
}
add_filter( 'admin_body_class', [ $this, 'filter_admin_body_class' ] );
add_action( 'admin_init', [ $this, 'admin_init' ] );
add_action( 'admin_menu', [ $this, 'admin_menu' ] );
}
/**
* Hook into admin_body_class to add class to body
*
* @param string $classes
*
* @return string
*/
public function filter_admin_body_class( $classes ) {
/**
* This Try/Catch is present to deal with a problem on Autoloading from version 5.1.0 ET+ with ET 5.0.3.
*
* @todo Needs to be revised once proper autoloading rules are done for Common, ET and ET+.
*/
try {
$ar_page_slug = tribe( 'tickets.attendee_registration' )->get_slug();
} catch( RuntimeException $error ) {
return $classes;
}
// if not on attendee registration page.
if ( tribe_get_request_var( 'page', '' ) !== $ar_page_slug ) {
return $classes;
}
// if tribe_events_modal is not set or not set to 1.
if ( ! tribe_get_request_var( 'tribe_events_modal', 0 ) ) {
return $classes;
}
// add `.tribe_events_modal` to body class.
$classes .= ' tribe_events_modal';
return $classes;
}
/**
* Hooked to admin_menu to register the attendee registration page
*
* @since 4.9
*
* @return void
*/
public function admin_menu() {
// Setup attendee registration.
add_submenu_page(
'',
'Attendee Registration',
'Attendee Registration', // hidden.
'edit_posts',
'attendee-registration',
[ $this, 'render' ]
);
}
/**
* Hooked to admin_init to setup ticket and post data
* also handles maybe handling form submission
*
* @since 4.9
*
* @return null
*/
public function admin_init() {
if ( ! isset( $_GET['ticket_id'] ) ) {
return;
}
$this->ticket_id = absint( $_GET['ticket_id'] );
$this->ticket = tribe_tickets()->by( 'id', $this->ticket_id )->first();
if ( empty( $this->ticket ) ) {
return;
}
$this->post = tribe_events_get_ticket_event( $this->ticket_id );
if ( empty( $this->post ) ) {
return;
}
if ( isset( $_GET['success'] ) ) {
tribe_notice(
'attendee-information-success',
[ $this, 'success_notice' ],
[ 'type' => 'success' ]
);
}
$this->maybe_handle_submission();
}
/**
* Show a success notice after save!
*
* @since 4.9
*
* @return string success message.
*/
public function success_notice() {
$link = '<a href="' . esc_url( get_edit_post_link( $this->post->ID, 'raw' ) ) . '">' . esc_html__( 'return to the content editor', 'event-tickets' ) . '</a>';
$notice = '<div class="success"><p>';
$notice .= sprintf( esc_html__( 'Attendee Registration fields saved. Make additional changes or %1$s', 'event-tickets' ), $link );
$notice .= '</p></div>';
return $notice;
}
/**
* Output for attendee information metabox.
*
* @since 4.9
*/
public function render() {
if ( empty( $this->ticket ) || empty( $this->post ) ) {
wp_die();
}
?>
<style>
.postbox {
padding: 1rem;
}
</style>
<div id="poststuff"><div class="inside postbox">
<a href="<?php echo esc_url( get_edit_post_link( $this->post->ID, 'raw' ) );?>">« <?php esc_html_e( 'Back to Editor', 'event-tickets' ) ?></a>
<form id="event-tickets-attendee-information" action="<?php echo esc_url( $this->url() ); ?>" method="post">
<input type="hidden" name="ticket_id" value="<?php echo absint( $this->ticket_id );?>" />
<div id="tribetickets" class="event-tickets-plus-fieldset-table tribe-tickets-plus-fieldset-page">
<?php
$meta = Tribe__Tickets_Plus__Main::instance()->meta();
$meta->meta_content( $this->ticket_id );
?>
</div>
<button class="button-primary" type="submit"><?php esc_html_e( 'Save Changes', 'event-tickets' ) ?></button>
</form>
</div></div>
<script>
jQuery( function ( $ ) {
$( '#poststuff' ).on( 'change', 'input, select, textarea', function () {
if ( null !== window.onbeforeunload ) {
return;
}
window.onbeforeunload = function() {
return confirm( <?php esc_js( __( 'Are you sure you want to leave this page?', 'event-tickets' ) );?> );
};
} );
$( '#poststuff' ).on( 'click', 'button.button-primary', function() {
window.onbeforeunload = null;
} );
} );
</script>
<?php
}
/**
* Handle the saving of attendee registration form.
*
* @since 4.9
*
* @return null|die
*/
private function maybe_handle_submission() {
if ( 'POST' !== $_SERVER['REQUEST_METHOD'] ) {
return;
}
if ( empty( $this->ticket ) || empty( $this->post ) ) {
return;
}
// mildly concerning.
$data = $_POST;
$meta = Tribe__Tickets_Plus__Main::instance()->meta();
$meta->save_meta( $this->post->ID, $this->ticket, $data );
wp_redirect( add_query_arg( 'success', 1, $this->url() ) );
die;
}
/**
* URL to this standalone page
*
* @since 4.9
*
* @return string URL
*/
private function url() {
return admin_url( 'edit.php?post_type=' . $this->post->post_type . '&page=attendee-registration&ticket_id=' . $this->ticket_id );
}
}