/** * Class constructor * * Possible keys in $data array are: * - 'messageProvider': an instance of a class implementing * HTML_QuickForm2_MessageProvider interface, this will be used to get * localized error messages. Default will be used if not given. * - 'language': language to display error messages in, will be passed to * message provider. * - 'errorMessages': (DEPRECATED, use messageProvider) 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()) { // Using deprecated 'errorMessages' key, let's keep this separate to remove later if (isset($data['errorMessages'])) { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_MessageProvider_Default'); $this->messageProvider = HTML_QuickForm2_MessageProvider_Default::getInstance(); // neither array_merge() nor array_merge_recursive will do foreach ($data['errorMessages'] as $lang => $ary) { foreach ($ary as $code => $message) { $this->messageProvider->set(array('file', $code), $lang, $message); } } } elseif (isset($data['messageProvider'])) { if (!is_callable($data['messageProvider']) && !$data['messageProvider'] instanceof HTML_QuickForm2_MessageProvider) { throw new HTML_QuickForm2_InvalidArgumentException("messageProvider: expecting a callback or an implementation" . " of HTML_QuickForm2_MessageProvider"); } $this->messageProvider = $data['messageProvider']; } else { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_MessageProvider_Default'); $this->messageProvider = HTML_QuickForm2_MessageProvider_Default::getInstance(); } if (isset($data['language'])) { $this->language = $data['language']; } unset($data['messageProvider'], $data['errorMessages'], $data['language']); parent::__construct($name, $attributes, $data); }
/** * Class constructor * * The following keys may appear in $data array: * - 'messageProvider': a callback or an instance of a class implementing * HTML_QuickForm2_MessageProvider interface, this will be used to get * localized names of months and weekdays. Some of the default ones will * be used if not given. * - 'language': date language, use 'locale' here to display month / weekday * names according to the current locale. * - 'format': Format of the date, based on PHP's date() function. * The following characters are currently recognised in format string: * <pre> * D => Short names of days * l => Long names of days * d => Day numbers * M => Short names of months * F => Long names of months * m => Month numbers * Y => Four digit year * y => Two digit year * h => 12 hour format * H => 24 hour format * i => Minutes * s => Seconds * a => am/pm * A => AM/PM * </pre> * - 'minYear': Minimum year in year select * - 'maxYear': Maximum year in year select * - 'addEmptyOption': Should an empty option be added to the top of * each select box? * - 'emptyOptionValue': The value passed by the empty option. * - 'emptyOptionText': The text displayed for the empty option. * - 'optionIncrement': Step to increase the option values by (works for 'i' and 's') * - 'minHour': Minimum hour in hour select (only for 24 hour format!) * - 'maxHour': Maximum hour in hour select (only for 24 hour format!) * - 'minMonth': Minimum month in month select * - 'maxMonth': Maximum month in month select * * @param string Element name * @param mixed Attributes (either a string or an array) * @param array Element data (label, options and data used for element creation) */ public function __construct($name = null, $attributes = null, array $data = array()) { if (isset($data['messageProvider'])) { if (!is_callable($data['messageProvider']) && !$data['messageProvider'] instanceof HTML_QuickForm2_MessageProvider) { throw new HTML_QuickForm2_InvalidArgumentException("messageProvider: expecting a callback or an implementation" . " of HTML_QuickForm2_MessageProvider"); } $this->messageProvider = $data['messageProvider']; } else { if (isset($data['language']) && 'locale' == $data['language']) { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_MessageProvider_Strftime'); $this->messageProvider = new HTML_QuickForm2_MessageProvider_Strftime(); } else { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_MessageProvider_Default'); $this->messageProvider = HTML_QuickForm2_MessageProvider_Default::getInstance(); } } if (isset($data['language'])) { $this->language = $data['language']; } unset($data['messageProvider'], $data['language']); // http://pear.php.net/bugs/bug.php?id=18171 $this->data['maxYear'] = date('Y'); parent::__construct($name, $attributes, $data); $backslash = false; $separators = array(); $separator = ''; for ($i = 0, $length = strlen($this->data['format']); $i < $length; $i++) { $sign = $this->data['format'][$i]; if ($backslash) { $backslash = false; $separator .= $sign; } else { $loadSelect = true; switch ($sign) { case 'D': // Sunday is 0 like with 'w' in date() $options = $this->messageProvider instanceof HTML_QuickForm2_MessageProvider ? $this->messageProvider->get(array('date', 'weekdays_short'), $this->language) : call_user_func($this->messageProvider, array('date', 'weekdays_short'), $this->language); break; case 'l': $options = $this->messageProvider instanceof HTML_QuickForm2_MessageProvider ? $this->messageProvider->get(array('date', 'weekdays_long'), $this->language) : call_user_func($this->messageProvider, array('date', 'weekdays_long'), $this->language); break; case 'd': $options = $this->createOptionList(1, 31); break; case 'M': case 'm': case 'F': $options = $this->createOptionList($this->data['minMonth'], $this->data['maxMonth'], $this->data['minMonth'] > $this->data['maxMonth'] ? -1 : 1); if ('M' == $sign || 'F' == $sign) { $key = 'M' == $sign ? 'months_short' : 'months_long'; $names = $this->messageProvider instanceof HTML_QuickForm2_MessageProvider ? $this->messageProvider->get(array('date', $key), $this->language) : call_user_func($this->messageProvider, array('date', $key), $this->language); foreach ($options as $k => &$v) { $v = $names[$k - 1]; } } break; case 'Y': $options = $this->createOptionList($this->data['minYear'], $this->data['maxYear'], $this->data['minYear'] > $this->data['maxYear'] ? -1 : 1); break; case 'y': $options = $this->createOptionList($this->data['minYear'], $this->data['maxYear'], $this->data['minYear'] > $this->data['maxYear'] ? -1 : 1); array_walk($options, create_function('&$v,$k', '$v = substr($v,-2);')); break; case 'h': $options = $this->createOptionList(1, 12); break; case 'g': $options = $this->createOptionList(1, 12); array_walk($options, create_function('&$v,$k', '$v = intval($v);')); break; case 'H': $options = $this->createOptionList($this->data['minHour'], $this->data['maxHour'], $this->data['minHour'] > $this->data['maxHour'] ? -1 : 1); break; case 'i': $options = $this->createOptionList(0, 59, $this->data['optionIncrement']['i']); break; case 's': $options = $this->createOptionList(0, 59, $this->data['optionIncrement']['s']); break; case 'a': $options = array('am' => 'am', 'pm' => 'pm'); break; case 'A': $options = array('AM' => 'AM', 'PM' => 'PM'); break; case 'W': $options = $this->createOptionList(1, 53); break; case '\\': $backslash = true; $loadSelect = false; break; default: $separator .= ' ' == $sign ? ' ' : $sign; $loadSelect = false; } if ($loadSelect) { if (0 < count($this)) { $separators[] = $separator; } $separator = ''; // Should we add an empty option to the top of the select? if (!is_array($this->data['addEmptyOption']) && $this->data['addEmptyOption'] || is_array($this->data['addEmptyOption']) && !empty($this->data['addEmptyOption'][$sign])) { // Using '+' array operator to preserve the keys if (is_array($this->data['emptyOptionText']) && !empty($this->data['emptyOptionText'][$sign])) { $options = array($this->data['emptyOptionValue'] => $this->data['emptyOptionText'][$sign]) + $options; } else { $options = array($this->data['emptyOptionValue'] => $this->data['emptyOptionText']) + $options; } } $this->addSelect($sign, array('id' => self::generateId($this->getName() . "[{$sign}]")) + $this->getAttributes())->loadOptions($options); } } } $separators[] = $separator . ($backslash ? '\\' : ''); $this->setSeparator($separators); }
/** * Class constructor * * Possible keys in $data array are: * - 'messageProvider': an instance of a class implementing * HTML_QuickForm2_MessageProvider interface, this will be used to get * localized error messages. Default will be used if not given. * - 'language': language to display error messages in, will be passed to * message provider. * * @param string $name Element name * @param string|array $attributes Attributes (either a string or an array) * @param array $data 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['messageProvider'])) { if (!is_callable($data['messageProvider']) && !$data['messageProvider'] instanceof HTML_QuickForm2_MessageProvider) { throw new HTML_QuickForm2_InvalidArgumentException("messageProvider: expecting a callback or an implementation" . " of HTML_QuickForm2_MessageProvider"); } $this->messageProvider = $data['messageProvider']; } else { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_MessageProvider_Default'); $this->messageProvider = HTML_QuickForm2_MessageProvider_Default::getInstance(); } if (isset($data['language'])) { $this->language = $data['language']; } unset($data['messageProvider'], $data['language']); parent::__construct($name, $attributes, $data); }
/** * Returns Singleton instance * * @return HTML_QuickForm2_MessageProvider_Default */ public static function getInstance() { if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; }