_fileUploadValidator = new Quform_Validator_FileUpload(array(
'name' => $this->getName()
));
$this->addValidator($this->_fileUploadValidator);
if (is_array($options)) {
if (array_key_exists('allowedExtensions', $options)) {
$this->_fileUploadValidator->setAllowedExtensions($options['allowedExtensions']);
}
if (array_key_exists('maximumFileSize', $options)) {
$this->_fileUploadValidator->setMaxFileSize($options['maximumFileSize']);
}
if (array_key_exists('required', $options)) {
$this->_fileUploadValidator->setRequired($options['required']);
}
if (array_key_exists('attach', $options)) {
$this->setAttach($options['attach']);
}
if (array_key_exists('save', $options)) {
$this->setSave($options['save']);
}
}
}
/**
* Get this elements file upload validator
*
* @return Quform_Validator_FileUpload
*/
public function getFileUploadValidator()
{
return $this->_fileUploadValidator;
}
/**
* Is the uploaded file valid?
*
* @param string $value The value to check
* @param array $context The other submitted form values
* @return boolean True if valid, false otherwise
*/
public function isValid($value, $context = null)
{
$this->_errors = array();
$valid = true;
foreach ($this->getValidators() as $validator) {
if ($validator->isValid($value, $context)) {
continue;
} else {
$errors = $validator->getMessages();
$valid = false;
}
$this->_errors = array_merge($this->_errors, $errors);
}
return $valid;
}
/**
* Sets whether or not the uploaded files for this element
* should be attached to the notification email
*
* @param boolean $flag
* @return Quform_Element_File
*/
public function setAttach($flag)
{
$this->_attach = (bool) $flag;
return $this;
}
/**
* Should the uploaded files be attached to the notification
* email?
*
* @return boolean
*/
public function getAttach()
{
return $this->_attach;
}
/**
* Sets whether or not the uploaded files for this element should
* be saved to the server
*
* @param boolean $flag
* @return Quform_Element_File
*/
public function setSave($flag)
{
$this->_save = (bool) $flag;
return $this;
}
/**
* Should the uploaded files be saved to the server?
*
* @return boolean
*/
public function getSave()
{
return $this->_save;
}
/**
* Set the upload save path for uploaded files, this should be
* the absolute path on disk
*
* @param string $savePath
* @return Quform_Element_File
*/
public function setSavePath($savePath)
{
$this->_savePath = $savePath;
return $this;
}
/**
* Get the upload save path
*
* @return string
*/
public function getSavePath()
{
return $this->_savePath;
}
/**
* Does the element have a save path?
*
* @return boolean
*/
public function hasSavePath()
{
return strlen($this->_savePath);
}
/**
* Set the URL to the upload save path
*
* @param string $savePath
* @return Quform_Element_File
*/
public function setSaveUrl($saveUrl)
{
$this->_saveUrl = $saveUrl;
return $this;
}
/**
* Get the URL to the upload save path
*
* @return string
*/
public function getSaveUrl()
{
return $this->_saveUrl;
}
/**
* Does the element have a URL to the upload save path?
*
* @return boolean
*/
public function hasSaveUrl()
{
return strlen($this->_saveUrl);
}
/**
* Add an uploaded file to the element's value
*
* @param array
* @return Quform_Element_File
*/
public function addFile($file)
{
$this->_value[] = $file;
return $this;
}
/**
* Get the formatted value
*
* The value can be formatted into HTML or plain text, arrays
* are joined by $separator
*
* @deprecated 2.0.3 Use getValueHtml or getValuePlain
* @param string $format plain or html
* @param string $separator
*
* @return string The formatted value
*/
public function getFormattedValue($format = 'plain', $separator = ', ')
{
if ($format === 'html') {
return $this->getValueHtml($separator);
} else {
return $this->getValuePlain($separator);
}
}
/**
* Get the value of the form element formatted in HTML
*
* @param string $separator The separator to join array types
* @return string
*/
public function getValueHtml($separator = '
')
{
$filteredValue = $this->getValue();
$value = '';
if (is_array($filteredValue)) {
foreach ($filteredValue as $file) {
if (isset($file['url']) && strlen($file['url'])) {
$value .= '' . $file['filename'] . ' (' . self::formatFileSize($file['size']) . ')' . '';
} else {
$value .= $file['filename'] . ' (' . self::formatFileSize($file['size']) . ')';
}
$value .= $separator;
}
}
return $value;
}
/**
* Get the value of the form element formatted in plain text
*
* @param string $separator The separator to join array types
* @return string
*/
public function getValuePlain($separator = ', ')
{
$filteredValue = $this->getValue();
$value = '';
if (is_array($filteredValue)) {
foreach ($filteredValue as $file) {
$value .= $file['filename'] . ' (' . self::formatFileSize($file['size']) . ')';
if (isset($file['url']) && strlen($file['url'])) {
$value .= ' (' . $file['url'] . ')';
}
$value .= $separator;
}
}
return $value;
}
/**
* Get the human readable file size from the given bytes
*
* @param int $size
* @return string
*/
public static function formatFileSize($size)
{
if ($size == 0) {
return 'n/a';
}
$sizes = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
return (round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $sizes[$i]);
}
/**
* Save an uploaded file
*
* @param string $uploadPath The uploads folder path on disk
* @param string $uploadUrl The URL to the uploads folder
* @param array $fileData
* @param Quform_Element_File $element
* @return false|array The array of new file data or false on failure
*/
public static function saveUpload($uploadPath, $uploadUrl, $fileData, $element)
{
$savePath = $element->hasSavePath() ? $element->getSavePath() : $uploadPath;
$savePath = rtrim(realpath($savePath), '/') . '/';
$saveUrl = $element->hasSaveUrl() ? $element->getSaveUrl() : $uploadUrl;
$saveUrl = strlen($saveUrl) ? rtrim($saveUrl, '/') . '/' : '';
if (is_writeable($savePath)) {
if (file_exists($savePath . $fileData['filename'])) {
$fileData['filename'] = self::generateFilename($savePath, $fileData['filename']);
}
if (move_uploaded_file($fileData['path'], $savePath . $fileData['filename'])) {
chmod($savePath . $fileData['filename'], 0644);
$fileData['path'] = $savePath . $fileData['filename'];
$fileData['url'] = strlen($saveUrl) ? $saveUrl . $fileData['filename'] : '';
return $fileData;
}
}
return false;
}
/**
* Returns an array with information about the given path
*
* @param string $path
* @return array
*/
public static function pathinfo($path)
{
$pathInfo = array(
'dirname' => '',
'basename' => '',
'filename' => '',
'extension' => ''
);
// PHP <5.2 workaround
if (!defined(PATHINFO_FILENAME) && strpos($path, '.') !== false) {
$pathInfo['filename'] = substr($path, 0, strrpos($path, '.'));
}
return array_merge($pathInfo, pathinfo($path));
}
/**
* Returns a santised filename from the given path
*
* @param string $path
* @return string
*/
public static function filterFilename($path)
{
$pathInfo = Quform_Element_File::pathinfo($path);
$extension = $pathInfo['extension'];
$filename = $pathInfo['filename'];
$filenameFilter = new Quform_Filter_Filename();
$filename = $filenameFilter->filter($filename);
$filename = (strlen($filename)) ? $filename : 'upload';
$filename = (strlen($extension)) ? "$filename.$extension" : $filename;
return $filename;
}
/**
* Generate a filename that does not already exist in the given path
*
* @param string $path Path to save the file
* @param string $filename The filename
* @return string
*/
public static function generateFilename($path, $filename)
{
$count = 1;
$newFilenamePath = $path . $filename;
while (file_exists($newFilenamePath)) {
$newFilename = $count++ . '_' . $filename;
$newFilenamePath = $path . $newFilename;
}
return $newFilename;
}
}