modern-events-calendar-lite/app/libraries/cart.php

257 lines
8.5 KiB
PHP
Executable file

<?php
/** no direct access **/
defined('MECEXEC') or die();
/**
* Webnus MEC Cart class.
* @author Webnus <info@webnus.net>
*/
class MEC_cart extends MEC_base
{
/**
* @var MEC_main
*/
private $main;
private $settings;
private $ticket_names = [];
/**
* Constructor method
* @author Webnus <info@webnus.net>
*/
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' => '<div class="woocommerce-notices-wrapper"><div class="woocommerce-message" role="alert"><a href="'.esc_url($this->get_cart_url()).'" tabindex="1" class="button wc-forward" target="_parent">'.esc_html__('View cart', 'modern-events-calendar-lite').'</a> '.esc_html(sprintf(_n('“%s” has been added to your cart.', '“%s” have been added to your cart.', count($this->ticket_names), 'modern-events-calendar-lite'), $ticket_names)).'</div></div>');
// Optional Cart URL
if(isset($this->settings['cart_after_add']) and $this->settings['cart_after_add'] == 'optional_chckout') return array('type' => 'message', 'message' => '<div class="woocommerce-notices-wrapper"><div class="woocommerce-message" role="alert"><a href="'.esc_url($this->get_checkout_url()).'" tabindex="1" class="button wc-forward" target="_parent">'.esc_html__('Checkout', 'modern-events-calendar-lite').'</a> '.esc_html(sprintf(_n('“%s” has been added to your cart.', '“%s” have been added to your cart.', count($this->ticket_names), 'modern-events-calendar-lite'), $ticket_names)).'</div></div>');
// 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);
}
}