Newer
Older
<?php
/*********************************************************************
class.topic.php
Help topic helper
Peter Rotich <peter@osticket.com>
http://www.osticket.com
Released under the GNU General Public License WITHOUT ANY WARRANTY.
See LICENSE.TXT for details.
vim: expandtab sw=4 ts=4 sts=4:
**********************************************************************/
class Topic {
var $id;
$this->id=0;
$this->load($id);
}
function load($id=0) {
if(!$id && !($id=$this->getId()))
return false;
$sql='SELECT ht.* '
.', IF(ht.topic_pid IS NULL, ht.topic, CONCAT_WS(" / ", ht2.topic, ht.topic)) as name '
.' FROM '.TOPIC_TABLE.' ht '
.' LEFT JOIN '.TOPIC_TABLE.' ht2 ON(ht2.topic_id=ht.topic_pid) '
.' WHERE ht.topic_id='.db_input($id);
if(!($res=db_query($sql)) || !db_num_rows($res))
return false;
$this->id = $this->ht['topic_id'];
function reload() {
return $this->load();
}
function asVar() {
return $this->getName();
}
function getPid() {
return $this->ht['topic_pid'];
}
function getParent() {
if(!$this->parent && $this->getPid())
$this->parent = self::lookup($this->getPid());
return $this->parent;
}
function getName() {
return $this->ht['name'];
function getFullName() {
return self::getTopicName($this->getId());
}
static function getTopicName($id) {
$names = static::getHelpTopics();
return $names[$id];
}
function getPageId() {
return $this->ht['page_id'];
}
function getPage() {
if(!$this->page && $this->getPageId())
$this->page = Page::lookup($this->getPageId());
return $this->page;
}
function getFormId() {
return $this->ht['form_id'];
}
function getForm() {
if(!$this->form && $this->getFormId())
$this->form = DynamicForm::lookup($this->getFormId());
return $this->form;
}
function autoRespond() {
return (!$this->ht['noautoresp']);
}
function isEnabled() {
return ($this->ht['isactive']);
}
return ($this->ht['ispublic']);
}
function getHashtable() {
return $this->ht;
}
function getInfo() {
return $this->getHashtable();
}
function setSortOrder($i) {
if ($i != $this->ht['sort']) {
$sql = 'UPDATE '.TOPIC_TABLE.' SET `sort`='.db_input($i)
.' WHERE `topic_id`='.db_input($this->getId());
return (db_query($sql) && db_affected_rows() == 1);
}
// Noop
return true;
}
if(!$this->save($this->getId(), $vars, $errors))
return false;
$this->reload();
return true;
$sql='DELETE FROM '.TOPIC_TABLE.' WHERE topic_id='.db_input($this->getId()).' LIMIT 1';
if(db_query($sql) && ($num=db_affected_rows())) {
db_query('UPDATE '.TOPIC_TABLE.' SET topic_pid=0 WHERE topic_pid='.db_input($this->getId()));
db_query('UPDATE '.TICKET_TABLE.' SET topic_id=0 WHERE topic_id='.db_input($this->getId()));
db_query('DELETE FROM '.FAQ_TOPIC_TABLE.' WHERE topic_id='.db_input($this->getId()));
}
return $num;
}
/*** Static functions ***/
function create($vars, &$errors) {
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
static function getHelpTopics($publicOnly=false) {
global $cfg;
static $names;
if ($names) return $names;
$sql = 'SELECT topic_id, topic_pid, ispublic, topic FROM '.TOPIC_TABLE
. ' WHERE isactive=1';
$sql .= ' ORDER BY '
. ($cfg->getTopicSortMode() == 'm' ? '`sort`' : '`topic_id`');
$res = db_query($sql);
// Fetch information for all topics, in declared sort order
$topics = array();
while (list($id, $pid, $pub, $topic) = db_fetch_row($res))
$topics[$id] = array('pid'=>$pid, 'public'=>$pub,
'topic'=>$topic);
// Resolve parent names
foreach ($topics as $id=>$info) {
if ($publicOnly && !$info['public'])
continue;
$name = $info['topic'];
while ($info['pid'] && ($info = $topics[$info['pid']])) {
$name = sprintf('%s / %s', $info['topic'], $name);
}
$names[$id] = $name;
}
if ($cfg->getTopicSortMode() == 'a')
uasort($names, function($a, $b) { return strcmp($a, $b); });
return $names;
function getPublicHelpTopics() {
return self::getHelpTopics(true);
}
function getIdByName($name, $pid=0) {
$sql='SELECT topic_id FROM '.TOPIC_TABLE
.' WHERE topic='.db_input($name)
.' AND topic_pid='.db_input($pid);
if(($res=db_query($sql)) && db_num_rows($res))
list($id) = db_fetch_row($res);
static function lookup($id) {
return ($id && is_numeric($id) && ($t= new Topic($id)) && $t->getId()==$id)?$t:null;
}
$vars['topic']=Format::striptags(trim($vars['topic']));
if($id && $id!=$vars['id'])
$errors['err']='Internal error. Try again';
if(!$vars['topic'])
$errors['topic']='Help topic required';
elseif(strlen($vars['topic'])<5)
$errors['topic']='Topic is too short. 5 chars minimum';
elseif(($tid=self::getIdByName($vars['topic'], $vars['pid'])) && $tid!=$id)
if (!is_numeric($vars['dept_id']))
$errors['dept_id']='You must select a department';
foreach (array('sla_id','form_id','page_id','pid') as $f)
if (!isset($vars[$f]))
$vars[$f] = 0;
$sql=' updated=NOW() '
.',topic='.db_input($vars['topic'])
.',topic_pid='.db_input($vars['pid'])
.',dept_id='.db_input($vars['dept_id'])
.',priority_id='.db_input($vars['priority_id'])
.',form_id='.db_input($vars['form_id'])
.',page_id='.db_input($vars['page_id'])
.',isactive='.db_input($vars['isactive'])
.',ispublic='.db_input($vars['ispublic'])
.',noautoresp='.db_input(isset($vars['noautoresp']) && $vars['noautoresp']?1:0)
.',notes='.db_input(Format::sanitize($vars['notes']));
//Auto assign ID is overloaded...
if($vars['assign'] && $vars['assign'][0]=='s')
$sql.=',team_id=0, staff_id='.db_input(preg_replace("/[^0-9]/", "", $vars['assign']));
elseif($vars['assign'] && $vars['assign'][0]=='t')
$sql.=',staff_id=0, team_id='.db_input(preg_replace("/[^0-9]/", "", $vars['assign']));
$sql.=',staff_id=0, team_id=0 '; //no auto-assignment!
if($id) {
$sql='UPDATE '.TOPIC_TABLE.' SET '.$sql.' WHERE topic_id='.db_input($id);
if(db_query($sql))
return true;
$errors['err']='Unable to update topic. Internal error occurred';
if (isset($vars['topic_id']))
$sql .= ', topic_id='.db_input($vars['topic_id']);
$sql='INSERT INTO '.TOPIC_TABLE.' SET '.$sql.',created=NOW()';
if(db_query($sql) && ($id=db_insert_id()))
return $id;
$errors['err']='Unable to create the topic. Internal error';
}
// Add fields from the standard ticket form to the ticket filterable fields
Filter::addSupportedMatches('Help Topic', array('topicId' => 'Topic ID'), 100);