[ Index ]

PHP Cross Reference of MyBB 1.6.7

title

Body

[close]

/inc/datahandlers/ -> event.php (source)

   1  <?php
   2  /**
   3   * MyBB 1.6
   4   * Copyright 2010 MyBB Group, All Rights Reserved
   5   *
   6   * Website: http://mybb.com
   7   * License: http://mybb.com/about/license
   8   *
   9   * $Id: event.php 5730 2011-12-11 07:23:23Z ralgith $
  10   */
  11  
  12  // Disallow direct access to this file for security reasons
  13  if(!defined("IN_MYBB"))
  14  {
  15      die("Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
  16  }
  17  
  18  /**
  19   * Event handling class, provides common structure to handle event data.
  20   *
  21   */
  22  class EventDataHandler extends DataHandler
  23  {
  24      /**
  25       * The language file used in the data handler.
  26       *
  27       * @var string
  28       */
  29      public $language_file = 'datahandler_event';
  30  
  31      /**
  32       * The prefix for the language variables used in the data handler.
  33       *
  34       * @var string
  35       */
  36      public $language_prefix = 'eventdata';
  37  
  38      /**
  39       * Array of data inserted in to an event.
  40       *
  41       * @var array
  42       */
  43      public $event_insert_data = array();
  44  
  45      /**
  46       * Array of data used to update an event.
  47       *
  48       * @var array
  49       */
  50      public $event_update_data = array();
  51  
  52      /**
  53       * Event ID currently being manipulated by the datahandlers.
  54       */
  55      public $eid = 0;
  56  
  57      /**
  58       * Verifies if an event name is valid or not and attempts to fix it
  59       *
  60       * @return boolean True if valid, false if invalid.
  61       */
  62  	function verify_name()
  63      {
  64          $name = &$this->data['name'];
  65          $name = trim($name);
  66          if(!$name)
  67          {
  68              $this->set_error("missing_name");
  69              return false;
  70          }
  71          return true;
  72      }
  73  
  74      /**
  75       * Verifies if an event description is valid or not and attempts to fix it
  76       *
  77       * @return boolean True if valid, false if invalid.
  78       */
  79  	function verify_description()
  80      {
  81          $description = &$this->data['description'];
  82          $description = trim($description);
  83          if(!$description)
  84          {
  85              $this->set_error("missing_description");
  86              return false;
  87          }
  88          return true;
  89      }
  90  
  91      /**
  92       * Verifies if an event date is valid or not and attempts to fix it
  93       *
  94       * @return boolean True if valid, false if invalid.
  95       */
  96  	function verify_date()
  97      {
  98          $event = &$this->data;
  99  
 100          // All types of events require a start date
 101          if(!$event['start_date']['day'] || !$event['start_date']['month'] || !$event['start_date']['year'])
 102          {
 103              $this->set_error("invalid_start_date");
 104              return false;
 105          }
 106  
 107          if($event['start_date']['day'] > date("t", mktime(0, 0, 0, $event['start_date']['month'], 1, $event['start_date']['year'])))
 108          {
 109              $this->set_error("invalid_start_date");
 110              return false;
 111          }
 112  
 113          // Calendar events can only be within the next 5 years
 114          if($event['start_date']['year'] > date("Y") + 5)
 115          {
 116              $this->set_error("invalid_start_year");
 117              return false;
 118          }
 119  
 120          //Check to see if the month is within 1 and 12
 121          if($event['start_date']['month'] > 12 || $event['start_date']['month'] < 1)
 122          {
 123              $this->set_error("invalid_start_month");
 124              return false;
 125          }
 126  
 127          // For ranged events, we check the end date & times too
 128          if($event['type'] == "ranged")
 129          {
 130              if(!$event['end_date']['day'] || !$event['end_date']['month'] || !$event['end_date']['year'])
 131              {
 132                  $this->set_error("invalid_end_date");
 133                  return false;
 134              }
 135  
 136              if($event['end_date']['day'] > date("t", mktime(0, 0, 0, $event['end_date']['month'], 1, $event['end_date']['year'])))
 137              {
 138                  $this->set_error("invalid_end_date");
 139                  return false;
 140              }
 141  
 142              // Calendar events can only be within the next 5 years
 143              if($event['end_date']['year'] > date("Y") + 5)
 144              {
 145                  $this->set_error("invalid_end_year");
 146                  return false;
 147              }
 148  
 149              //Check to see if the month is within 1 and 12
 150              if($event['end_date']['month'] > 12 || $event['end_date']['month'] < 1)
 151              {
 152                  $this->set_error("invalid_end_month");
 153                  return false;
 154              }
 155  
 156              // Validate time input
 157              if($event['start_date']['time'] || $event['end_date']['time'])
 158              {
 159                  if(($event['start_date']['time'] && !$event['end_date']['time']) || ($event['end_date']['time'] && !$event['start_date']['time']))
 160                  {
 161                      $this->set_error("cant_specify_one_time");
 162                      return false;
 163                  }
 164  
 165                  // Begin start time validation
 166                  $start_time = $this->verify_time($event['start_date']['time']);
 167                  if(!is_array($start_time))
 168                  {
 169                      $this->set_error("start_time_invalid");
 170                      return false;
 171                  }
 172  
 173                  // End time validation
 174                  $end_time = $this->verify_time($event['end_date']['time']);
 175                  if(!is_array($end_time))
 176                  {
 177                      $this->set_error("end_time_invalid");
 178                      return false;
 179                  }
 180                  $event['usingtime'] = 1;
 181              }
 182              else
 183              {
 184                  $start_time = array("hour" => 0, "min" => 0);
 185                  $end_time = array("hour" => 23, "min" => 59);
 186                  $event['usingtime'] = 0;
 187              }
 188          }
 189  
 190          if(array_key_exists('timezone', $event))
 191          {
 192              $event['timezone'] = floatval($event['timezone']);
 193              if($event['timezone'] > 12 || $event['timezone'] < -12)
 194              {
 195                  $this->set_error("invalid_timezone");
 196                  return false;
 197              }
 198              $start_time['hour'] -= $event['timezone'];
 199              $end_time['hour'] -= $event['timezone'];
 200          }
 201  
 202          $start_timestamp = gmmktime($start_time['hour'], $start_time['min'], 0, $event['start_date']['month'], $event['start_date']['day'], $event['start_date']['year']);
 203  
 204          if($event['type'] == "ranged")
 205          {
 206              $end_timestamp = gmmktime($end_time['hour'], $end_time['min'], 0, $event['end_date']['month'], $event['end_date']['day'], $event['end_date']['year']);
 207  
 208              if($end_timestamp <= $start_timestamp)
 209              {
 210                  $this->set_error("end_in_past");
 211                  return false;
 212              }
 213          }
 214  
 215          // Save our time stamps for saving
 216          $event['starttime'] = $start_timestamp;
 217          $event['endtime'] = $end_timestamp;
 218  
 219          return true;
 220      }
 221  
 222  	function verify_time($time)
 223      {
 224          preg_match('#^(0?[1-9]|1[012])\s?([:\.]?)\s?([0-5][0-9])?(\s?[ap]m)|([01][0-9]|2[0-3])\s?([:\.])\s?([0-5][0-9])$#i', $time, $matches);
 225          if(count($matches) == 0)
 226          {
 227              return false;
 228          }
 229  
 230          // 24h time
 231          if(count($matches) == 8)
 232          {
 233              $hour = $matches[5];
 234              $min = $matches[7];
 235          }
 236          // 12 hour time
 237          else
 238          {
 239              $hour = $matches[1];
 240              $min = intval($matches[3]);
 241              $matches[4] = trim($matches[4]);
 242              if(my_strtolower($matches[4]) == "pm" && $hour != 12)
 243              {
 244                  $hour += 12;
 245              }
 246              else if(my_strtolower($matches[4]) == "am" && $hour == 12)
 247              {
 248                  $hour = 0;
 249              }
 250          }
 251          return array("hour" => $hour, "min" => $min);
 252      }
 253  
 254  	function verify_repeats()
 255      {
 256          global $mybb;
 257          $event = &$this->data;
 258  
 259          if(!is_array($event['repeats']) || !$event['repeats']['repeats'])
 260          {
 261              return true;
 262          }
 263          
 264          if(!$event['endtime'])
 265          {
 266              $this->set_error("only_ranged_events_repeat");
 267              return false;
 268          }
 269  
 270          switch($event['repeats']['repeats'])
 271          {
 272              case 1:
 273                  $event['repeats']['days'] = intval($event['repeats']['days']);
 274                  if($event['repeats']['days'] <= 0)
 275                  {
 276                      $this->set_error("invalid_repeat_day_interval");
 277                      return false;
 278                  }
 279              case 2:
 280                  break;
 281              case 3:
 282                  $event['repeats']['weeks'] = intval($event['repeats']['weeks']);
 283                  if($event['repeats']['weeks'] <= 0)
 284                  {
 285                      $this->set_error("invalid_repeat_week_interval");
 286                      return false;
 287                  }
 288                  if(count($event['repeats']['days']) == 0)
 289                  {
 290                      $this->set_error("invalid_repeat_weekly_days");
 291                      return false;
 292                  }
 293                  asort($event['repeats']['days']);
 294                  break;
 295              case 4:
 296                  if($event['repeats']['day'])
 297                  {
 298                      $event['repeats']['day'] = intval($event['repeats']['day']);
 299                      if($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31)
 300                      {
 301                          $this->set_error("invalid_repeat_day_interval");
 302                          return false;
 303                      }
 304                  }
 305                  else
 306                  {
 307                      if($event['repeats']['occurance'] != "last")
 308                      {
 309                          $event['repeats']['occurance'] = intval($event['repeats']['occurance']);
 310                      }
 311                      $event['repeats']['weekday'] = intval($event['repeats']['weekday']);
 312                  }
 313                  $event['repeats']['months'] = intval($event['repeats']['months']);
 314                  if($event['repeats']['months'] <= 0 || $event['repeats']['months'] > 12)
 315                  {
 316                      $this->set_error("invalid_repeat_month_interval");
 317                      return false;
 318                  }
 319                  break;
 320              case 5:
 321                  if($event['repeats']['day'])
 322                  {
 323                      $event['repeats']['day'] = intval($event['repeats']['day']);
 324                      if($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31)
 325                      {
 326                          $this->set_error("invalid_repeat_day_interval");
 327                          return false;
 328                      }
 329                  }
 330                  else
 331                  {
 332                      if($event['repeats']['occurance'] != "last")
 333                      {
 334                          $event['repeats']['occurance'] = intval($event['repeats']['occurance']);
 335                      }
 336                      $event['repeats']['weekday'] = intval($event['repeats']['weekday']);
 337                  }
 338                  $event['repeats']['month'] = intval($event['repeats']['month']);
 339                  if($event['repeats']['month'] <= 0 || $event['repeats']['month'] > 12)
 340                  {
 341                      $this->set_error("invalid_repeat_month_interval");
 342                      return false;
 343                  }
 344                  $event['repeats']['years'] = intval($event['repeats']['years']);
 345                  if($event['repeats']['years'] <= 0 || $event['repeats']['years'] > 4)
 346                  {
 347                      $this->set_error("invalid_repeat_year_interval");
 348                      return false;
 349                  }
 350                  break;
 351              default:
 352                  $event['repeats'] = array();
 353          }
 354          require_once  MYBB_ROOT."inc/functions_calendar.php";
 355          $event['starttime_user'] = $event['starttime'];
 356          $event['endtime_user'] = $event['endtime'];
 357          $next_occurance = fetch_next_occurance($event, array('start' => $event['starttime'], 'end' => $event['endtime']), $event['starttime'], true);
 358          if($next_occurance > $event['endtime'])
 359          {
 360              $this->set_error("event_wont_occur");
 361              return false;
 362          }
 363          return true;
 364      }
 365  
 366      /**
 367       * Validate an event.
 368       *
 369       * @param array The event data array.
 370       */
 371  	function validate_event()
 372      {
 373          global $plugins;
 374  
 375          $event = &$this->data;
 376  
 377          if($this->method == "insert" || array_key_exists('name', $event))
 378          {
 379              $this->verify_name();
 380          }
 381  
 382          if($this->method == "insert" || array_key_exists('description', $event))
 383          {
 384              $this->verify_description();
 385          }
 386  
 387          if($this->method == "insert" || array_key_exists('start_date', $event) || array_key_exists('end_date', $event))
 388          {
 389              $this->verify_date();
 390          }
 391  
 392          if(($this->method == "insert" && $event['endtime']) || array_key_exists('repeats', $event))
 393          {
 394              $this->verify_repeats();
 395          }
 396          
 397          $plugins->run_hooks("datahandler_event_validate", $this);
 398  
 399          // We are done validating, return.
 400          $this->set_validated(true);
 401          if(count($this->get_errors()) > 0)
 402          {
 403              return false;
 404          }
 405          else
 406          {
 407              return true;
 408          }
 409      }
 410  
 411      /**
 412       * Insert an event into the database.
 413       *
 414       * @param array The array of event data.
 415       * @return array Array of new event details, eid and private.
 416       */
 417  	function insert_event()
 418      {
 419          global $db, $mybb, $plugins;
 420  
 421          // Yes, validating is required.
 422          if(!$this->get_validated())
 423          {
 424              die("The event needs to be validated before inserting it into the DB.");
 425          }
 426          
 427          if(count($this->get_errors()) > 0)
 428          {
 429              die("The event is not valid.");
 430          }
 431  
 432          $event = &$this->data;
 433  
 434          $query = $db->simple_select("calendars", "*", "cid='".intval($event['cid'])."'");
 435          $calendar_moderation = $db->fetch_field($query, "moderation");
 436          if($calendar_moderation == 1 && intval($event['private']) != 1)
 437          {
 438              $visible = 0;
 439              if($event['uid'] == $mybb->user['uid'])
 440              {
 441                  $calendar_permissions = get_calendar_permissions($event['cid']);
 442                  if($calendar_permissions['canbypasseventmod'] == 1)
 443                  {
 444                      $visible = 1;
 445                  }
 446              }
 447          }
 448          else
 449          {
 450              $visible = 1;
 451          }
 452              
 453          // Prepare an array for insertion into the database.
 454          $this->event_insert_data = array(
 455              'cid' => intval($event['cid']),
 456              'uid' => intval($event['uid']),
 457              'name' => $db->escape_string($event['name']),
 458              'description' => $db->escape_string($event['description']),
 459              'visible' => $visible,
 460              'private' => intval($event['private']),
 461              'dateline' => TIME_NOW,
 462              'starttime' => intval($event['starttime']),
 463              'endtime' => intval($event['endtime']),
 464              'timezone' => $db->escape_string(floatval($event['timezone'])),
 465              'ignoretimezone' => intval($event['ignoretimezone']),
 466              'usingtime' => intval($event['usingtime']),
 467              'repeats' => $db->escape_string(serialize($event['repeats']))
 468          );
 469  
 470          $plugins->run_hooks("datahandler_event_insert", $this);
 471  
 472          $this->eid = $db->insert_query("events", $this->event_insert_data);
 473  
 474          // Return the event's eid and whether or not it is private.
 475          return array(
 476              'eid' => $this->eid,
 477              'private' => $event['private'],
 478              'visible' => $visible
 479          );
 480      }
 481  
 482      /**
 483       * Updates an event that is already in the database.
 484       *
 485       * @param array The event data array.
 486       */
 487  	function update_event()
 488      {
 489          global $db, $plugins;
 490  
 491          // Yes, validating is required.
 492          if(!$this->get_validated())
 493          {
 494              die("The event needs to be validated before inserting it into the DB.");
 495          }
 496          
 497          if(count($this->get_errors()) > 0)
 498          {
 499              die("The event is not valid.");
 500          }
 501  
 502          $event = &$this->data;
 503  
 504          $this->eid = $event['eid'];
 505  
 506          if(isset($event['cid']))
 507          {
 508              $this->event_update_data['cid'] = $db->escape_string($event['cid']);
 509          }
 510  
 511          if(isset($event['name']))
 512          {
 513              $this->event_update_data['name'] = $db->escape_string($event['name']);
 514          }
 515  
 516          if(isset($event['description']))
 517          {
 518              $this->event_update_data['description'] = $db->escape_string($event['description']);
 519          }
 520  
 521          if(isset($event['starttime']))
 522          {
 523              $this->event_update_data['starttime'] = intval($event['starttime']);
 524              $this->event_update_data['usingtime'] = intval($event['usingtime']);
 525          }
 526  
 527          if(isset($event['endtime']))
 528          {
 529              $this->event_update_data['endtime'] = intval($event['endtime']);
 530              $this->event_update_data['usingtime'] = intval($event['usingtime']);
 531          }
 532          else
 533          {
 534              $this->event_update_data['endtime'] = 0;
 535              $this->event_update_data['usingtime'] = 0;
 536          }
 537  
 538          if(isset($event['repeats']))
 539          {
 540              if(!empty($event['repeats']))
 541              {
 542                  $event['repeats'] = serialize($event['repeats']);
 543              }
 544              $this->event_update_data['repeats'] = $db->escape_string($event['repeats']);
 545          }
 546  
 547          if(isset($event['timezone']))
 548          {
 549              $this->event_update_data['timezone'] = $db->escape_string(floatval($event['timezone']));
 550          }
 551          
 552          if(isset($event['ignoretimezone']))
 553          {
 554              $this->event_update_data['ignoretimezone'] = intval($event['ignoretimezone']);
 555          }        
 556  
 557          if(isset($event['private']))
 558          {
 559              $this->event_update_data['private'] = intval($event['private']);
 560          }
 561  
 562          if(isset($event['visible']))
 563          {
 564              $this->event_update_data['visible'] = $db->escape_string($event['visible']);
 565          }
 566  
 567          if(isset($event['uid']))
 568          {
 569              $this->event_update_data['uid'] = intval($event['uid']);
 570          }
 571  
 572          $plugins->run_hooks("datahandler_event_update", $this);
 573  
 574          $db->update_query("events", $this->event_update_data, "eid='".intval($event['eid'])."'");
 575  
 576          // Return the event's eid and whether or not it is private.
 577          return array(
 578              'eid' => $event['eid'],
 579              'private' => $event['private']
 580          );
 581      }
 582  }
 583  
 584  ?>


Generated: Sat Mar 31 17:55:03 2012 Cross-referenced by PHPXref 0.7.1