. */ /** * An interface to the file table in the database */ class file { /** * @var PDO $pdo The PDO class for database communication * @var int $id The id of the file * @var string $filename The relative path to the file */ protected $pdo, $id, $filename; /** * Create a new instance * * @param PDO $pdo The PDO class, to access the database * @param int $id The id of the file to fetch * * @throws PDOException If something went wrong with the database * @throws Exception If the file could not be found */ public function __construct($pdo, $id) { $this->pdo = $pdo; $stmt = $this->pdo->prepare("SELECT * FROM `".constants::db_prefix."file` WHERE `id`=?"); $stmt->execute(array($id)); if ($stmt->rowCount() == 0) { throw new Exception("The file with id '$id' could not be found."); } $file = $stmt->fetch(PDO::FETCH_ASSOC); $this->id = $file['id']; $this->filename = $file['filename']; } //------------------------------------------------------------------------------ // Getters and setters //------------------------------------------------------------------------------ /** * Get the ID of the file * * @return int The ID */ public function getId() { return $this->id; } /** * Get the relative filename of the file * * @see file::getFilenamePath To get the full internal path to the file * @see file::getFilenameURI To get the full external path to the file * * @return string The filename */ public function getFilename() { return $this->filename; } /** * Get the full internal path to the file * * @see file::getFilename To get the relative filename * @see file::getFilenameURI To get the full external path to the file * * @return string The path */ public function getFilenamePath() { return constants::files_folder . $this->filename; } /** * Get the full external path to the file * * @see file::getFilename To get the relative filename * @see file::getFilenamePath To get the full internal path to the file * * @return string The URI */ public function getFilenameURI() { return constants::files_folder_external . $this->filename; } //------------------------------------------------------------------------------ // Other functions //------------------------------------------------------------------------------ /** * Move this file to the trash and delete all records for it * * Physically, this moves the file to a trash folder * Then, the file will be removed from the file table in the database * Any appendices linking to this file with fileId will have fileId NULL * Any offers linking to this file with invoice_fileId will have invoice_fileId NULL * * @throws PDOException If there's something wrong with the database * * @return bool True on success, false on failure */ public function delete() { // Try to move the file to trash $newname = pathinfo($this->filename, PATHINFO_FILENAME) . '--' . date('Y-m-d.H.i.s.') . pathinfo($this->filename, PATHINFO_EXTENSION); $newdir = pathinfo($this->getFilenamePath(), PATHINFO_DIRNAME) . '/' . constants::files_folder_trash . '/'; if (!file_exists($newdir)) { if (!mkdir($newdir)) { return false; } } if (!(@rename($this->getFilenamePath(), $newdir . $newname))) { return false; } // Remove offers linked by invoice_fileId $this->pdo->query("UPDATE `".constants::db_prefix."offer` SET `invoice_fileId`=NULL WHERE `invoice_fileId`={$this->id}"); // Remove the record of the file $stmt = $this->pdo->prepare("DELETE FROM `".constants::db_prefix."file` WHERE `id`=?"); $stmt->execute(array($this->id)); if ($stmt->rowCount() == 1) { return true; } else { return false; } } }