Skip to content
Snippets Groups Projects
class.canned.php 8.26 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jared Hancock's avatar
    Jared Hancock committed
    <?php
    /*********************************************************************
        class.canned.php
    
        Canned Responses AKA Premade replies
    
        Peter Rotich <peter@osticket.com>
    
        Copyright (c)  2006-2013 osTicket
    
    Jared Hancock's avatar
    Jared Hancock committed
        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:
    **********************************************************************/
    include_once(INCLUDE_DIR.'class.file.php');
    
    
    class Canned
    extends VerySimpleModel {
        static $meta = array(
            'table' => CANNED_TABLE,
            'pk' => array('canned_id'),
            'joins' => array(
                'attachments' => array(
                    'constraint' => array(
                        "'C'" => 'Attachment.type',
                        'canned_id' => 'Attachment.object_id',
                    ),
                    'list' => true,
                    'null' => true,
                    'broker' => 'GenericAttachments',
                ),
            ),
        );
    
        const PERM_MANAGE = 'canned.manage';
    
        static protected $perms = array(
                self::PERM_MANAGE => array(
                    'title' =>
                    /* @trans */ 'Premade',
                    'desc'  =>
                    /* @trans */ 'Ability to add/update/disable/delete canned responses')
        );
    
        static function getPermissions() {
            return self::$perms;
        }
    
    
    Jared Hancock's avatar
    Jared Hancock committed
        function getId(){
    
            return $this->canned_id;
    
    Jared Hancock's avatar
    Jared Hancock committed
        }
    
        function isEnabled() {
    
             return $this->isenabled;
    
    Jared Hancock's avatar
    Jared Hancock committed
        }
    
        function isActive(){
            return $this->isEnabled();
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getFilters() {
    
            if (!isset($this->_filters)) {
                $this->_filters = array();
                $cid = sprintf('"canned_id":%d', $this->getId());
                $sql='SELECT filter.id, filter.name '
                    .' FROM '.FILTER_TABLE.' filter'
                    .' INNER JOIN '.FILTER_ACTION_TABLE.' action'
                    .'  ON (filter.id=action.filter_id)'
                    .' WHERE action.type="canned"'
                    ."  AND action.configuration LIKE '%$cid%'";
    
                if (($res=db_query($sql)) && db_num_rows($res))
                    while (list($id, $name) = db_fetch_row($res))
                        $this->_filters[$id] = $name;
            }
    
            return $this->_filters;
        }
    
    
        function getAttachedFiles($inlines=false) {
            return AttachmentFile::objects()
                ->filter(array(
                    'attachments__type'=>'C',
                    'attachments__object_id'=>$this->getId(),
                    'attachments__inline' => $inlines,
    
        function getNumFilters() {
    
    Peter Rotich's avatar
    Peter Rotich committed
            return count($this->getFilters());
    
    Jared Hancock's avatar
    Jared Hancock committed
        function getTitle() {
    
            return $this->title;
    
    Jared Hancock's avatar
    Jared Hancock committed
        }
    
        function getResponse() {
    
            return $this->response;
    
        function getResponseWithImages() {
            return Format::viewableImages($this->getResponse());
        }
    
    Jared Hancock's avatar
    Jared Hancock committed
    
        function getReply() {
            return $this->getResponse();
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getHtml() {
            return $this->getFormattedResponse('html');
        }
    
        function getPlainText() {
            return $this->getFormattedResponse('text.plain');
        }
    
        function getFormattedResponse($format='text', $cb=null) {
    
            $resp = array();
            $html = true;
            switch($format) {
                case 'json.plain':
                    $html = false;
                    // fall-through
                case 'json':
                    $resp['id'] = $this->getId();
                    $resp['title'] = $this->getTitle();
                    $resp['response'] = $this->getResponseWithImages();
    
                    // Callback to strip or replace variables!
                    if ($cb && is_callable($cb))
                        $resp = $cb($resp);
    
    
                    $resp['files'] = array();
                    foreach ($this->getAttachedFiles(!$html) as $file) {
                        $resp['files'][] = array(
                            'id' => $file->id,
                            'name' => $file->name,
                            'size' => $file->size,
                            'download_url' => $file->getDownloadUrl(),
                        );
                    }
    
    Peter Rotich's avatar
    Peter Rotich committed
                    // strip html
                    if (!$html) {
                        $resp['response'] = Format::html2text($resp['response'], 90);
                    }
                    return Format::json_encode($resp);
                    break;
                case 'html':
                case 'text.html':
                    $response = $this->getResponseWithImages();
                    break;
                case 'text.plain':
                    $html = false;
                case 'text':
                default:
                    $response = $this->getResponse();
                    if (!$html)
                        $response = Format::html2text($response, 90);
                    break;
            }
    
            // Callback to strip or replace variables!
            if ($response && $cb && is_callable($cb))
                $response = $cb($response);
    
            return $response;
        }
    
    
    Jared Hancock's avatar
    Jared Hancock committed
        function getNotes() {
            return $this->ht['notes'];
        }
    
    Jared Hancock's avatar
    Jared Hancock committed
        function getDeptId(){
            return $this->ht['dept_id'];
        }
    
        function getHashtable() {
    
            $base = $this->ht;
            unset($base['attachments']);
            return $base;
    
    Jared Hancock's avatar
    Jared Hancock committed
        }
    
        function getInfo() {
            return $this->getHashtable();
        }
    
        function getNumAttachments() {
    
            return $this->attachments->count();
    
    Jared Hancock's avatar
    Jared Hancock committed
        }
    
        function delete(){
    
            if ($this->getNumFilters() > 0)
                return false;
    
            if (!parent::delete())
                return false;
    
            $this->attachments->deleteAll();
    
            return true;
    
    Jared Hancock's avatar
    Jared Hancock committed
        }
    
        /*** Static functions ***/
    
    
        static function create($vars=false) {
            $faq = parent::create($vars);
            $faq->created = SqlFunction::NOW();
            return $faq;
    
        static function getIdByTitle($title) {
            $row = static::objects()
                ->filter(array('title' => $title))
                ->values_flat('canned_id')
                ->first();
    
            return $row ? $row[0] : null;
    
        static function getCannedResponses($deptId=0, $explicit=false) {
            $canned = static::objects()
                ->filter(array('isenabled' => true))
                ->order_by('title')
                ->values_flat('canned_id', 'title');
    
            if ($deptId) {
                $depts = Q::any(array('dept_id' => $deptId));
                if (!$explicit)
                    $depts->add(array('dept_id' => 0));
                $canned->filter($depts);
    
    Jared Hancock's avatar
    Jared Hancock committed
            }
    
            $responses = array();
    
            foreach ($canned as $row) {
                list($id, $title) = $row;
                $responses[$id] = $title;
    
    Jared Hancock's avatar
    Jared Hancock committed
            }
    
            return $responses;
        }
    
        function responsesByDeptId($deptId, $explicit=false) {
            return self::getCannedResponses($deptId, $explicit);
        }
    
    
        function save($refetch=false) {
            if ($this->dirty || $refetch)
                $this->updated = SqlFunction::NOW();
            return parent::save($refetch || $this->dirty);
        }
    
        function update($vars,&$errors) {
    
            $vars['title'] = Format::striptags(trim($vars['title']));
    
            $id = isset($this->canned_id) ? $this->canned_id : null;
            if ($id && $id != $vars['id'])
    
                $errors['err']=__('Internal error. Try again');
    
            if (!$vars['title'])
                $errors['title'] = __('Title required');
            elseif (strlen($vars['title']) < 3)
                $errors['title'] = __('Title is too short. 3 chars minimum');
            elseif (($cid=self::getIdByTitle($vars['title'])) && $cid!=$id)
                $errors['title'] = __('Title already exists');
    
            if (!$vars['response'])
                $errors['response'] = __('Response text is required');
    
            if ($errors)
                return false;
    
            $this->dept_id = $vars['dept_id'] ?: 0;
            $this->isenabled = $vars['isenabled'];
            $this->title = $vars['title'];
            $this->response = Format::sanitize($vars['response']);
            $this->notes = Format::sanitize($vars['notes']);
    
            $isnew = !isset($id);
            if ($this->save())
                return true;
    
            if ($isnew)
                $errors['err'] = sprintf(__('Unable to update %s.'), __('this canned response'));
            else
    
                $errors['err']=sprintf(__('Unable to create %s.'), __('this canned response'))
                   .' '.__('Internal error occurred');
    
            return true;
    
    RolePermission::register( /* @trans */ 'Knowledgebase', Canned::getPermissions());