Newer
Older
<?php
/*********************************************************************
class.attachment.php
Attachment Handler - mainly used for lookup...doesn't save!
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:
**********************************************************************/
require_once(INCLUDE_DIR.'class.ticket.php');
require_once(INCLUDE_DIR.'class.file.php');
class Attachment extends VerySimpleModel {
static $meta = array(
'table' => ATTACHMENT_TABLE,
'pk' => array('id'),
'select_related' => array('file'),
'joins' => array(
'constraint' => array(
'type' => "'D'",
'object_id' => 'Draft.id',
),
),
'file' => array(
'constraint' => array(
'file_id' => 'AttachmentFile.id',
),
),
'thread_entry' => array(
'constraint' => array(
'type' => "'H'",
'object_id' => 'ThreadEntry.id',
),
),
),
);
return $this->id;
return $this->file_id;
}
function getFile() {
return $this->file;
}
function getFilename() {
return $this->name ?: $this->file->name;
}
function getName() {
return $this->getFilename();
}
function getHashtable() {
return $this->ht;
}
function getInfo() {
return $this->getHashtable();
}
if (!isset($this->object))
$this->object = ObjectModel::lookup(
$this->ht['object_id'], $this->ht['type']);
static function lookupByFileHash($hash, $objectId=0) {
$file = static::objects()
->filter(array('file__key' => $hash));
$file->filter(array('object_id' => $objectId));
return $file->first();
return (is_string($var))
? static::lookupByFileHash($var, $objectId)
: parent::lookup($var);
class GenericAttachments
extends InstrumentedList {
var $lang;
function getId() { return $this->key['object_id']; }
function getType() { return $this->key['type']; }
/**
* Drop attachments whose file_id values are not in the included list,
* additionally, add new files whose IDs are in the list provided.
*/
function keepOnlyFileIds($ids, $inline=false, $lang=false) {
if (!isset($ids[$A->file_id]) && $A->lang == $lang && $A->inline == $inline)
// Not in the $ids list, delete
$this->remove($A);
$attachments = array();
// Format $new for upload() with new name
$attachments[] = array(
'id' => $id,
'name' => $name
);
}
// Everything remaining in $attachments is truly new
$this->upload($attachments, $inline, $lang);
function upload($files, $inline=false, $lang=false) {
if (!is_array($files))
$files = array($files);
foreach ($files as $file) {
elseif (is_array($file) && isset($file['id']) && $file['id'])
elseif (isset($file['tmp_name']) && ($F = AttachmentFile::upload($file)))
$fileId = $F->getId();
elseif ($F = AttachmentFile::create($file))
$fileId = $F->getId();
else
continue;
$_inline = isset($file['inline']) ? $file['inline'] : $inline;
// Check if Attachment exists
if ($F && $this->key)
$existing = Attachment::objects()->filter(array(
'file__key' => $F->key,
'object_id' => $this->key['object_id'],
'type' => $this->key['type']
))->first();
$att = $this->add(isset($existing) ? $existing : new Attachment(array(
'file_id' => $fileId,
'inline' => $_inline ? 1 : 0,
// Record varying file names in the attachment record
if (is_array($file) && isset($file['name'])) {
$filename = $file['name'];
}
if ($filename) {
// This should be a noop since the ORM caches on PK
$file = $F ?: AttachmentFile::lookup($fileId);
// XXX: This is not Unicode safe
if ($file && 0 !== strcasecmp($file->name, $filename))
$att->name = $filename;
}
$att->lang = $lang;
// File may already be associated with the draft (in the
// event it was deleted and re-added)
$att->save();
$i[] = $fileId;
}
return $i;
}
$ids = $this->upload($file, $inline);
return $ids[0];
function getInlines($lang=false) { return $this->_getList(false, true, $lang); }
function getSeparates($lang=false) { return $this->_getList(true, false, $lang); }
function getAll($lang=false) { return $this->_getList(true, true, $lang); }
function count($lang=false) { return count($this->getSeparates($lang)); }
function _getList($separates=false, $inlines=false, $lang=false) {
$base = $this;
$base = $base->filter(array('inline' => 0));
$base = $base->filter(array('inline' => 1));
if ($lang)
$base = $base->filter(array('lang' => $lang));
return $base;
}
function delete($file_id) {
return $this->objects()->filter(array('file_id'=>$file_id))->delete();
}
function deleteAll($inline_only=false){
if ($inline_only)
return $this->objects()->filter(array('inline' => 1))->delete();
}
function deleteInlines() {
return $this->deleteAll(true);
}
static function forIdAndType($id, $type) {
return new static(array(
'Attachment',
array('object_id' => $id, 'type' => $type)
));
}