elements * * PHP version 5 * * LICENSE: * * Copyright (c) 2006-2010, Alexey Borzov , * Bertrand Mansion * 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 * @author Bertrand Mansion * @license http://opensource.org/licenses/bsd-license.php New BSD License * @version SVN: $Id: InputFile.php 300722 2010-06-24 10:15:52Z mansion $ * @link http://pear.php.net/package/HTML_QuickForm2 */ /** * Base class for elements */ // require_once 'HTML/QuickForm2/Element/Input.php'; /** * Class for elements * * @category HTML * @package HTML_QuickForm2 * @author Alexey Borzov * @author Bertrand Mansion * @version Release: @package_version@ */ 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 *
    *      'language code 1' => array(
    *         UPLOAD_ERR_... => 'message',
    *         ...
    *         UPLOAD_ERR_... => 'message'
    *      ),
    *      ...
    *      'language code N' => array(
    *         ...
    *      )
    *    
* 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; } public 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(); } public function addFilter($callback, array $options = null, $recursive = true) { throw new HTML_QuickForm2_Exception( 'InputFile elements do not support filters' ); } } ?>