[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/inc/Form/ -> OptGroup.php (source)

   1  <?php
   2  
   3  namespace dokuwiki\Form;
   4  
   5  
   6  class OptGroup extends Element {
   7      protected $options = array();
   8      protected $value;
   9  
  10      /**
  11       * @param string $label The label text for this element (will be autoescaped)
  12       * @param array  $options The available options
  13       */
  14      public function __construct($label, $options) {
  15          parent::__construct('optGroup', array('label' => $label));
  16          $this->options($options);
  17      }
  18  
  19      /**
  20       * Store the given value so it can be used during rendering
  21       *
  22       * This is intended to be only called from within @see DropdownElement::val()
  23       *
  24       * @param string $value
  25       * @return bool true if an option with the given value exists, false otherwise
  26       */
  27      public function storeValue($value) {
  28          $this->value = $value;
  29          return isset($this->options[$value]);
  30      }
  31  
  32      /**
  33       * Get or set the options of the optgroup
  34       *
  35       * Options can be given as associative array (value => label) or as an
  36       * indexd array (label = value) or as an array of arrays. In the latter
  37       * case an element has to look as follows:
  38       * option-value => array (
  39       *                 'label' => option-label,
  40       *                 'attrs' => array (
  41       *                                    attr-key => attr-value, ...
  42       *                                  )
  43       *                 )
  44       *
  45       * @param null|array $options
  46       * @return $this|array
  47       */
  48      public function options($options = null) {
  49          if($options === null) return $this->options;
  50          if(!is_array($options)) throw new \InvalidArgumentException('Options have to be an array');
  51          $this->options = array();
  52          foreach($options as $key => $val) {
  53              if (is_array($val)) {
  54                  if (!key_exists('label', $val)) throw new \InvalidArgumentException(
  55                      'If option is given as array, it has to have a "label"-key!'
  56                  );
  57                  if (key_exists('attrs', $val) && is_array($val['attrs']) && key_exists('selected', $val['attrs'])) {
  58                      throw new \InvalidArgumentException(
  59                          'Please use function "DropdownElement::val()" to set the selected option'
  60                      );
  61                  }
  62                  $this->options[$key] = $val;
  63              } elseif(is_int($key)) {
  64                  $this->options[$val] = array('label' => (string) $val);
  65              } else {
  66                  $this->options[$key] = array('label' => (string) $val);
  67              }
  68          }
  69          return $this;
  70      }
  71  
  72  
  73      /**
  74       * The HTML representation of this element
  75       *
  76       * @return string
  77       */
  78      public function toHTML() {
  79          if ($this->attributes['label'] === null) {
  80              return $this->renderOptions();
  81          }
  82          $html = '<optgroup '. buildAttributes($this->attrs()) . '>';
  83          $html .= $this->renderOptions();
  84          $html .= '</optgroup>';
  85          return $html;
  86      }
  87  
  88  
  89      /**
  90       * @return string
  91       */
  92      protected function renderOptions() {
  93          $html = '';
  94          foreach($this->options as $key => $val) {
  95              $selected = ((string)$key === (string)$this->value) ? ' selected="selected"' : '';
  96              $attrs = '';
  97              if (!empty($val['attrs']) && is_array($val['attrs'])) {
  98                  $attrs = buildAttributes($val['attrs']);
  99              }
 100              $html .= '<option' . $selected . ' value="' . hsc($key) . '" '.$attrs.'>';
 101              $html .= hsc($val['label']);
 102              $html .= '</option>';
 103          }
 104          return $html;
 105      }
 106  }