home *** CD-ROM | disk | FTP | other *** search
- <?php
- /**
- * Class for <input type="file" /> elements
- *
- * PHP version 5
- *
- * LICENSE:
- *
- * Copyright (c) 2006, 2007, Alexey Borzov <avb@php.net>,
- * Bertrand Mansion <golgote@mamasam.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * The names of the authors may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @category HTML
- * @package HTML_QuickForm2
- * @author Alexey Borzov <avb@php.net>
- * @author Bertrand Mansion <golgote@mamasam.com>
- * @license http://opensource.org/licenses/bsd-license.php New BSD License
- * @version CVS: $Id: InputFile.php,v 1.6 2007/10/22 16:04:57 avb Exp $
- * @link http://pear.php.net/package/HTML_QuickForm2
- */
-
- /**
- * Base class for <input> elements
- */
- require_once 'HTML/QuickForm2/Element/Input.php';
-
- /**
- * Class for <input type="file" /> elements
- *
- * @category HTML
- * @package HTML_QuickForm2
- * @author Alexey Borzov <avb@php.net>
- * @author Bertrand Mansion <golgote@mamasam.com>
- * @version Release: 0.2.0
- */
- class HTML_QuickForm2_Element_InputFile extends HTML_QuickForm2_Element_Input
- {
- /**
- * Default language for error messages
- */
- const DEFAULT_LANGUAGE = 'en';
-
- /**
- * Localized error messages for PHP's file upload errors
- * @var array
- */
- protected $errorMessages = array(
- 'en' => array(
- UPLOAD_ERR_INI_SIZE => 'The uploaded file exceeds size permitted by PHP configuration (%d bytes)',
- UPLOAD_ERR_FORM_SIZE => 'The uploaded file exceeds the MAX_FILE_SIZE directive in HTML form (%d bytes)',
- UPLOAD_ERR_PARTIAL => 'The file was only partially uploaded',
- UPLOAD_ERR_NO_TMP_DIR => 'Server error: temporary directory is missing',
- UPLOAD_ERR_CANT_WRITE => 'Server error: failed to write the file to disk',
- UPLOAD_ERR_EXTENSION => 'File upload was stopped by extension'
- ),
- 'fr' => array(
- UPLOAD_ERR_INI_SIZE => 'Le fichier envoyé excède la taille autorisée par la configuration de PHP (%d octets)',
- UPLOAD_ERR_FORM_SIZE => 'Le fichier envoyé excède la taille de MAX_FILE_SIZE spécifiée dans le formulaire HTML (%d octets)',
- UPLOAD_ERR_PARTIAL => 'Le fichier n\'a été que partiellement téléchargé',
- UPLOAD_ERR_NO_TMP_DIR => 'Erreur serveur: le répertoire temporaire est manquant',
- UPLOAD_ERR_CANT_WRITE => 'Erreur serveur: échec de l\'écriture du fichier sur le disque',
- UPLOAD_ERR_EXTENSION => 'L\'envoi de fichier est arrêté par l\'extension'
- ),
- 'ru' => array(
- UPLOAD_ERR_INI_SIZE => 'Размер загруженного файла превосходит максимально разрешённый настройками PHP (%d байт)',
- UPLOAD_ERR_FORM_SIZE => 'Размер загруженного файла превосходит директиву MAX_FILE_SIZE, указанную в форме (%d байт)',
- UPLOAD_ERR_PARTIAL => 'Файл был загружен не полностью',
- UPLOAD_ERR_NO_TMP_DIR => 'Ошибка на сервере: отсутствует каталог для временных файлов',
- UPLOAD_ERR_CANT_WRITE => 'Ошибка на сервере: не удалось записать файл на диск',
- UPLOAD_ERR_EXTENSION => 'Загрузка файла была остановлена расширением'
- )
- );
-
- /**
- * Language to display error messages in
- * @var string
- */
- protected $language;
-
- /**
- * Information on uploaded file, from submit data source
- * @var array
- */
- protected $value = null;
-
- protected $attributes = array('type' => 'file');
-
-
- /**
- * Class constructor
- *
- * Possible keys in $data array are:
- * - 'language': language to display error messages in, it should either be
- * already available in the class or provided in 'errorMessages'
- * - 'errorMessages': an array of error messages with the following format
- * <pre>
- * 'language code 1' => array(
- * UPLOAD_ERR_... => 'message',
- * ...
- * UPLOAD_ERR_... => 'message'
- * ),
- * ...
- * 'language code N' => array(
- * ...
- * )
- * </pre>
- * Note that error messages for UPLOAD_ERR_INI_SIZE and UPLOAD_ERR_FORM_SIZE
- * may contain '%d' placeholders that will be automatically replaced by the
- * appropriate size limits. Note also that you don't need to provide messages
- * for every possible error code in the arrays, you may e.g. override just
- * one error message for a particular language.
- *
- * @param string Element name
- * @param mixed Attributes (either a string or an array)
- * @param array Data used to set up error messages for PHP's file
- * upload errors.
- */
- public function __construct($name = null, $attributes = null, array $data = array())
- {
- if (isset($data['errorMessages'])) {
- // neither array_merge() nor array_merge_recursive will do
- foreach ($data['errorMessages'] as $lang => $ary) {
- foreach ($ary as $code => $message) {
- $this->errorMessages[$lang][$code] = $message;
- }
- }
- unset($data['errorMessages']);
- }
- if (!isset($data['language'])) {
- $this->language = self::DEFAULT_LANGUAGE;
- } else {
- $this->language = isset($this->errorMessages[$data['language']])?
- $data['language']: self::DEFAULT_LANGUAGE;
- unset($data['language']);
- }
- parent::__construct($name, $attributes, $data);
- }
-
-
- /**
- * File upload elements cannot be frozen
- *
- * To properly "freeze" a file upload element one has to store the uploaded
- * file somewhere and store the file info in session. This is way outside
- * the scope of this class.
- *
- * @param bool Whether element should be frozen or editable. This
- * parameter is ignored in case of file uploads
- * @return bool Always returns false
- */
- public function toggleFrozen($freeze = null)
- {
- return false;
- }
-
- /**
- * Returns the information on uploaded file
- *
- * @return array|null
- */
- public function getValue()
- {
- return $this->value;
- }
-
- /**
- * File upload's value cannot be set here
- *
- * @param mixed Value for file element, this parameter is ignored
- * @return HTML_QuickForm2_Element_InputFile
- */
- public function setValue($value)
- {
- return $this;
- }
-
- protected function updateValue()
- {
- foreach ($this->getDataSources() as $ds) {
- if ($ds instanceof HTML_QuickForm2_DataSource_Submit) {
- $value = $ds->getUpload($this->getName());
- if (null !== $value) {
- $this->value = $value;
- return;
- }
- }
- }
- $this->value = null;
- }
-
- /**
- * Performs the server-side validation
- *
- * Before the Rules added to the element kick in, the element checks the
- * error code added to the $_FILES array by PHP. If the code isn't
- * UPLOAD_ERR_OK or UPLOAD_ERR_NO_FILE then a built-in error message will be
- * displayed and no further validation will take place.
- *
- * @return boolean Whether the element is valid
- */
- protected function validate()
- {
- if (strlen($this->error)) {
- return false;
- }
- if (isset($this->value['error']) &&
- !in_array($this->value['error'], array(UPLOAD_ERR_OK, UPLOAD_ERR_NO_FILE)))
- {
- if (isset($this->errorMessages[$this->language][$this->value['error']])) {
- $errorMessage = $this->errorMessages[$this->language][$this->value['error']];
- } else {
- $errorMessage = $this->errorMessages[self::DEFAULT_LANGUAGE][$this->value['error']];
- }
- if (UPLOAD_ERR_INI_SIZE == $this->value['error']) {
- $iniSize = ini_get('upload_max_filesize');
- $size = intval($iniSize);
- switch (strtoupper(substr($iniSize, -1))) {
- case 'G': $size *= 1024;
- case 'M': $size *= 1024;
- case 'K': $size *= 1024;
- }
-
- } elseif (UPLOAD_ERR_FORM_SIZE == $this->value['error']) {
- foreach ($this->getDataSources() as $ds) {
- if ($ds instanceof HTML_QuickForm2_DataSource_Submit) {
- $size = intval($ds->getValue('MAX_FILE_SIZE'));
- break;
- }
- }
- }
- $this->error = isset($size)? sprintf($errorMessage, $size): $errorMessage;
- return false;
- }
- return parent::validate();
- }
- }
- ?>
-