lang}/mods/portal/" */ public $language = 'portal_calendar_module'; /** * custom acp template * file must be in "adm/style/portal/" */ public $custom_acp_tpl = 'acp_portal_calendar'; /** * additional variables */ protected $mini_cal_fdow; protected $mini_cal_month; /** * User datetime object */ protected $time; /** * constants */ const TIME_DAY = 86400; const DAYS_PER_WEEK = 6; // indexes start at 0 const MONTHS_PER_YEAR = 12; /** @var int year in numeric format (YYYY) */ protected $dateYYYY; /** @var int month in numeric format (MM) */ protected $dateMM; /** @var int day in numeric format (DD) */ protected $dateDD; /** @var string extended month (e.g. February) */ protected $ext_dateMM; /** @var int count of days in month */ protected $daysMonth; /** @var int timestamp */ protected $stamp; /** @var array return array s.a. */ protected $day; /** @var \phpbb\config\config */ protected $config; /** @var \phpbb\template\template */ protected $template; /** @var \phpbb\db\driver\driver_interface */ protected $db; /** @var \phpbb\request\request_interface */ protected $request; /** @var string PHP file extension */ protected $php_ext; /** @var string phpBB root path */ protected $phpbb_root_path; /** @var \phpbb\user */ protected $user; /** @var \phpbb\path_helper */ protected $path_helper; /** @var string Portal root path */ protected $portal_root_path; /** @var \phpbb\log\log phpBB log */ protected $log; /** @var \board3\portal\includes\modules_helper */ protected $modules_helper; /** * Construct a calendar object * * @param \phpbb\config\config $config phpBB config * @param \board3\portal\includes\modules_helper $modules_helper Modules helper * @param \phpbb\template\template $template phpBB template * @param \phpbb\db\driver\driver_interface $db Database driver * @param \phpbb\request\request_interface $request phpBB request * @param string $phpEx php file extension * @param string $phpbb_root_path phpBB root path * @param \phpbb\user $user phpBB user object * @param \phpbb\path_helper $path_helper phpBB path helper * @param \phpbb\log\log $log phpBB log object */ public function __construct($config, $modules_helper, $template, $db, $request, $phpbb_root_path, $phpEx, $user, $path_helper, $log) { $this->config = $config; $this->modules_helper = $modules_helper; $this->template = $template; $this->db = $db; $this->request = $request; $this->php_ext = $phpEx; $this->phpbb_root_path = $phpbb_root_path; $this->user = $user; $this->path_helper = $path_helper; $this->log = $log; $this->portal_root_path = $this->path_helper->get_web_root_path() . $this->phpbb_root_path . 'ext/board3/portal/'; } /** * {@inheritdoc} */ public function get_template_side($module_id) { $portal_config = obtain_portal_config(); // 0 = Sunday first - 1 = Monday first. ;-) if ($this->config['board3_sunday_first_' . $module_id]) { $this->mini_cal_fdow = 0; } else { $this->mini_cal_fdow = 1; } // get the calendar month $this->mini_cal_month = 0; if ($this->request->is_set('m' . $module_id)) { $this->mini_cal_month = $this->request->variable('m' . $module_id, 0); } // initialise some variables $this->time = $this->user->create_datetime(); $now = phpbb_gmgetdate($this->time->getTimestamp() + $this->time->getOffset()); $today_timestamp = $now[0]; $mini_cal_today = date('Ymd', $today_timestamp - date('Z')); $this->stamp = (int) $today_timestamp; $s_cal_month = ($this->mini_cal_month != 0) ? $this->mini_cal_month . ' month' : $mini_cal_today; $this->get_month($s_cal_month); $mini_cal_count = $this->mini_cal_fdow; $mini_cal_this_year = $this->dateYYYY; $mini_cal_this_month = $this->dateMM; $mini_cal_month_days = $this->daysMonth; // output our general calendar bits $down = $this->mini_cal_month - 1; $up = $this->mini_cal_month + 1; $prev_month = '<<'; $next_month = '>>'; $this->template->assign_block_vars('minical', array( 'S_SUNDAY_FIRST' => ($this->config['board3_sunday_first_' . $module_id]) ? true : false, 'L_MINI_CAL_MONTH' => (($this->config['board3_long_month_' . $module_id]) ? $this->user->lang['mini_cal']['long_month'][$this->day[0][1]] : $this->user->lang['mini_cal']['month'][$this->day[0][1]]) . " " . $this->day[0][2], 'L_MINI_CAL_SUN' => '' . $this->user->lang['mini_cal']['day'][1] . '', 'L_MINI_CAL_MON' => $this->user->lang['mini_cal']['day'][2], 'L_MINI_CAL_TUE' => $this->user->lang['mini_cal']['day'][3], 'L_MINI_CAL_WED' => $this->user->lang['mini_cal']['day'][4], 'L_MINI_CAL_THU' => $this->user->lang['mini_cal']['day'][5], 'L_MINI_CAL_FRI' => $this->user->lang['mini_cal']['day'][6], 'L_MINI_CAL_SAT' => $this->user->lang['mini_cal']['day'][7], 'U_PREV_MONTH' => $prev_month, 'U_NEXT_MONTH' => $next_month, 'S_DISPLAY_EVENTS' => ($this->config['board3_display_events_' . $module_id]) ? true : false, 'MODULE_ID' => $module_id, )); // output the days for the current month for ($i = 0; $i < $mini_cal_month_days;) { // is this the first day of the week? if ($mini_cal_count == $this->mini_cal_fdow) { $this->template->assign_block_vars('minical.mini_cal_row', array( 'MODULE_ID' => $module_id, )); } // is this a valid weekday? if ($mini_cal_count == ($this->day[$i][3])) { $mini_cal_this_day = $this->day[$i][0]; $d_mini_cal_today = $mini_cal_this_year . (($mini_cal_this_month <= 9) ? '0' . $mini_cal_this_month : $mini_cal_this_month) . (($mini_cal_this_day <= 9) ? '0' . $mini_cal_this_day : $mini_cal_this_day); $mini_cal_day = ($mini_cal_today == $d_mini_cal_today) ? '' . $mini_cal_this_day . '' : $mini_cal_this_day; $this->template->assign_block_vars('minical.mini_cal_row.mini_cal_days', array( 'MINI_CAL_DAY' => ($mini_cal_count == 0) ? '' . $mini_cal_day . '' : $mini_cal_day) ); $i++; } // no day else { $this->template->assign_block_vars('minical.mini_cal_row.mini_cal_days', array( 'MINI_CAL_DAY' => ' ') ); } // is this the last day of the week? if ($mini_cal_count == self::DAYS_PER_WEEK) { // if so then reset the count $mini_cal_count = 0; } else { // otherwise increment the count $mini_cal_count++; } } // fill table with empty strings while ($mini_cal_count <= self::DAYS_PER_WEEK) { $this->template->assign_block_vars('minical.mini_cal_row.mini_cal_days', array( 'MINI_CAL_DAY' => ' ') ); $mini_cal_count++; } /* * Let's start displaying the events * make sure we only display events in the future */ $events = $this->utf_unserialize($portal_config['board3_calendar_events_' . $module_id]); if (!empty($events) && $this->config['board3_display_events_' . $module_id]) { $time_ary = array(); // we sort the $events array by the start time foreach ($events as $key => $cur_event) { $time_ary[$key] = $cur_event['start_time']; } array_multisort($time_ary, SORT_NUMERIC, $events); $groups_ary = get_user_groups(); foreach ($events as $key => $cur_event) { if (($cur_event['start_time'] + $this->time->getOffset()) >= $today_timestamp || ($cur_event['end_time'] + $this->time->getOffset()) >= $today_timestamp || (($cur_event['start_time'] + $this->time->getOffset() + self::TIME_DAY) >= $today_timestamp && $cur_event['all_day'])) { $cur_permissions = explode(',', $cur_event['permission']); $permission_check = array_intersect($groups_ary, $cur_permissions); if (!empty($permission_check) || $cur_event['permission'] == '') { // check if this is an external link if (isset($cur_event['url']) && strpos($cur_event['url'], generate_board_url()) === false) { $is_external = true; } else { $is_external = false; } /** * Current events * * Events are treated as current if the following is met: * - We have an all day event and the start of that event is less than 1 day (86400 seconds) away * - We have a normal event with a start that is less then 1 day away and that hasn't ended yet */ if ((($cur_event['start_time'] + $this->time->getOffset() - $today_timestamp) <= self::TIME_DAY && $cur_event['all_day']) || (($cur_event['start_time'] + $this->time->getOffset() - $today_timestamp) <= self::TIME_DAY && ($cur_event['end_time'] + $this->time->getOffset()) >= $today_timestamp)) { $this->template->assign_block_vars('minical.cur_events', array( 'EVENT_URL' => (isset($cur_event['url']) && $cur_event['url'] != '') ? $this->validate_url($cur_event['url']) : '', 'EVENT_TITLE' => $cur_event['title'], 'START_TIME' => $this->user->format_date($cur_event['start_time'], 'j. M Y, H:i'), 'END_TIME' => (!empty($cur_event['end_time'])) ? $this->user->format_date($cur_event['end_time'], 'j. M Y, H:i') : false, 'EVENT_DESC' => (isset($cur_event['desc']) && $cur_event['desc'] != '') ? $cur_event['desc'] : '', 'ALL_DAY' => ($cur_event['all_day']) ? true : false, 'MODULE_ID' => $module_id, 'EVENT_URL_NEW_WINDOW' => ($is_external && $this->config['board3_events_url_new_window_' . $module_id]) ? true : false, )); } else { $this->template->assign_block_vars('minical.upcoming_events', array( 'EVENT_URL' => (isset($cur_event['url']) && $cur_event['url'] != '') ? $this->validate_url($cur_event['url']) : '', 'EVENT_TITLE' => $cur_event['title'], 'START_TIME' => $this->user->format_date($cur_event['start_time'], 'j. M Y, H:i'), 'END_TIME' => (!$cur_event['all_day']) ? $this->user->format_date($cur_event['end_time'], 'j. M Y, H:i') : '', 'EVENT_DESC' => (isset($cur_event['desc']) && $cur_event['desc'] != '') ? $cur_event['desc'] : '', 'ALL_DAY' => (($cur_event['start_time'] - $cur_event['end_time']) == 1) ? true : false, 'MODULE_ID' => $module_id, 'EVENT_URL_NEW_WINDOW' => ($is_external && $this->config['board3_events_url_new_window_' . $module_id]) ? true : false, )); } } } } } return 'calendar_side.html'; } /** * {@inheritdoc} */ public function get_template_acp($module_id) { return array( 'title' => 'ACP_PORTAL_CALENDAR', 'vars' => array( 'legend1' => 'ACP_PORTAL_CALENDAR', 'board3_calendar_today_color_' . $module_id => array('lang' => 'PORTAL_CALENDAR_TODAY_COLOR' , 'validate' => 'string', 'type' => 'text:10:10', 'explain' => true), 'board3_calendar_sunday_color_' . $module_id => array('lang' => 'PORTAL_CALENDAR_SUNDAY_COLOR' , 'validate' => 'string', 'type' => 'text:10:10', 'explain' => true), 'board3_long_month_' . $module_id => array('lang' => 'PORTAL_LONG_MONTH' , 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'board3_sunday_first_' . $module_id => array('lang' => 'PORTAL_SUNDAY_FIRST' , 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'board3_display_events_' . $module_id => array('lang' => 'PORTAL_DISPLAY_EVENTS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'board3_events_url_new_window_' . $module_id => array('lang' => 'PORTAL_EVENTS_URL_NEW_WINDOW', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'board3_events_' . $module_id => array('lang' => 'PORTAL_EVENTS_MANAGE', 'validate' => 'string', 'type' => 'custom', 'explain' => false, 'method' => 'manage_events', 'submit' => 'update_events'), ), ); } /** * {@inheritdoc} */ public function install($module_id) { $this->config->set('board3_sunday_first_' . $module_id, 1); $this->config->set('board3_calendar_today_color_' . $module_id, '#000000'); $this->config->set('board3_calendar_sunday_color_' . $module_id, '#FF0000'); $this->config->set('board3_long_month_' . $module_id, 0); $this->config->set('board3_display_events_' . $module_id, 0); $this->config->set('board3_events_' . $module_id, ''); $this->config->set('board3_events_url_new_window_' . $module_id, 0); set_portal_config('board3_calendar_events_' . $module_id, ''); return true; } /** * {@inheritdoc} */ public function uninstall($module_id, $db) { $del_config = array( 'board3_calendar_events_' . $module_id, ); $sql = 'DELETE FROM ' . PORTAL_CONFIG_TABLE . ' WHERE ' . $db->sql_in_set('config_name', $del_config); $db->sql_query($sql); $del_config = array( 'board3_sunday_first_' . $module_id, 'board3_calendar_today_color_' . $module_id, 'board3_calendar_sunday_color_' . $module_id, 'board3_long_month_' . $module_id, 'board3_display_events_' . $module_id, 'board3_events_' . $module_id, 'board3_events_url_new_window_' . $module_id, ); $sql = 'DELETE FROM ' . CONFIG_TABLE . ' WHERE ' . $db->sql_in_set('config_name', $del_config); return $db->sql_query($sql); } /** * Manage events * * @param mixed $value Value of input * @param string $key Key name * @param int $module_id Module ID * * @return null */ public function manage_events($value, $key, $module_id) { $action = $this->request->variable('action', ''); $action = ($this->request->is_set_post('add')) ? 'add' : $action; $action = ($this->request->is_set_post('save')) ? 'save' : $action; $link_id = $this->request->variable('id', 99999999); // 0 will trigger unwanted behavior, therefore we set a number we should never reach $portal_config = obtain_portal_config(); $events = (strlen($portal_config['board3_calendar_events_' . $module_id]) >= 1) ? $this->utf_unserialize($portal_config['board3_calendar_events_' . $module_id]) : array(); // append_sid() adds adm/ already, no need to add it here $u_action = append_sid('index.' . $this->php_ext, 'i=\board3\portal\acp\portal_module&mode=config&module_id=' . $module_id); switch ($action) { // Save changes case 'save': if (!check_form_key('acp_portal')) { trigger_error($this->user->lang['FORM_INVALID']. adm_back_link($u_action), E_USER_WARNING); } $event_title = $this->request->variable('event_title', ' ', true); $event_desc = $this->request->variable('event_desc', ' ', true); $event_start_date = trim($this->request->variable('event_start_date', '')); $event_end_date = trim($this->request->variable('event_end_date', '')); $event_all_day = $this->request->variable('event_all_day', false); // default to false $event_url = $this->request->variable('event_url', ' '); $event_permission = $this->request->variable('permission-setting-calendar', array(0 => '')); $groups_ary = array(); // Now get the unix timestamps out of the entered information $start_time = $this->date_to_time($event_start_date); $end_time = (!$event_all_day) ? $this->date_to_time($event_end_date) : ''; if (!$start_time) { trigger_error($this->user->lang['ACP_PORTAL_CALENDAR_START_INCORRECT']. adm_back_link($u_action), E_USER_WARNING); } else if (!$event_all_day && !$end_time) { trigger_error($this->user->lang['ACP_PORTAL_CALENDAR_END_INCORRECT']. adm_back_link($u_action), E_USER_WARNING); } if (($end_time) <= time() && !(($start_time + self::TIME_DAY) >= time() && $event_all_day)) { trigger_error($this->user->lang['ACP_PORTAL_CALENDAR_EVENT_PAST']. adm_back_link($u_action), E_USER_WARNING); } else if ($end_time < $start_time && !$event_all_day) { trigger_error($this->user->lang['ACP_PORTAL_CALENDAR_EVENT_START_FIRST']. adm_back_link($u_action), E_USER_WARNING); } // get groups and check if the selected groups actually exist $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . ' ORDER BY group_id ASC'; $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { $groups_ary[] = $row['group_id']; } $this->db->sql_freeresult($result); $event_permission = array_intersect($event_permission, $groups_ary); $event_permission = implode(',', $event_permission); // Check for errors if (!$event_title) { trigger_error($this->user->lang['NO_EVENT_TITLE'] . adm_back_link($u_action), E_USER_WARNING); } if (!$start_time || $start_time == 0) { trigger_error($this->user->lang['NO_EVENT_START'] . adm_back_link($u_action), E_USER_WARNING); } // overwrite already existing events and make sure we don't try to save an event outside of the normal array size of $events if (isset($link_id) && $link_id < sizeof($events)) { $message = $this->user->lang['EVENT_UPDATED']; $events[$link_id] = array( 'title' => $event_title, 'desc' => $event_desc, 'start_time' => $start_time, 'end_time' => $end_time, 'all_day' => $event_all_day, 'permission' => $event_permission, 'url' => htmlspecialchars_decode($event_url), ); $this->log->add('admin', $this->user->data['user_id'], $this->user->data['user_ip'], 'LOG_PORTAL_EVENT_UPDATED', false, array($event_title)); } else { $message = $this->user->lang['EVENT_ADDED']; $events[] = array( 'title' => $event_title, 'desc' => $event_desc, 'start_time' => $start_time, 'end_time' => $end_time, 'all_day' => $event_all_day, 'permission' => $event_permission, 'url' => $event_url, // optional ); $this->log->add('admin', $this->user->data['user_id'], $this->user->data['user_ip'], 'LOG_PORTAL_EVENT_ADDED', false, array($event_title)); } $time_ary = array(); // we sort the $events array by the start time foreach ($events as $key => $cur_event) { $time_ary[$key] = $cur_event['start_time']; } array_multisort($time_ary, SORT_NUMERIC, $events); $board3_events_array = serialize($events); set_portal_config('board3_calendar_events_' . $module_id, $board3_events_array); trigger_error($message . adm_back_link($u_action)); break; // Delete link case 'delete': if (!isset($link_id) && $link_id >= sizeof($events)) { trigger_error($this->user->lang['NO_EVENT'] . adm_back_link($u_action), E_USER_WARNING); } if (confirm_box(true)) { $cur_event_title = $events[$link_id]['title']; // delete the selected link and reset the array numbering afterwards array_splice($events, $link_id, 1); $events = array_merge($events); $board3_events_array = serialize($events); set_portal_config('board3_calendar_events_' . $module_id, $board3_events_array); $this->log->add('admin', $this->user->data['user_id'], $this->user->data['user_ip'], 'LOG_PORTAL_EVENT_REMOVED', false, array($cur_event_title)); } else { confirm_box(false, $this->user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( 'link_id' => $link_id, 'action' => 'delete', ))); } break; // Edit or add menu item case 'edit': case 'add': $event_all_day = (isset($events[$link_id]['all_day']) && $events[$link_id]['all_day'] == true) ? true : false; $date_format = str_replace(array('D '), '', $this->user->data['user_dateformat']); $this->template->assign_vars(array( 'EVENT_TITLE' => (isset($events[$link_id]['title']) && $action != 'add') ? $events[$link_id]['title'] : '', 'EVENT_DESC' => (isset($events[$link_id]['desc']) && $action != 'add') ? $events[$link_id]['desc'] : '', 'EVENT_START_DATE' => ($action != 'add') ? $this->user->format_date($events[$link_id]['start_time'], $date_format) : '', 'EVENT_END_DATE' => ($action != 'add' && !$event_all_day) ? $this->user->format_date($events[$link_id]['end_time'], $date_format) : '', 'EVENT_ALL_DAY' => (isset($events[$link_id]['all_day']) && $events[$link_id]['all_day'] == true) ? true : false, 'EVENT_URL' => (isset($events[$link_id]['url']) && $action != 'add') ? $events[$link_id]['url'] : '', //'U_BACK' => $u_action, 'B3P_U_ACTION' => $u_action . '&id=' . $link_id, 'S_EDIT' => true, )); $groups_ary = (isset($events[$link_id]['permission'])) ? explode(',', $events[$link_id]['permission']) : array(); // get group info from database and assign the block vars $sql = 'SELECT group_id, group_name FROM ' . GROUPS_TABLE . ' ORDER BY group_id ASC'; $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { $this->template->assign_block_vars('permission_setting_calendar', array( 'SELECTED' => (in_array($row['group_id'], $groups_ary)) ? true : false, 'GROUP_NAME' => (isset($this->user->lang['G_' . $row['group_name']])) ? $this->user->lang['G_' . $row['group_name']] : $row['group_name'], 'GROUP_ID' => $row['group_id'], )); } $this->db->sql_freeresult($result); return; } for ($i = 0; $i < sizeof($events); $i++) { $event_all_day = ($events[$i]['all_day'] == true) ? true : false; $start_time_format = (!intval($this->user->format_date($events[$i]['start_time'], 'H')) && !intval($this->user->format_date($events[$i]['start_time'], 'i'))) ? 'j. M Y' : 'j. M Y, H:i'; if (!empty($events[$i]['end_time'])) { $end_time_format = (!intval($this->user->format_date($events[$i]['end_time'], 'H')) && !intval($this->user->format_date($events[$i]['end_time'], 'i'))) ? 'j. M Y' : 'j. M Y, H:i'; } $this->template->assign_block_vars('events', array( 'EVENT_TITLE' => ($action != 'add') ? ((isset($this->user->lang[$events[$i]['title']])) ? $this->user->lang[$events[$i]['title']] : $events[$i]['title']) : '', 'EVENT_DESC' => ($action != 'add') ? $events[$i]['desc'] : '', 'EVENT_START' => ($action != 'add') ? $this->user->format_date($events[$i]['start_time'], $start_time_format) : '', 'EVENT_END' => ($action != 'add' && !$event_all_day && !empty($end_time_format)) ? $this->user->format_date($events[$i]['end_time'], $end_time_format) : '', 'EVENT_URL' => ($action != 'add' && isset($events[$i]['url']) && !empty($events[$i]['url'])) ? $this->validate_url($events[$i]['url']) : '', 'EVENT_URL_RAW' => ($action != 'add' && isset($events[$i]['url']) && !empty($events[$i]['url'])) ? $events[$i]['url'] : '', 'U_EDIT' => $u_action . '&action=edit&id=' . $i, 'U_DELETE' => $u_action . '&action=delete&id=' . $i, 'EVENT_ALL_DAY' => $event_all_day, )); } } /** * Update events * * @param string $key Key name * @param int $module_id Module ID * * @return null */ public function update_events($key, $module_id) { $this->manage_events('', $key, $module_id); } /** * Convert date->timestamp to time * * @param string $date Date to convert * * @return int Converted time */ protected function make_timestamp($date) { $this->stamp = strtotime($date); return $this->stamp; } /** * Get date listed in array * * @param string $call_date Date * * @return null */ protected function get_month($call_date) { $this->make_timestamp($call_date); // last or first day of some months need to be treated in a special way if (!empty($this->mini_cal_month)) { $time = $this->user->create_datetime(); $now = phpbb_gmgetdate($time->getTimestamp() + $time->getOffset()); $today_timestamp = $now[0]; $cur_month = date("n", $today_timestamp); $correct_month = $cur_month + $this->mini_cal_month; // move back or forth the correct number of years while ($correct_month < 1 || $correct_month > self::MONTHS_PER_YEAR) { $correct_month = ($correct_month < 1) ? $correct_month + self::MONTHS_PER_YEAR : $correct_month - self::MONTHS_PER_YEAR; } // fix incorrect months while (date("n", $this->stamp) != $correct_month) { // Go back one day or move forward in order to // get to the correct month $this->stamp = (date("n", $this->stamp) > $correct_month) ? $this->stamp - self::TIME_DAY : $this->stamp + self::TIME_DAY; } } $this->dateYYYY = (int) date("Y", $this->stamp); $this->dateMM = (int) date("n", $this->stamp); $this->ext_dateMM = date("F", $this->stamp); $this->dateDD = (int) date("d", $this->stamp); $this->daysMonth = (int) date("t", $this->stamp); for ($i = 1; $i < $this->daysMonth + 1; $i++) { $this->make_timestamp("$i {$this->ext_dateMM} {$this->dateYYYY}"); $this->day[] = array( '0' => "$i", '1' => $this->dateMM, '2' => $this->dateYYYY, '3' => date('w', $this->stamp) ); } } /** * Unserialize links array * * @param string $serial_str Serialized string * * @return array Unserialized string */ private function utf_unserialize($serial_str) { $out = preg_replace_callback('!s:(\d+):"(.*?)";!s', function ($result) { return 's:' . strlen($result[2]) . ":\"{$result[2]}\";"; }, $serial_str); return unserialize($out); } /** * Validate URLs and execute apppend_sid if necessary * * @param string $url URL to process * * @return string Processed URL */ protected function validate_url($url) { $url = str_replace("\r\n", "\n", str_replace('\"', '"', trim($url))); $url = str_replace(' ', '%20', $url); $url = str_replace('&', '&', $url); // if there is no scheme, then add http schema if (!preg_match('#^[a-z][a-z\d+\-.]*:/{2}#i', $url)) { $url = 'http://' . $url; } // Is this a link to somewhere inside this board? If so then run reapply_sid() if (strpos($url, generate_board_url()) !== false) { $url = reapply_sid($url); } return $url; } /** * Returns timestamp from given date string * * @param string $date Date and time string. It can contain just the * date or date and time info. The string should * be in a similar format: 17.06.1990 18:06 * @return int|bool The timestamp of the given date or false if * given date does not match any known formats. */ public function date_to_time($date) { return strtotime($date); } }