array('name'=>'id','type'=>'%d'), 'ticket_id' => array('name'=>'ticket_id','type'=>'%d'), 'booking_id' => array('name'=>'booking_id','type'=>'%d'), 'ticket_booking_price' => array('name'=>'price','type'=>'%f'), 'ticket_booking_spaces' => array('name'=>'spaces','type'=>'%d') ); //Other Vars /** * Contains ticket object * @var EM_Ticket */ var $ticket; /** * Contains the booking object of this * @var EM_Booking */ var $booking; var $required_fields = array( 'ticket_id', 'ticket_booking_spaces'); /** * Creates ticket object and retreives ticket data (default is a blank ticket object). Accepts either array of ticket data (from db) or a ticket id. * @param mixed $ticket_data * @return null */ function EM_Ticket_Booking( $ticket_data = false ){ if( $ticket_data !== false ){ //Load ticket data $ticket = array(); if( is_array($ticket_data) ){ $ticket = $ticket_data; }elseif( is_numeric($ticket_data) ){ //Retreiving from the database global $wpdb; $sql = "SELECT * FROM ". EM_TICKETS_BOOKINGS_TABLE ." WHERE ticket_booking_id ='$ticket_data'"; $ticket = $wpdb->get_row($sql, ARRAY_A); } //Save into the object $this->to_object($ticket); $this->compat_keys(); } } /** * Saves the ticket into the database, whether a new or existing ticket * @return boolean */ function save(){ global $wpdb; $table = EM_TICKETS_BOOKINGS_TABLE; do_action('em_ticket_booking_save_pre',$this); //First the person if($this->validate()){ //Now we save the ticket $this->booking_id = $this->get_booking()->booking_id; //event wouldn't exist before save, so refresh id $data = $this->to_array(true); //add the true to remove the nulls if($this->ticket_booking_id != ''){ if($this->get_spaces() > 0){ $where = array( 'ticket_booking_id' => $this->ticket_booking_id ); $result = $wpdb->update($table, $data, $where, $this->get_types($data)); $this->feedback_message = __('Changes saved','dbem'); }else{ $this->result = $this->delete(); } }else{ if($this->get_spaces() > 0){ //TODO better error handling $result = $wpdb->insert($table, $data, $this->get_types($data)); $this->ticket_booking_id = $wpdb->insert_id; $this->feedback_message = __('Ticket booking created','dbem'); }else{ //no point saving a booking with no spaces $result = false; } } if( $result === false ){ $this->feedback_message = __('There was a problem saving the ticket booking.', 'dbem'); $this->errors[] = __('There was a problem saving the ticket booking.', 'dbem'); } $this->compat_keys(); return apply_filters('em_ticket_booking_save', ( count($this->errors) == 0 ), $this); }else{ $this->feedback_message = __('There was a problem saving the ticket booking.', 'dbem'); $this->errors[] = __('There was a problem saving the ticket booking.', 'dbem'); return apply_filters('em_ticket_booking_save', false, $this); } return true; } /** * Validates the ticket for saving. Should be run during any form submission or saving operation. * @return boolean */ function validate(){ $missing_fields = Array (); foreach ( $this->required_fields as $field ) { $true_field = $this->fields[$field]['name']; if ( $this->$true_field == "") { $missing_fields[] = $field; } } if ( count($missing_fields) > 0){ // TODO Create friendly equivelant names for missing fields notice in validation $this->errors[] = __ ( 'Missing fields: ' ) . implode ( ", ", $missing_fields ) . ". "; } return apply_filters('em_event_validate', count($this->errors) == 0, $this ); } /** * Get the total number of spaces booked for this ticket within this booking. * @return int */ function get_spaces(){ return apply_filters('em_booking_get_spaces',$this->ticket_booking_spaces,$this); } /** * Gets the total price for this whole booking. Seting $force_reset to true will recheck spaces, even if previously done so. * @param boolean $force_refresh * @return float */ function get_price( $force_refresh=false, $format = false, $add_tax = 'x' ){ if( $force_refresh || $this->ticket_booking_price == 0 || $add_tax !== 'x' || get_option('dbem_bookings_tax_auto_add') ){ //get the ticket, calculate price on spaces $this->ticket_booking_price = $this->get_ticket()->get_price(false, $add_tax) * $this->ticket_booking_spaces; } if($format){ return apply_filters('em_booking_get_prices', em_get_currency_formatted($this->ticket_booking_price), $this); } return apply_filters('em_booking_get_prices',$this->ticket_booking_price,$this); } /** * Smart event locator, saves a database read if possible. */ function get_booking(){ global $EM_Booking; if( is_object($this->booking) && get_class($this->booking)=='EM_Booking' && ($this->booking->booking_id == $this->booking_id || (empty($this->ticket_booking_id) && empty($this->booking_id))) ){ return $this->booking; }elseif( is_object($EM_Booking) && $EM_Booking->booking_id == $this->booking_id ){ $this->booking = $EM_Booking; }else{ if(is_numeric($this->booking_id)){ $this->booking = new EM_Booking($this->booking_id); }else{ $this->booking = new EM_Booking(); } } return apply_filters('em_ticket_booking_get_booking', $this->booking, $this);; } /** * Gets the ticket object this booking belongs to, saves a reference in ticket property * @return EM_Ticket */ function get_ticket(){ global $EM_Ticket; if( is_object($this->ticket) && get_class($this->ticket)=='EM_Ticket' && $this->ticket->ticket_id == $this->ticket_id ){ return $this->ticket; }elseif( is_object($EM_Ticket) && $EM_Ticket->ticket_id == $this->ticket_id ){ $this->ticket = $EM_Ticket; }else{ $this->ticket = new EM_Ticket($this->ticket_id); } return $this->ticket; } /** * I wonder what this does.... * @return boolean */ function delete(){ global $wpdb; $sql = $wpdb->prepare("DELETE FROM ". EM_TICKETS_BOOKINGS_TABLE . " WHERE ticket_booking_id=%d", $this->ticket_booking_id); $result = $wpdb->query( $sql ); return apply_filters('em_ticket_booking_delete', ($result !== false ), $this); } /** * Get the html options for quantities to go within a min > 0) ? $this->min:1; $max = ($this->max > 0) ? $this->max:get_option('dbem_bookings_form_max'); ?> get_booking()->can_manage() ); } } ?>