PK!  ɥevent.class.phpnu[ $timetable_events_settings['slug'], ); $parent_defaults = parent::GetDefaults(); $defaults += $parent_defaults; return $defaults; } public static function GetDefaultFetchArgs() { $timetable_events_settings = timetable_events_settings(); $defaults = array( 'post_type' => $timetable_events_settings['slug'], ); $parent_defaults = parent::GetDefaultFetchArgs(); $defaults += $parent_defaults; return $defaults; } protected static function GetDefaultCreateArgs() { $timetable_events_settings = timetable_events_settings(); $defaults = array( 'post_type' => $timetable_events_settings['slug'], ); $parent_defaults = parent::GetDefaultCreateArgs(); $defaults += $parent_defaults; return $defaults; } }PK!](](event-hour.class.phpnu[event) && $this->event_id>0) { $this->event = TT_Event::FetchOneById($this->event_id); } return $this->event; } public function setEvent($event) { $this->event = $event; } public function GetWeekday() { if(is_null($this->weekday) && $this->weekday_id>0) { $this->weekday = TT_Weekday::FetchOneById($this->weekday_id); } return $this->weekday; } public function SetWeekday($weekday) { $this->weekday = $weekday; } public function __construct($data = array()) { $this->SetDefaults(); $this->Set($data); } public function Set($data = array()) { if(isset($data['event_hours_id'])) $this->event_hours_id = $data['event_hours_id']; if(isset($data['event_id'])) $this->event_id = $data['event_id']; if(isset($data['weekday_id'])) $this->weekday_id = $data['weekday_id']; if(isset($data['start'])) $this->start = $data['start']; if(isset($data['end'])) $this->end = $data['end']; if(isset($data['tooltip'])) $this->tooltip = $data['tooltip']; if(isset($data['before_hour_text'])) $this->before_hour_text = $data['before_hour_text']; if(isset($data['after_hour_text'])) $this->after_hour_text = $data['after_hour_text']; if(isset($data['category'])) $this->category = $data['category']; if(isset($data['available_places'])) $this->available_places = $data['available_places']; if(isset($data['slots_per_user'])) $this->slots_per_user = $data['slots_per_user']; if(isset($data['event_title'])) $this->event_title = $data['event_title']; if(isset($data['event_name'])) $this->event_name = $data['event_name']; if(isset($data['weekday_title'])) $this->weekday_title = $data['weekday_title']; if(isset($data['weekday_name'])) $this->weekday_name = $data['weekday_name']; } protected function SetDefaults() { $defaults = static::GetDefaults(); $this->event_hours_id = $defaults['event_hours_id']; $this->event_id = $defaults['event_id']; $this->weekday_id = $defaults['weekday_id']; $this->start = $defaults['start']; $this->end = $defaults['end']; $this->tooltip = $defaults['tooltip']; $this->before_hour_text = $defaults['before_hour_text']; $this->after_hour_text = $defaults['after_hour_text']; $this->category = $defaults['category']; $this->available_places = $defaults['available_places']; $this->slots_per_user = $defaults['slots_per_user']; $this->event_title = $defaults['event_title']; $this->event_name = $defaults['event_name']; $this->weekday_title = $defaults['weekday_title']; $this->weekday_name = $defaults['weekday_name']; } protected static function GetDefaults() { return array( 'event_hours_id' => 0, 'event_id' => 0, 'weekday_id' => 0, 'start' => '', 'end' => '', 'tooltip' => '', 'before_hour_text' => '', 'after_hour_text' => '', 'category' => '', 'available_places' => 0, 'slots_per_user' => 1, 'event_title' => '', 'event_name' => '', 'weekday_title' => '', 'weekday_name' => '', ); } public static function Fetch($args = array()) { $defaults = static::GetDefaultFetchArgs(); $args = shortcode_atts($defaults, $args); global $wpdb; $query = ''; $queryArgs = array(); $query .= 'SELECT event_hour.event_hours_id, event_hour.event_id, event_hour.weekday_id, TIME_FORMAT(event_hour.start, "%H:%i") AS start, TIME_FORMAT(event_hour.end, "%H:%i") AS end, event_hour.tooltip, event_hour.before_hour_text, event_hour.after_hour_text, event_hour.category, event_hour.available_places, event_hour.slots_per_user, event.post_title AS event_title, event.post_name as event_name, weekday.post_title AS weekday_title, weekday.post_name as weekday_name FROM ' . $wpdb->prefix . 'event_hours AS event_hour LEFT JOIN ' . $wpdb->posts . ' AS event ON(event_hour.event_id=event.ID) LEFT JOIN ' . $wpdb->posts . ' AS weekday ON(event_hour.weekday_id=weekday.ID) WHERE 1 = 1'; if($args['event_hour_id']) { $query .= ' AND event_hour.event_hours_id IN ('; $temp = array(); foreach($args['event_hour_id'] as $val) { $temp[] = '%d'; $queryArgs[] = (int)$val; } $query .= implode(',', $temp); $query .= ')'; } if($args['event']) { $query .= ' AND event.post_name IN ('; $temp = array(); foreach($args['event'] as $val) { $temp[] = '%s'; $queryArgs[] = $val; } $query .= implode(',', $temp); $query .= ')'; } if($args['weekday']) { $query .= ' AND weekday.post_name IN ('; $temp = array(); foreach($args['weekday'] as $val) { if($val=='') continue; $temp[] = '%s'; $queryArgs[] = $val; } $query .= implode(',', $temp); $query .= ')'; } $query = $wpdb->prepare($query, $queryArgs); $result = $wpdb->get_results($query, 'ARRAY_A'); if(!$result) return null; $eventHours = array(); foreach($result as $key=>$val) $eventHours[] = new static($val); return $eventHours; } public static function FetchById($id) { $eventHours = static::Fetch(array('event_hour_id' => array($id))); if(count($eventHours)==1) return $eventHours[0]; else return null; } public static function GetDefaultFetchArgs() { $defaults = array( 'event_hour_id' => array(), 'event' => array(), 'weekday' => array(), ); return $defaults; } public static function Insert(TT_Event_Hour $eventHour) { global $wpdb; $query = ''; $queryFieldsClause = array(); $queryValuesClause = array(); $queryArgs = array(); if($eventHour->event_id>0) { $queryFieldsClause[] = "event_id"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->event_id; } if($eventHour->weekday_id>0) { $queryFieldsClause[] = "weekday_id"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->weekday_id; } if($eventHour->start!='') { $queryFieldsClause[] = "start"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->start; } if($eventHour->end!='') { $queryFieldsClause[] = "end"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->end; } if($eventHour->tooltip!='') { $queryFieldsClause[] = "tooltip"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->tooltip; } if($eventHour->before_hour_text!='') { $queryFieldsClause[] = "before_hour_text"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->before_hour_text; } if($eventHour->after_hour_text!='') { $queryFieldsClause[] = "after_hour_text"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->after_hour_text; } if($eventHour->category!='') { $queryFieldsClause[] = "category"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->category; } if($eventHour->available_places>=0) { $queryFieldsClause[] = "available_places"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->available_places; } if($eventHour->slots_per_user>=0) { $queryFieldsClause[] = "slots_per_user"; $queryValuesClause[] = "%s"; $queryArgs[] = $eventHour->slots_per_user; } $queryFieldsClause = implode(", ", $queryFieldsClause); $queryValuesClause = implode(", ", $queryValuesClause); $query .= "INSERT INTO `" . $wpdb->prefix . "event_hours` (" . $queryFieldsClause . ") VALUES(" . $queryValuesClause . ")"; $query = $wpdb->prepare($query, $queryArgs); $result = $wpdb->query($query); if($result) return $wpdb->insert_id; else false; } public static function Update(TT_Event_Hour $eventHour) { global $wpdb; $query = ''; $querySetClause = array(); $queryArgs = array(); if($eventHour->event_id>0) { $querySetClause[] = "event_id = %s"; $queryArgs[] = $eventHour->event_id; } if($eventHour->weekday_id>0) { $querySetClause[] = "weekday_id = %s"; $queryArgs[] = $eventHour->weekday_id; } if($eventHour->start!='') { $querySetClause[] = "start = %s"; $queryArgs[] = $eventHour->start; } if($eventHour->end!='') { $querySetClause[] = "end = %s"; $queryArgs[] = $eventHour->end; } if($eventHour->tooltip!='') { $querySetClause[] = "tooltip = %s"; $queryArgs[] = $eventHour->tooltip; } if($eventHour->before_hour_text!='') { $querySetClause[] = "before_hour_text = %s"; $queryArgs[] = $eventHour->before_hour_text; } if($eventHour->after_hour_text!='') { $querySetClause[] = "after_hour_text = %s"; $queryArgs[] = $eventHour->after_hour_text; } if($eventHour->category!='') { $querySetClause[] = "category = %s"; $queryArgs[] = $eventHour->category; } if($eventHour->available_places>=0) { $querySetClause[] = "available_places = %s"; $queryArgs[] = $eventHour->available_places; } if($eventHour->slots_per_user>=0) { $querySetClause[] = "slots_per_user = %s"; $queryArgs[] = $eventHour->slots_per_user; } $querySetClause = implode(", ", $querySetClause); $query .= "UPDATE `" . $wpdb->prefix . "event_hours` SET " . $querySetClause . " WHERE event_hours_id = %s"; $queryArgs[] = $eventHour->event_hours_id; $query = $wpdb->prepare($query, $queryArgs); $result = $wpdb->query($query); return $result; } public static function Exists($Id) { global $wpdb; $query = ''; $queryArgs = array(); $query .= "SELECT event_hours_id FROM `" . $wpdb->prefix . "event_hours` WHERE event_hours_id=%s "; $queryArgs[] = $Id; $query = $wpdb->prepare($query, $queryArgs); $result = $wpdb->get_var($query); return $result; } } PK! N}U3U3google-calendar.class.phpnu[token && $this->token_expiration && $this->token_expiration>time())) $this->token = $this->GenerateToken(); return $this->token; } public function GetCalendarEventId($event_id) { if(isset($this->events_mapping[$this->id]) && isset($this->events_mapping[$this->id][$event_id])) { return $this->events_mapping[$this->id][$event_id]; } else return null; } function SetDefaultOptions() { $this->options = array( 'id' => '', 'service_account_encoded' => '', 'token' => '', 'token_expiration' => 0, 'events_data' => '', 'events_mapping' => '', ); update_option('tt_google_calendar', $this->options); } function LoadOptions() { $this->options = get_option('tt_google_calendar'); if($this->options===false) $this->SetDefaultOptions(); $this->id = $this->options['id']; $this->service_account_encoded = $this->options['service_account_encoded']; $this->service_account = json_decode($this->service_account_encoded); $this->token = $this->options['token']; $this->token_expiration = $this->options['token_expiration']; $this->events_data = $this->options['events_data']; $this->events_mapping = $this->options['events_mapping']; } public function SaveOptions() { $this->options = array( 'id' => $this->id, 'service_account_encoded' => $this->service_account_encoded, 'token' => $this->token, 'token_expiration' => $this->token_expiration, 'events_data' => $this->events_data, 'events_mapping' => $this->events_mapping, ); update_option('tt_google_calendar', $this->options); } public function __construct() { $this->LoadOptions(); $this->current_day = date('N'); $this->timezone = new DateTimeZone($this->GetWPTimezone()); } function ExportEvents($eventsHours, $weekdays) { if(!($this->id!='' && !is_null($this->service_account))) return false; if(!$eventsHours) return false; foreach($eventsHours as $eventHour) { $calendarEventDetails = $this->prepareCalendarEvent($eventHour, $weekdays); if($calendarEventId = $this->GetCalendarEventId($eventHour->event_hours_id)) { $result = $this->UpdateCalendarEvent($calendarEventId, $calendarEventDetails); } else { $result = $this->InsertCalendarEvent($calendarEventDetails); if($result!=false) { $this->AddCalendarEvent($eventHour->event_hours_id, $result->id); } } } return true; } public function ImportEvents($calendar_event, $weekdays) { if(!($this->id!='' && $this->service_account!='')) return false; $calendarEvents = $this->events_data; if(!($calendarEvents && $calendarEvents->items)) return false; foreach($calendarEvents->items as $item) { if(!in_array($item->summary, $calendar_event)) continue; $event = TT_Event::FetchOne(array( 'title' => $item->summary, )); if(is_null($event)) { $event = new TT_Event(); $event->post_title = $item->summary; $result = TT_Event::Insert($event); if($result>0) { $event = TT_Event::FetchOneById($result); } else continue; } $eventHourDetails = $this->prepareEventHourDetails($event, $item, $weekdays); $eventHourId = array_search($item->id, $this->events_mapping[$this->id]); if($eventHourId && TT_Event_Hour::Exists($eventHourId)) { $eventHour = TT_Event_Hour::FetchById($eventHourId); $eventHour->Set($eventHourDetails); $result = TT_Event_Hour::Update($eventHour); } else { $eventHour = new TT_Event_Hour($eventHourDetails); $result = TT_Event_Hour::Insert($eventHour); if($result) { $this->AddCalendarEvent($result, $item->id); } } } return true; } function getEvent($calendarEventId) { $token = $this->getToken(); if(!$token) return false; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/calendar/v3/calendars/' . $this->id . '/events/' . $calendarEventId . '?access_token=' . $token); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $responseDecoded = json_decode($response); curl_close($ch); if(is_object($responseDecoded) && property_exists($responseDecoded, 'kind') && $responseDecoded->kind=='calendar#event' ) return $responseDecoded; else return false; } function ListEvents() { $token = $this->getToken(); if(!$token) return false; $ch=curl_init(); curl_setopt($ch, CURLOPT_URL,'https://www.googleapis.com/calendar/v3/calendars/' . $this->id . '/events?access_token=' . $token); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $responseDecoded = json_decode($response); curl_close($ch); if(is_object($responseDecoded) && property_exists($responseDecoded,'kind') && $responseDecoded->kind=='calendar#events' ) return $responseDecoded; else return false; } function UniqueCalendarEvents() { $events = $this->events_data; if(!($events && $events->items)) return false; $uniqueCalendarEvents = array(); foreach($events->items as $item) { if(!in_array($item->summary, $uniqueCalendarEvents)) $uniqueCalendarEvents[] = $item->summary; } return $uniqueCalendarEvents; } function LoadEventsData() { $this->events_data = $this->ListEvents(); $this->SaveOptions(); } function InsertCalendarEvent($eventDetails) { $token = $this->getToken(); if(!$token) return false; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/calendar/v3/calendars/' . $this->id . '/events?access_token=' . $token); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($eventDetails)); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $responseDecoded = json_decode($response); if((is_object($responseDecoded)) && (property_exists($responseDecoded, 'kind')) && ($responseDecoded->kind=='calendar#event')) { return $responseDecoded; } return false; } function UpdateCalendarEvent($calendarEventId, $eventDetails) { $token = $this->getToken(); if(!$token) return false; $eventDetailsJson = json_encode($eventDetails); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'https://www.googleapis.com/calendar/v3/calendars/' . $this->id . '/events/' . $calendarEventId . '?access_token=' . $token); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_POSTFIELDS, $eventDetailsJson); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($eventDetailsJson))); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $responseDecoded = json_decode($response); if(is_object($responseDecoded) && property_exists($responseDecoded,'kind') && $responseDecoded->kind=='calendar#event' ) return true; else return false; } function GenerateToken() { if(!property_exists($this->service_account, 'client_email')) return false; $header = '{"alg":"RS256","typ":"JWT"}'; $headerEncoded = $this->base64URLEncode($header); $assertionTime = time(); $expirationTime = $assertionTime+3600; $claimSet = '{ "iss":"' . $this->service_account->client_email . '", "scope":"https://www.googleapis.com/auth/calendar", "aud":"https://www.googleapis.com/oauth2/v4/token", "exp":' . $expirationTime . ', "iat":' . $assertionTime . ' }'; $claimSetEncoded = $this->base64URLEncode($claimSet); $signature = ''; openssl_sign($headerEncoded . '.' . $claimSetEncoded, $signature, $this->service_account->private_key, 'SHA256'); $signatureEncoded = $this->base64URLEncode($signature); $assertion = $headerEncoded . '.' . $claimSetEncoded . '.' . $signatureEncoded; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/oauth2/v4/token'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=' . $assertion); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $responseDecoded = json_decode($response); if(is_object($responseDecoded) && property_exists($responseDecoded,'access_token') ) { $this->token = $responseDecoded->access_token; $this->token_expiration = $expirationTime; $this->SaveOptions(); return $this->token; } return false; } protected function base64URLEncode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } protected function prepareEventHourDetails(TT_Event $event, $calendarEvent, $weekdays) { if(property_exists($calendarEvent->start, 'timeZone')) $startTimeZone = new DateTimeZone($calendarEvent->end->timeZone); else $startTimeZone = new DateTimeZone('+0000'); if(property_exists($calendarEvent->end, 'timeZone')) $endTimeZone = new DateTimeZone($calendarEvent->end->timeZone); else $endTimeZone = new DateTimeZone('+0000'); $startDate = new DateTime($calendarEvent->start->dateTime, $startTimeZone); $endDate = new DateTime($calendarEvent->end->dateTime, $endTimeZone); $dayNum = $startDate->format('N')-1; $weekday = TT_Weekday::FetchOne(array( 'name' => $weekdays[$dayNum], )); if(is_null($weekday)) return false; $beforeHourText = (property_exists($calendarEvent, 'description') ? $calendarEvent->description : ''); $eventHourDetails = array( 'event_id' => $event->ID, 'weekday_id' => $weekday->ID, 'start' => $startDate->format('H:i'), 'end' => $endDate->format('H:i'), 'before_hour_text' => $beforeHourText, ); return $eventHourDetails; } protected function prepareCalendarEvent(TT_Event_Hour $eventHour, $weekdays) { $dayNum = array_search(urldecode($eventHour->weekday_name), $weekdays)+1; $offset = $dayNum-$this->current_day; $time = strtotime(($offset!=0 ? $offset . ' days' : 'now')); $startTimeStr = date('Y-m-d', $time) . ' ' . $eventHour->start; $endTimeStr = date('Y-m-d', $time) . ' ' . $eventHour->end; $startDate = new DateTime($startTimeStr, $this->timezone); $endDate = new DateTime($endTimeStr, $this->timezone); $calendarEventDetails = array ( 'summary' => $eventHour->event_title, 'description' => $eventHour->before_hour_text, 'start' => array ( 'dateTime' => $startDate->format(DateTime::RFC3339), 'timeZone' => $this->timezone->getName(), ), 'end' => array ( 'dateTime' => $endDate->format(DateTime::RFC3339), 'timeZone' => $this->timezone->getName(), ), 'recurrence' => array ( 'RRULE:FREQ=WEEKLY;', ), ); return $calendarEventDetails; } protected function AddCalendarEvent($eventHourId, $calendarEventId) { if(!isset($this->events_mapping[$this->id])) { if(!is_array($this->events_mapping)) $this->events_mapping = array(); $this->events_mapping[$this->id] = array(); } foreach($this->events_mapping[$this->id] as $key=>$val) { if($val==$calendarEventId) unset($this->events_mapping[$this->id][$key]); } $this->events_mapping[$this->id][$eventHourId] = $calendarEventId; $this->SaveOptions(); } function GetWPTimezone() { $timezone_string = get_option('timezone_string'); if(!$timezone_string) { $gmt_offset = get_option('gmt_offset'); $timezone_string = timezone_name_from_abbr('', $gmt_offset*3600, false); if($timezone_string===false) $timezone_string = timezone_name_from_abbr('', 0, false); } return $timezone_string; } } PK!{Iweekday.class.phpnu[ 'timetable_weekdays', ); $parent_defaults = parent::GetDefaultFetchArgs(); $defaults += $parent_defaults; return $defaults; } protected static function GetDefaultCreateArgs() { $defaults = array( 'post_type' => 'timetable_weekdays', ); $parent_defaults = parent::GetDefaultCreateArgs(); $defaults += $parent_defaults; return $defaults; } }PK!(#LLbookings-list.class.phpnu[ __('Booking', 'timetable'), 'plural' => __('Bookings', 'timetable'), 'ajax' => false, )); if(isset($_REQUEST['deleted']) && $_REQUEST['deleted']) { add_action('admin_notices', array($this, 'booking_deleted_notice')); } } /** * Retrieve bookings data from the database * * @param int $per_page * @param int $page_number * * @return mixed */ public static function get_bookings($per_page=5, $page_number=1) { $args = array( 'per_page' => $per_page, 'page_number' => $page_number, ); if(isset($_REQUEST['order'])) $args['order'] = $_REQUEST['order']; if(isset($_REQUEST['orderby'])) $args['orderby'] = $_REQUEST['orderby']; $bookings = TT_DB::getBookings($args); return $bookings; } /** * Delete a booking record. * * @param int $id booking ID */ public static function delete_booking($id) { TT_DB::deleteBooking($id); } public function booking_deleted_notice() { $output = ''; $output .= '

' . __('Booking deleted.', 'timetable') . '

'; echo $output; } /** * Returns the count of records in the database. * * @return null|string */ public static function record_count() { global $wpdb; $query = 'SELECT COUNT(*) FROM ' . $wpdb->prefix . 'event_hours_booking'; return $wpdb->get_var( $query ); } /** Text displayed when no booking data is available */ public function no_items() { _e('No bookings avaliable.', 'timetable'); } /** * Method for name column * * @param array $item an array of DB data * * @return string */ function column_booking($item) { $delete_nonce = wp_create_nonce('sp_delete_booking'); $title = '' . sprintf(__('Booking #%d (%s)', 'timetable'), $item['booking_id'], $item['booking_datetime']) . ''; $actions = array( 'delete' => sprintf('Delete', esc_attr($_REQUEST['page']), 'delete', absint($item['booking_id']), $delete_nonce), ); return $title . $this->row_actions($actions); } /** * Render a column when no column specific method exists. * * @param array $item * @param string $column_name * * @return mixed */ public function column_default($item, $column_name) { switch($column_name) { case 'booking': return sprintf(__('Booking #%d (%s)', 'timetable'), $item['bookign_id'], $item['booking_datetime']); case 'date': return $item['weekday'] . '
' . $item['start'] . '-' . $item['end']; case 'event': return '' . $item['event_title'] . ''; case 'user': if($item['user_id']) { return '' . $item['user_name'] . ''; } else { $guest_info = array(); $guest_info[] = '' . $item['guest_email'] . ''; if($item['guest_name']!='') $guest_info[] = $item['guest_name']; if($item['guest_phone']!='') $guest_info[] = $item['guest_phone']; $guest_info = implode(', ', $guest_info); return sprintf(__('Guest (%s)', 'timetable'), $guest_info); } case 'message': return nl2br($item['guest_message']); default: return print_r($item, true); //Show the whole array for troubleshooting purposes } } /** * Render the bulk edit checkbox * * @param array $item * * @return string */ function column_cb($item) { return sprintf( '', $item['booking_id'] ); } /** * Associative array of columns * * @return array */ function get_columns() { $columns = array( 'cb' => '', 'booking' => __('Booking', 'timetable'), 'date' => __('Date', 'timetable'), 'event' => __('Event', 'timetable'), 'user' => __('User', 'timetable'), 'message' => __('Message', 'timetable'), ); return $columns; } /** * Columns to make sortable. * * @return array */ public function get_sortable_columns() { $sortable_columns = array( 'booking' => array('booking', true), 'date' => array('date', true), 'event' => array('event', true), 'user' => array('user', true), ); return $sortable_columns; } /** * Returns an associative array containing the bulk action * * @return array */ public function get_bulk_actions() { $actions = array( 'bulk-delete' => 'Delete', ); return $actions; } /** * Handles data query and filter, sorting, and pagination. */ public function prepare_items() { $this->_column_headers = $this->get_column_info(); $per_page = $this->get_items_per_page('bookings_per_page', 20); $current_page = $this->get_pagenum(); $total_items = self::record_count(); $this->set_pagination_args(array( 'total_items' => $total_items, 'per_page' => $per_page, )); $this->items = self::get_bookings($per_page, $current_page); } public function process_bulk_action() { if('delete'===$this->current_action()) { $nonce = esc_attr($_REQUEST['_wpnonce']); if(!wp_verify_nonce($nonce, 'sp_delete_booking')) { die(__('You\'re not allowed to perform this action.','timetable')); } else { self::delete_booking(absint($_GET['booking'])); $redirectUrl = add_query_arg(array( 'page' => 'timetable_admin_bookings', 'deleted' => 1, ), get_admin_url(get_current_blog_id(), 'admin.php')); wp_redirect($redirectUrl); exit; } } // If the delete bulk action is triggered if((isset($_POST['action']) && $_POST['action']=='bulk-delete') || (isset($_POST['action2']) && $_POST['action2'] == 'bulk-delete')) { $delete_ids = esc_sql($_POST['bulk-delete']); foreach($delete_ids as $id) { self::delete_booking($id); } $redirectUrl = add_query_arg(array( 'page' => 'timetable_admin_bookings', 'deleted' => 1, ), get_admin_url(get_current_blog_id(), 'admin.php')); wp_redirect($redirectUrl); exit; } } } PK!23## db.class.phpnu[ 0, 'user_id' => 0, 'guest_email' => '', ), $args); global $wpdb; $query = ''; $queryArgs = array(); $query .= 'SELECT TIME_FORMAT(eh.start, "%H.%i") AS start, TIME_FORMAT(eh.end, "%H.%i") AS end, eh.before_hour_text AS description_1, eh.after_hour_text AS description_2, e.post_title AS event_title, w.post_title AS column_title, COUNT(ehb.booking_id) AS booking_count, eh.available_places, eh.slots_per_user, COALESCE(ub.booking_count, 0) AS current_user_booking_count, COALESCE(gb.booking_count, 0) AS current_guest_booking_count FROM ' . $wpdb->prefix . 'event_hours AS eh LEFT JOIN ' . $wpdb->prefix . 'event_hours_booking AS ehb ON(ehb.event_hours_id=eh.event_hours_id) LEFT JOIN ' . $wpdb->posts . ' AS e ON(eh.event_id=e.ID) LEFT JOIN ' . $wpdb->posts . ' AS w ON(eh.weekday_id=w.ID) LEFT JOIN (SELECT event_hours_id, user_id, COUNT(booking_id) as booking_count FROM ' . $wpdb->prefix . 'event_hours_booking WHERE user_id= ' . (int)$args['user_id'] . ' AND user_id!=0 GROUP BY event_hours_id) AS ub ON eh.event_hours_id=ub.event_hours_id LEFT JOIN (SELECT b.event_hours_id, count(b.booking_id) AS booking_count FROM ' . $wpdb->prefix . 'event_hours_booking AS b LEFT JOIN ' . $wpdb->prefix . 'timetable_guests AS g ON (b.guest_id=g.guest_id) WHERE g.email="%s" GROUP BY b.event_hours_id) AS gb ON eh.event_hours_id=gb.event_hours_id WHERE 1=1'; $queryArgs[] = $args['guest_email']; if($args['event_hours_id']) { $query .= ' AND eh.event_hours_id=%d'; $queryArgs[] = $args['event_hours_id']; } $query = $wpdb->prepare($query, $queryArgs); $event_hour_details = $wpdb->get_results($query); return $event_hour_details; } public static function getBookings($args) { $args = shortcode_atts(array( 'booking_id' => 0, 'bookings_ids' => null, 'weekdays_ids' => null, 'event_hours_ids' => null, 'booked_past' => 0, 'validation_code' => '', 'event_id' => 0, 'events_ids' => null, 'per_page' => 0, 'page_number' => 1, 'order' => 'DESC', 'orderby' => 'booking', ), $args); global $wpdb; $query = ''; $queryArgs = array(); $query .= 'SELECT booking.booking_id AS booking_id, booking.booking_datetime AS booking_datetime, booking.validation_code, event.ID AS event_id, event.post_title AS event_title, event_hour.event_hours_id, TIME_FORMAT(event_hour.start, "%H:%i") AS start, TIME_FORMAT(event_hour.end, "%H:%i") AS end, event_hour.before_hour_text as event_description_1, event_hour.after_hour_text as event_description_2, weekday.post_title AS weekday, user.ID AS user_id, user.user_login, user.display_name AS user_name, user.user_email, guest.guest_id AS guest_id, guest.name AS guest_name, guest.email AS guest_email, guest.phone AS guest_phone, guest.message AS guest_message FROM ' . $wpdb->prefix . 'event_hours_booking AS booking LEFT JOIN ' . $wpdb->prefix . 'event_hours AS event_hour ON (event_hour.event_hours_id=booking.event_hours_id) LEFT JOIN ' . $wpdb->posts . ' AS event ON (event.ID=event_hour.event_id) LEFT JOIN ' . $wpdb->posts . ' AS weekday ON (weekday.ID=event_hour.weekday_id) LEFT JOIN ' . $wpdb->users . ' AS user ON (user.ID=booking.user_id) LEFT JOIN ' . $wpdb->prefix . 'timetable_guests AS guest ON (guest.guest_id=booking.guest_id) WHERE 1=1 '; if($args['event_id']) { $query .= ' AND event_hour.event_id=%d'; $queryArgs[] = (int)$args['event_id']; } if($args['events_ids']) { $query .= ' AND event.ID IN ('; foreach($args['events_ids'] as $event_ids) { $query .= '%d,'; $queryArgs[] = (int)$event_ids; } $query = rtrim($query, ','); $query .= ')'; } if($args['booking_id']) { $query .= ' AND booking.booking_id=%d'; $queryArgs[] = (int)$args['booking_id']; } if($args['bookings_ids']) { $query .= ' AND booking.booking_id IN ('; foreach($args['bookings_ids'] as $booking_id) { $query .= '%d,'; $queryArgs[] = (int)$booking_id; } $query = rtrim($query, ','); $query .= ')'; } if($args['validation_code']) { $query .= ' AND booking.validation_code=%s'; $queryArgs[] = $args['validation_code']; } if($args['weekdays_ids']) { $query .= ' AND weekday.ID IN ('; foreach($args['weekdays_ids'] as $weekday_ids) { $query .= '%d,'; $queryArgs[] = (int)$weekday_ids; } $query = rtrim($query, ','); $query .= ')'; } if($args['event_hours_ids']) { $query .= ' AND event_hour.event_hours_id IN ('; foreach($args['event_hours_ids'] as $event_hours_ids) { $query .= '%d,'; $queryArgs[] = (int)$event_hours_ids; } $query = rtrim($query, ','); $query .= ')'; } if((int)$args['booked_past']) { $query .= ' AND booking_datetime<(STR_TO_DATE(CONCAT(CURDATE(), start), "%%Y-%%m-%%d %%H:%%i"))'; } $order = ($args && strtolower($args['order'])!='desc' ? 'ASC' : 'DESC'); if($args['orderby']) { switch($args['orderby']) { case 'booking': $query .= ' ORDER BY booking_datetime ' . $order . ', booking_id ' . $order; break; case 'date': $query .= ' ORDER BY weekday.menu_order ' . $order . ', start ' . $order . ', end ' . $order . ''; break; case 'event': $query .= ' ORDER BY event_title ' . $order; break; case 'user': $query .= ' ORDER BY user_name ' . $order; break; } } else { $query .= ' ORDER BY booking_id ' . $order; } if($args['per_page']) { $query .= ' LIMIT %d'; $queryArgs[] = $args['per_page']; } if($offset = ($args['page_number'] - 1) * $args['per_page']) { $query .= ' OFFSET %d'; $queryArgs[] = $offset; } $query = $wpdb->prepare($query, $queryArgs); $result = $wpdb->get_results($query, 'ARRAY_A'); return $result; } public static function deleteBooking($booking_id) { global $wpdb; $query = $wpdb->prepare('DELETE FROM `' . $wpdb->prefix . 'event_hours_booking` WHERE booking_id=%d', $booking_id); $result = $wpdb->query($query); return $result; } public static function createBooking($args) { $args = shortcode_atts(array( 'event_hour_id' => 0, 'user_id' => 0, 'booking_date' => '', 'guest_id' => 0, 'validation_code' => '' ), $args); global $wpdb; $query = ''; $queryArgs = array(); $query = 'INSERT INTO ' . $wpdb->prefix . 'event_hours_booking(event_hours_id, user_id, booking_datetime, validation_code, guest_id) VALUES (%d, %d, %s, %s, %d)'; $queryArgs[] = $args['event_hour_id']; $queryArgs[] = $args['user_id']; $queryArgs[] = $args['booking_date']; $queryArgs[] = $args['validation_code']; $queryArgs[] = $args['guest_id']; $query = $wpdb->prepare($query, $queryArgs); $wpdb->query($query); return $wpdb->insert_id; } public static function createGuest($args) { $args = shortcode_atts(array( 'guest_name' => '', 'guest_email' => '', 'guest_phone' => '', 'guest_message' => '', ), $args); global $wpdb; $query = ''; $queryArgs = array(); $query .= 'INSERT INTO ' . $wpdb->prefix . 'timetable_guests(name, email, phone, message) VALUES (%s, %s, %s, %s)'; $queryArgs[] = $args['guest_name']; $queryArgs[] = $args['guest_email']; $queryArgs[] = $args['guest_phone']; $queryArgs[] = $args['guest_message']; $query = $wpdb->prepare($query, $queryArgs); $wpdb->query($query); $guest_id = $wpdb->insert_id; return $guest_id; } public static function getEventHoursForGoogleCalendar($event, $weekday) { global $wpdb; $query = ''; $queryArgs = array(); $query .= 'SELECT eh.event_hours_id AS event_hour_id, TIME_FORMAT(eh.start, "%H:%i") AS start, TIME_FORMAT(eh.end, "%H:%i") AS end, eh.before_hour_text AS description_1, eh.after_hour_text AS description_2, e.ID AS event_id, e.post_title AS event_title, w.post_title AS column_title, w.post_name AS column_name FROM ' . $wpdb->prefix . 'event_hours AS eh LEFT JOIN ' . $wpdb->posts . ' AS e ON(eh.event_id=e.ID) LEFT JOIN ' . $wpdb->posts . ' AS w ON(eh.weekday_id=w.ID) WHERE 1 = 1'; if($event) { $query .= ' AND e.post_name IN ('; $temp = array(); foreach($event as $val) { $temp[] = '%s'; $queryArgs[] = $val; } $query .= implode(',', $temp); $query .= ')'; } if($weekday) { $query .= ' AND w.post_name IN ('; $temp = array(); foreach($weekday as $val) { if($val=='') continue; $temp[] = '%s'; $queryArgs[] = $val; } $query .= implode(',', $temp); $query .= ')'; } $query = $wpdb->prepare($query, $queryArgs); $result = $wpdb->get_results($query, 'ARRAY_A'); return $result; } } PK!e sp-bookings.class.phpnu[ 'Bookings', 'default' => 20, 'option' => 'bookings_per_page', ); add_screen_option($option, $args); $this->BookingsList = new TT_Bookings_List(); $this->BookingsList->process_bulk_action(); } public function bookings_page() { ?>

BookingsList->prepare_items(); $this->BookingsList->display(); ?>
-1, 'nopaging' => true, 'orderby' => 'title', 'order' => 'ASC', 'post_type' => $timetable_events_settings['slug'] )); //fetch a list of weekdays $weekdays_list = get_posts(array( 'posts_per_page' => -1, 'nopaging' => true, 'orderby' => 'menu_order', 'order' => 'ASC', 'post_type' => 'timetable_weekdays' )); ?>

$events, 'weekdays_ids' => $weekdays, )); $exportFileName = 'bookings.csv'; $data = ''; $dataArray = array(); $dataArray[] = __('ID','timetable'); $dataArray[] = __('Event','timetable'); $dataArray[] = __('Weekday','timetable'); $dataArray[] = __('Start','timetable'); $dataArray[] = __('End','timetable'); $dataArray[] = __('Type','timetable'); $dataArray[] = __('Name','timetable'); $dataArray[] = __('E-mail','timetable'); $dataArray[] = __('Phone','timetable'); $dataArray[] = __('Message','timetable'); $data .= implode(chr(9),$dataArray) . "\r\n"; if($bookings) { foreach($bookings as $booking) { $dataArray = array(); $dataArray[] = $booking['booking_id']; $dataArray[] = $booking['event_title']; $dataArray[] = $booking['weekday']; $dataArray[] = $booking['start']; $dataArray[] = $booking['end']; if($booking['user_id']) { $dataArray[] = sprintf(__('Logged in (%s)', 'timetable'), $booking['user_login']); $dataArray[] = $booking['user_name']; $dataArray[] = $booking['user_email']; $dataArray[] = ''; //empty for phone column $dataArray[] = ''; //empty for message column } else { $dataArray[] = __('Guest', 'timetable'); $dataArray[] = $booking['guest_name']; $dataArray[] = $booking['guest_email']; $dataArray[] = $booking['guest_phone']; $dataArray[] = $booking['guest_message']; } for($i=0, $max_i=count($dataArray); $i<$max_i; $i++) $dataArray[$i] = preg_replace('/\s+/', ' ', $dataArray[$i]); $data .= implode(chr(9),$dataArray)."\r\n"; } } header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); header('Cache-Control: public'); header('Content-Encoding: UTF-8'); header('Content-Type: text/csv; charset=UTF-8'); header('Content-Transfer-Encoding: Binary'); header('Content-Length:' . strlen($data)); header('Content-Disposition: attachment;filename=' . $exportFileName); echo "\xEF\xBB\xBF"; echo $data; die(); } } PK!Q post.class.phpnu[SetDefaults(); } public static function CreateFromWpObject(WP_Post $WpPost) { $post = new static(); $post->ID = $WpPost->ID; $post->post_title = $WpPost->post_title; $post->post_name = $WpPost->post_name; $post->post_status = $WpPost->post_status; $post->post_type = $WpPost->post_type; $post->menu_order = $WpPost->menu_order; return $post; } public static function Insert(TT_Post $post) { $args = array( 'post_title' => $post->post_title, 'post_name' => $post->post_name, 'post_type' => $post->post_type, 'post_status' => $post->post_status, 'menu_order' => $post->menu_order, ); $result = wp_insert_post($args); return $result; } public static function Fetch($args = array()) { $defaults = static::GetDefaultFetchArgs(); $args += $defaults; $result = get_posts($args); if(!$result) return null; $posts = array(); foreach($result as $key=>$WpPost) $posts[] = static::CreateFromWpObject($WpPost); return $posts; } public static function FetchOne($args = array()) { $result = static::Fetch($args); if(is_null($result)) return null; return $result[0]; } public static function FetchOneById($Id) { return static::FetchOne(array( 'post__in' => array($Id), )); } protected function SetDefaults() { $defaults = static::GetDefaults(); $this->ID = $defaults['ID']; $this->post_title = $defaults['post_title']; $this->post_name = $defaults['post_name']; $this->post_type = $defaults['post_type']; $this->post_status = $defaults['post_status']; $this->menu_order = $defaults['menu_order']; } protected static function GetDefaults() { return array( 'ID' => 0, 'post_title' => '', 'post_name' => '', 'post_type' => 'post', 'post_status' => 'publish', 'menu_order' => 0, ); } protected static function GetDefaultFetchArgs() { $defaults = array( 'posts_per_page' => -1, 'nopaging' => true, 'orderby' => 'date', 'order' => 'DESC', 'post_type' => 'post', 'post_status' => 'publish', ); return $defaults; } protected static function GetDefaultCreateArgs() { $defaults = array( 'post_type' => 'post', 'post_status' => 'publish', ); return $defaults; } }PK!  ɥevent.class.phpnu[PK!](](event-hour.class.phpnu[PK! N}U3U3,google-calendar.class.phpnu[PK!{I#`weekday.class.phpnu[PK!(#LLUbbookings-list.class.phpnu[PK!23## zdb.class.phpnu[PK!e sp-bookings.class.phpnu[PK!Q post.class.phpnu[PK