* @author Bertrand Mansion * @author Alexey Borzov * @copyright 2001-2009 The PHP Group * @license http://www.php.net/license/3_01.txt PHP License 3.01 * @version CVS: $Id: file.php,v 1.25 2009/04/04 21:34:02 avb Exp $ * @link http://pear.php.net/package/HTML_QuickForm */ /** * HTML class for a file upload field * * @category HTML * @package HTML_QuickForm * @author Adam Daniel * @author Bertrand Mansion * @author Alexey Borzov * @version Release: 3.2.11 * @since 1.0 */ class HTML_QuickForm_file extends HTML_QuickForm_input { /** * Uploaded file data, from $_FILES * @var array */ var $_value = null; /** * Class constructor * * @param string Input field name attribute * @param string Input field label * @param mixed (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public */ public function __construct($elementName=null, $elementLabel=null, $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); $this->setType('file'); } /** * Sets size of file element * * @param int Size of file element * @since 1.0 * @access public */ function setSize($size) { $this->updateAttributes(array('size' => $size)); } /** * Returns size of file element * * @since 1.0 * @access public * @return int */ function getSize() { return $this->getAttribute('size'); } /** * Freeze the element so that only its value is returned * * @access public * @return bool */ function freeze() { return false; } /** * Sets value for file element. * * Actually this does nothing. The function is defined here to override * HTML_Quickform_input's behaviour of setting the 'value' attribute. As * no sane user-agent uses 's value for anything * (because of security implications) we implement file's value as a * read-only property with a special meaning. * * @param mixed Value for file element * @since 3.0 * @access public */ function setValue($value) { return null; } /** * Returns information about the uploaded file * * @since 3.0 * @access public * @return array */ public function getValue() { return $this->_value; } // end func getValue // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string Name of event * @param mixed event arguments * @param object calling object * @since 1.0 * @access public * @return bool */ public function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': if ($caller->getAttribute('method') == 'get') { throw new \Exception('Cannot add a file upload field to a GET method form'); } $this->_value = $this->_findValue(); $caller->updateAttributes(array('enctype' => 'multipart/form-data')); $caller->setMaxFileSize(); break; case 'addElement': $this->onQuickFormEvent('createElement', $arg, $caller); return $this->onQuickFormEvent('updateValue', null, $caller); break; case 'createElement': //$className = get_class($this); //$this &= new $className($arg[0], $arg[1], $arg[2]); break; } return true; } /** * Moves an uploaded file into the destination * * @param string Destination directory path * @param string New file name * @access public * @return bool Whether the file was moved successfully */ public function moveUploadedFile($dest, $fileName = '') { if ($dest != '' && substr($dest, -1) != '/') { $dest .= '/'; } $fileName = ($fileName != '') ? $fileName : basename($this->_value['name']); return move_uploaded_file($this->_value['tmp_name'], $dest . $fileName); } /** * Checks if the element contains an uploaded file * * @access public * @return bool true if file has been uploaded, false otherwise */ public function isUploadedFile() { return self::_ruleIsUploadedFile($this->_value); } /** * Checks if the given element contains an uploaded file * * @param array Uploaded file info (from $_FILES) * @access private * @return bool true if file has been uploaded, false otherwise */ public static function _ruleIsUploadedFile($elementValue) { if ((isset($elementValue['error']) && $elementValue['error'] == 0) || (!empty($elementValue['tmp_name']) && $elementValue['tmp_name'] != 'none')) { return is_uploaded_file($elementValue['tmp_name']); } else { return false; } } /** * Tries to find the element value from the values array * * Needs to be redefined here as $_FILES is populated differently from * other arrays when element name is of the form foo[bar] * * @access public * @return mixed */ public function _findValue(&$values = null) { if (empty($_FILES)) { return null; } $elementName = $this->getName(); if (isset($_FILES[$elementName])) { return $_FILES[$elementName]; } elseif (false !== ($pos = strpos($elementName, '['))) { $base = str_replace( array('\\', '\''), array('\\\\', '\\\''), substr($elementName, 0, $pos) ); $idx = "['" . str_replace( array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"), substr($elementName, $pos + 1, -1) ) . "']"; $props = array('name', 'type', 'size', 'tmp_name', 'error'); $code = "if (!isset(\$_FILES['{$base}']['name']{$idx})) {\n" . " return null;\n" . "} else {\n" . " \$value = array();\n"; foreach ($props as $prop) { $code .= " \$value['{$prop}'] = \$_FILES['{$base}']['{$prop}']{$idx};\n"; } return eval($code . " return \$value;\n}\n"); } else { return null; } } /** * @return string */ public function getElementJS($param) { $id = $this->getAttribute('id'); $ratio = 'aspectRatio: 16 / 9'; if (!empty($param['ratio'])) { $ratio = 'aspectRatio: '.$param['ratio'].','; } $scalable = 'false'; if (!empty($param['scalable']) && $param['scalable'] != 'false') { $ratio = ''; $scalable = $param['scalable']; } return ''; } /** * @return string */ public function toHtml() { $js = ''; if (isset($this->_attributes['crop_image'])) { $ratio = '16 / 9'; if (!empty($this->_attributes['crop_ratio'])) { $ratio = $this->_attributes['crop_ratio']; } $scalable = 'false'; if (!empty($this->_attributes['crop_scalable'])) { $scalable = $this->_attributes['crop_scalable']; } $js = $this->getElementJS(array('ratio' => $ratio, 'scalable' => $scalable)); } if ($this->isFrozen()) { return $this->getFrozenHtml(); } else { $class = ''; if (isset($this->_attributes['custom']) && $this->_attributes['custom']) { $class = 'input-file'; } return $js.$this->_getTabs(). '_getAttrString($this->_attributes).' />'; } } /** * @param string $layout * * @return string */ public function getTemplate($layout) { $name = $this->getName(); $attributes = $this->getAttributes(); $size = $this->calculateSize(); switch ($layout) { case FormValidator::LAYOUT_INLINE: return '
{element}
'; break; case FormValidator::LAYOUT_HORIZONTAL: if (isset($attributes['custom']) && $attributes['custom']) { $template = '
{element}

'; } else { $template = '
{icon} {element}

{label_2}

{error}
{label_3}
'; } return $template; break; case FormValidator::LAYOUT_BOX_NO_LABEL: return '
{icon} {element}
'; break; } } }