示例#1
0
 /**
  * Checks for a ticket and increases instance count if found
  * Creates new ticket if not
  *
  * NOTE: This method is called by Rappture
  * TODO: Create a proper API
  *
  *   option  = 'com_support';
  *   task    = 'create';
  *   no_html = 1;
  *   type    = 1;
  *   sesstoken (optional)
  *
  *   login    (optional) default: automated
  *   severity (optional) default: normal
  *   category (optional) default: Tools
  *   summary  (optional) default: first 75 characters of report
  *   report
  *   email    (optional) default: supportemail
  *   name     (optional) default: Automated Error Report
  *   os       (optional)
  *   browser  (optional)
  *   ip       (optional)
  *   hostname (optional)
  *   uas      (optional)
  *   referrer (optional)
  *   cookies  (optional) default: 1 (since it's coming from rappture we assume they're already logged in and thus have cookies enabled)
  *   section  (optional)
  *   upload   (optional)
  *
  * @return  string
  */
 public function createTask()
 {
     // trim and addslashes all posted items
     $incoming = array_map('trim', $_POST);
     $incoming = array_map('addslashes', $incoming);
     // initiate class and bind posted items to database fields
     $row = new Ticket();
     if (!$row->bind($incoming)) {
         echo $row->getError();
         return;
     }
     $row->set('summary', $row->content('clean', 200));
     // Check for a session token
     $sessnum = '';
     if ($sess = Request::getVar('sesstoken', '')) {
         include_once PATH_CORE . DS . 'components' . DS . 'com_tools' . DS . 'helpers' . DS . 'utils.php';
         $mwdb = \Components\Tools\Helpers\Utils::getMWDBO();
         // retrieve the username and IP from session with this session token
         $query = "SELECT * FROM session WHERE session.sesstoken=" . $this->database->quote($sess) . " LIMIT 1";
         $mwdb->setQuery($query);
         $viewperms = $mwdb->loadObjectList();
         if ($viewperms) {
             foreach ($viewperms as $sinfo) {
                 $row->set('login', $sinfo->username);
                 $row->set('ip', $sinfo->remoteip);
                 $sessnum = $sinfo->sessnum;
             }
             // get user's infor from login
             $user = User::getInstance($row->get('login'));
             $row->set('name', $user->get('name'));
             $row->set('email', $user->get('email'));
         }
     }
     $row->set('login', $row->get('login') ? $row->get('login') : 'automated');
     // check for an existing ticket with this report
     $summary = $row->get('summary');
     if (strstr($summary, '"') || strstr($summary, "'")) {
         $summary = str_replace("\\'", "\\\\\\\\\\'", $summary);
         $summary = str_replace('\\"', '\\\\\\\\\\"', $summary);
         $query = "SELECT id FROM `#__support_tickets` WHERE LOWER(summary) LIKE " . $this->database->quote('%' . strtolower($summary) . '%') . " AND type=1 LIMIT 1";
     }
     $query = "SELECT id FROM `#__support_tickets` WHERE LOWER(summary) LIKE " . $this->database->quote('%' . strtolower($summary) . '%') . " AND type=1 LIMIT 1";
     $this->database->setQuery($query);
     if ($ticket = $this->database->loadResult()) {
         $changelog = '';
         // open existing ticket if closed
         $oldticket = new Ticket($ticket);
         $oldticket->set('instances', $oldticket->get('instances') + 1);
         if (!$oldticket->isOpen()) {
             $before = new Ticket($ticket);
             $oldticket->set('open', 1);
             $oldticket->set('status', 1);
             $oldticket->set('resolved', '');
             $rowc = new Comment();
             $rowc->set('ticket', $ticket);
             $rowc->set('comment', '');
             $rowc->set('created', Date::toSql());
             $rowc->set('created_by', User::get('id'));
             $rowc->set('access', 1);
             // Compare fields to find out what has changed for this ticket and build a changelog
             $rowc->changelog()->diff($before, $oldticket);
             if (!$rowc->store(true)) {
                 echo $rowc->getError();
                 return;
             }
         }
         // store new content
         if (!$oldticket->store(true)) {
             echo $oldticket->getError();
             return;
         }
         $status = $oldticket->status('text');
         $count = $oldticket->get('instances');
     } else {
         // set some defaults
         $row->set('status', 0);
         $row->set('open', 1);
         $row->set('created', Date::toSql());
         $row->set('severity', $row->get('severity') ? $row->get('severity') : 'normal');
         $row->set('category', $row->get('category') ? $row->get('category') : Lang::txt('COM_SUPPORT_CATEGORY_TOOLS'));
         $row->set('resolved', '');
         $row->set('email', $row->get('email') ? $row->get('email') : $this->_data['supportemail']);
         $row->set('name', $row->get('name') ? $row->get('name') : Lang::txt('COM_SUPPORT_AUTOMATED_REPORT'));
         $row->set('cookies', $row->get('cookies') ? $row->get('cookies') : 1);
         $row->set('instances', 1);
         $row->set('section', $row->get('section') ? $row->get('section') : 1);
         $row->set('type', 1);
         // store new content
         if (!$row->store(true)) {
             echo $row->getError();
             return;
         }
         $row->tag($incoming['tags'], User::get('id'), 1);
         if ($attachment = $this->uploadTask($row->get('id'))) {
             $row->set('report', $row->get('report') . "\n\n" . $attachment);
             if (!$row->store()) {
                 $this->setError($row->getError());
             }
         }
         $ticket = $row->get('id');
         $status = 'new';
         $count = 1;
     }
     echo 'Ticket #' . $ticket . ' (' . $status . ') ' . $count . ' times';
 }