/** * 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'; }