*/ class MEC_cart extends MEC_base { /** * @var MEC_main */ private $main; private $settings; private $ticket_names = []; /** * Constructor method * @author Webnus */ public function __construct() { // Main $this->main = $this->getMain(); // MEC Settings $this->settings = $this->main->get_settings(); } public function add($transaction_id) { $cart_id = $this->get_cart_id(); $cart = $this->get_cart($cart_id); $cart[] = $transaction_id; $this->update_cart($cart_id, $cart); // Add to Ticket Names $this->ticket_names = array_merge($this->ticket_names, $this->get_ticket_names($transaction_id)); return $this; } public function remove($transaction_id) { $cart_id = $this->get_cart_id(); $cart = $this->get_cart($cart_id); if(!in_array($transaction_id, $cart)) return false; $key = array_search($transaction_id, $cart); if($key !== false) unset($cart[$key]); $this->update_cart($cart_id, $cart); return true; } public function next() { $ticket_names = implode(', ', $this->ticket_names); if(trim($ticket_names) === '') $ticket_names = esc_html__('Ticket', 'modern-events-calendar-lite'); // Checkout URL if(isset($this->settings['cart_after_add']) and $this->settings['cart_after_add'] == 'checkout') return array('type' => 'url', 'url' => $this->get_checkout_url()); // Optional Checkout URL if(isset($this->settings['cart_after_add']) and $this->settings['cart_after_add'] == 'optional_cart') return array('type' => 'message', 'message' => '
'); // Optional Cart URL if(isset($this->settings['cart_after_add']) and $this->settings['cart_after_add'] == 'optional_chckout') return array('type' => 'message', 'message' => '
'); // Cart URL else return array('type' => 'url', 'url' => $this->get_cart_url()); } public function get_cart($cart_id) { $cart = get_option('mec_cart_'.$cart_id, NULL); if(is_null($cart)) { $cart = []; update_option('mec_cart_'.$cart_id, $cart, false); } if(!is_array($cart)) $cart = []; return $cart; } public function update_cart($cart_id, $value) { return update_option('mec_cart_'.$cart_id, $value, false); } public function archive_cart($cart_id) { $value = $this->get_cart($cart_id); return update_option('mec_cart_'.$cart_id.'_archived', $value, false); } public function get_archived_cart($cart_id) { $cart = get_option('mec_cart_'.$cart_id.'_archived', NULL); if(!is_array($cart)) $cart = []; return $cart; } public function get_cart_id() { $cart_id = (isset($_COOKIE['mec_cart']) and trim($_COOKIE['mec_cart'])) ? sanitize_text_field($_COOKIE['mec_cart']) : NULL; if(!$cart_id and !headers_sent()) $cart_id = $this->get_fresh_cart_id(); return $cart_id; } public function get_fresh_cart_id() { $cart_id = mt_rand(100000000, 999999999); setcookie('mec_cart', $cart_id, (time()+(30*86400)), '/'); return $cart_id; } public function get_checkout_url() { $page_id = (isset($this->settings['checkout_page']) and trim($this->settings['checkout_page'])) ? $this->settings['checkout_page'] : NULL; return ($page_id ? get_permalink($page_id) : home_url()); } public function get_cart_url() { $page_id = (isset($this->settings['cart_page']) and trim($this->settings['cart_page'])) ? $this->settings['cart_page'] : NULL; $language_codes_array = null; $language_current_code = null; if ( class_exists( 'TRP_Translate_Press' ) ){ $trp = TRP_Translate_Press::get_trp_instance(); $trp_settings = $trp->get_component( 'settings' ); $language_codes_array = $trp_settings->get_settings()['publish-languages']; $language_current_code = $_REQUEST['trp-form-language']; } if(!empty($language_codes_array)){ return home_url() . '/'.$language_current_code.str_replace(home_url(),'',get_permalink($page_id)); }else{ return ($page_id ? get_permalink($page_id) : home_url()); } } public function get_ticket_names($transaction_id) { $book = $this->getBook(); $transaction = $book->get_transaction($transaction_id); $event_id = ((isset($transaction['event_id']) and $transaction['event_id']) ? $transaction['event_id'] : 0); $tickets = ((isset($transaction['tickets']) and is_array($transaction['tickets'])) ? $transaction['tickets'] : array()); $event_tickets = get_post_meta($event_id, 'mec_tickets', true); if(!is_array($event_tickets)) $event_tickets = []; $names = []; foreach($tickets as $key => $ticket) { if(!is_numeric($key)) continue; $ticket_id = (isset($ticket['id']) and $ticket['id']) ? $ticket['id'] : 0; if(!$ticket_id) continue; $ticket = $event_tickets[$ticket_id] ?? []; $ticket_name = ($ticket['name'] ?? ''); if(trim($ticket_name)) $names[] = $ticket_name; } return array_unique($names); } public function get_payable($cart = NULL) { if(is_null($cart)) { $cart_id = $this->get_cart_id(); $cart = $this->get_cart($cart_id); } // Booking Library $book = $this->getBook(); $payable = 0; foreach($cart as $transaction_id) { $TO = $book->get_TO($transaction_id); $payable += $TO->get_payable(); } return $payable; } public function is_free($cart = NULL) { $payable = $this->get_payable($cart); return !($payable > 0); } public function clear($cart_id) { // Save it for future usage $this->archive_cart($cart_id); // Make it empty $this->update_cart($cart_id, array()); // New Cart ID $this->get_fresh_cart_id(); } public function get_first_event_id($cart = NULL) { if(is_null($cart)) { $cart_id = $this->get_cart_id(); $cart = $this->get_cart($cart_id); } // Booking Library $book = $this->getBook(); $event_id = NULL; foreach($cart as $transaction_id) { $TO = $book->get_TO($transaction_id); $event_id = $TO->get_event_id(); break; } return $event_id; } public function get_invoice_link($cart_id) { if(isset($this->settings['mec_cart_invoice']) and !$this->settings['mec_cart_invoice']) return ''; $url = $this->main->URL(); $url = $this->main->add_qs_var('method', 'mec-cart-invoice', $url); // Invoice Key $url = $this->main->add_qs_var('mec-key', $cart_id, $url); return apply_filters('mec_cart_invoice_url', $url, $cart_id); } public function is_done($cart_id) { return (bool) $this->get_archived_cart($cart_id); } }