Source of file Select.php
Size: 7,297 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Form/Element/Select.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Form\Element; use Traversable; use Zend\Form\Element; use Zend\Form\ElementInterface; use Zend\Form\Exception\InvalidArgumentException; use Zend\InputFilter\InputProviderInterface; use Zend\Validator\Explode as ExplodeValidator; use Zend\Validator\InArray as InArrayValidator; class Select extends Element implements InputProviderInterface { /** * Seed attributes * * @var array */ protected $attributes = array( 'type' => 'select', ); /** * @var \Zend\Validator\ValidatorInterface */ protected $validator; /** * @var bool */ protected $disableInArrayValidator = false; /** * Create an empty option (option with label but no value). If set to null, no option is created * * @var bool */ protected $emptyOption = null; /** * @var array */ protected $valueOptions = array(); /** * @return array */ public function getValueOptions() { return $this->valueOptions; } /** * @param array $options * @return Select */ public function setValueOptions(array $options) { $this->valueOptions = $options; // Update InArrayValidator validator haystack if (null !== $this->validator) { if ($this->validator instanceof InArrayValidator) { $validator = $this->validator; } if ($this->validator instanceof ExplodeValidator && $this->validator->getValidator() instanceof InArrayValidator ) { $validator = $this->validator->getValidator(); } if (!empty($validator)) { $validator->setHaystack($this->getValueOptionsValues()); } } return $this; } /** * @param string $key * @return self */ public function unsetValueOption($key) { if (isset($this->valueOptions[$key])) { unset($this->valueOptions[$key]); } return $this; } /** * Set options for an element. Accepted options are: * - label: label to associate with the element * - label_attributes: attributes to use when the label is rendered * - value_options: list of values and labels for the select options * _ empty_option: should an empty option be prepended to the options ? * * @param array|Traversable $options * @return Select|ElementInterface * @throws InvalidArgumentException */ public function setOptions($options) { parent::setOptions($options); if (isset($this->options['value_options'])) { $this->setValueOptions($this->options['value_options']); } // Alias for 'value_options' if (isset($this->options['options'])) { $this->setValueOptions($this->options['options']); } if (isset($this->options['empty_option'])) { $this->setEmptyOption($this->options['empty_option']); } if (isset($this->options['disable_inarray_validator'])) { $this->setDisableInArrayValidator($this->options['disable_inarray_validator']); } return $this; } /** * Set a single element attribute * * @param string $key * @param mixed $value * @return Select|ElementInterface */ public function setAttribute($key, $value) { // Do not include the options in the list of attributes // TODO: Deprecate this if ($key === 'options') { $this->setValueOptions($value); return $this; } return parent::setAttribute($key, $value); } /** * Set the flag to allow for disabling the automatic addition of an InArray validator. * * @param bool $disableOption * @return Select */ public function setDisableInArrayValidator($disableOption) { $this->disableInArrayValidator = (bool) $disableOption; return $this; } /** * Get the disable in array validator flag. * * @return bool */ public function disableInArrayValidator() { return $this->disableInArrayValidator; } /** * Set the string for an empty option (can be empty string). If set to null, no option will be added * * @param string|null $emptyOption * @return Select */ public function setEmptyOption($emptyOption) { $this->emptyOption = $emptyOption; return $this; } /** * Return the string for the empty option (null if none) * * @return string|null */ public function getEmptyOption() { return $this->emptyOption; } /** * Get validator * * @return \Zend\Validator\ValidatorInterface */ protected function getValidator() { if (null === $this->validator && !$this->disableInArrayValidator()) { $validator = new InArrayValidator(array( 'haystack' => $this->getValueOptionsValues(), 'strict' => false )); $multiple = (isset($this->attributes['multiple'])) ? $this->attributes['multiple'] : null; if (true === $multiple || 'multiple' === $multiple) { $validator = new ExplodeValidator(array( 'validator' => $validator, 'valueDelimiter' => null, // skip explode if only one value )); } $this->validator = $validator; } return $this->validator; } /** * Provide default input rules for this element * * Attaches the captcha as a validator. * * @return array */ public function getInputSpecification() { $spec = array( 'name' => $this->getName(), 'required' => true, ); if ($validator = $this->getValidator()) { $spec['validators'] = array( $validator, ); } return $spec; } /** * Get only the values from the options attribute * * @return array */ protected function getValueOptionsValues() { $values = array(); $options = $this->getValueOptions(); foreach ($options as $key => $optionSpec) { if (is_array($optionSpec) && array_key_exists('options', $optionSpec)) { foreach ($optionSpec['options'] as $nestedKey => $nestedOptionSpec) { $values[] = $this->getOptionValue($nestedKey, $nestedOptionSpec); } continue; } $values[] = $this->getOptionValue($key, $optionSpec); } return $values; } protected function getOptionValue($key, $optionSpec) { return is_array($optionSpec) ? $optionSpec['value'] : $key; } } |