* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * sfWidgetFormSelect represents a select HTML tag. * * @package symfony * @subpackage widget * @author Fabien Potencier * @version SVN: $Id: sfWidgetFormSelect.class.php 30762 2010-08-25 12:33:33Z fabien $ */ class sfWidgetFormSelect extends sfWidgetFormChoiceBase { /** * Constructor. * * Available options: * * * choices: An array of possible choices (required) * * multiple: true if the select tag must allow multiple selections * * @param array $options An array of options * @param array $attributes An array of default HTML attributes * * @see sfWidgetFormChoiceBase */ protected function configure($options = array(), $attributes = array()) { parent::configure($options, $attributes); $this->addOption('multiple', false); } /** * Renders the widget. * * @param string $name The element name * @param string $value The value selected in this widget * @param array $attributes An array of HTML attributes to be merged with the default HTML attributes * @param array $errors An array of errors for the field * * @return string An HTML tag string * * @see sfWidgetForm */ public function render($name, $value = null, $attributes = array(), $errors = array()) { if ($this->getOption('multiple')) { $attributes['multiple'] = 'multiple'; if ('[]' != substr($name, -2)) { $name .= '[]'; } } $choices = $this->getChoices(); return $this->renderContentTag('select', "\n".implode("\n", $this->getOptionsForSelect($value, $choices))."\n", array_merge(array('name' => $name), $attributes)); } /** * Returns an array of option tags for the given choices * * @param string $value The selected value * @param array $choices An array of choices * * @return array An array of option tags */ protected function getOptionsForSelect($value, $choices) { $mainAttributes = $this->attributes; $this->attributes = array(); if (!is_array($value)) { $value = array($value); } $value = array_map('strval', array_values($value)); $value_set = array_flip($value); $options = array(); foreach ($choices as $key => $option) { if (is_array($option)) { $options[] = $this->renderContentTag('optgroup', implode("\n", $this->getOptionsForSelect($value, $option)), array('label' => self::escapeOnce($key))); } else { $attributes = array('value' => self::escapeOnce($key)); if (isset($value_set[strval($key)])) { $attributes['selected'] = 'selected'; } $options[] = $this->renderContentTag('option', self::escapeOnce($option), $attributes); } } $this->attributes = $mainAttributes; return $options; } }