123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\View\Element\Html;
- /**
- * HTML select element block
- */
- class Select extends \Magento\Framework\View\Element\AbstractBlock
- {
- /**
- * Options
- *
- * @var array
- */
- protected $_options = [];
- /**
- * Get options of the element
- *
- * @return array
- */
- public function getOptions()
- {
- return $this->_options;
- }
- /**
- * Set options for the HTML select
- *
- * @param array $options
- * @return $this
- */
- public function setOptions($options)
- {
- $this->_options = $options;
- return $this;
- }
- /**
- * Add an option to HTML select
- *
- * @param string $value HTML value
- * @param string $label HTML label
- * @param array $params HTML attributes
- * @return $this
- */
- public function addOption($value, $label, $params = [])
- {
- $this->_options[] = ['value' => $value, 'label' => $label, 'params' => $params];
- return $this;
- }
- /**
- * Set element's HTML ID
- *
- * @param string $elementId ID
- * @return $this
- */
- public function setId($elementId)
- {
- $this->setData('id', $elementId);
- return $this;
- }
- /**
- * Set element's CSS class
- *
- * @param string $class Class
- * @return $this
- */
- public function setClass($class)
- {
- $this->setData('class', $class);
- return $this;
- }
- /**
- * Set element's HTML title
- *
- * @param string $title Title
- * @return $this
- */
- public function setTitle($title)
- {
- $this->setData('title', $title);
- return $this;
- }
- /**
- * HTML ID of the element
- *
- * @return string
- */
- public function getId()
- {
- return $this->getData('id');
- }
- /**
- * CSS class of the element
- *
- * @return string
- */
- public function getClass()
- {
- return $this->getData('class');
- }
- /**
- * Returns HTML title of the element
- *
- * @return string
- */
- public function getTitle()
- {
- return $this->getData('title');
- }
- /**
- * Render HTML
- *
- * @return string
- *
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- */
- protected function _toHtml()
- {
- if (!$this->_beforeToHtml()) {
- return '';
- }
- $html = '<select name="' .
- $this->getName() .
- '" id="' .
- $this->getId() .
- '" class="' .
- $this->getClass() .
- '" title="' .
- $this->escapeHtml($this->getTitle()) .
- '" ' .
- $this->getExtraParams() .
- '>';
- $values = $this->getValue();
- if (!is_array($values)) {
- $values = (array)$values;
- }
- $isArrayOption = true;
- foreach ($this->getOptions() as $key => $option) {
- $optgroupName = '';
- if ($isArrayOption && is_array($option)) {
- $value = $option['value'];
- $label = (string)$option['label'];
- $optgroupName = isset($option['optgroup-name']) ? $option['optgroup-name'] : $label;
- $params = !empty($option['params']) ? $option['params'] : [];
- } else {
- $value = (string)$key;
- $label = (string)$option;
- $isArrayOption = false;
- $params = [];
- }
- if (is_array($value)) {
- $html .= '<optgroup label="' . $this->escapeHtml($label)
- . '" data-optgroup-name="' . $this->escapeHtml($optgroupName) . '">';
- foreach ($value as $keyGroup => $optionGroup) {
- if (!is_array($optionGroup)) {
- $optionGroup = ['value' => $keyGroup, 'label' => $optionGroup];
- }
- $html .= $this->_optionToHtml($optionGroup, in_array($optionGroup['value'], $values));
- }
- $html .= '</optgroup>';
- } else {
- $html .= $this->_optionToHtml(
- ['value' => $value, 'label' => $label, 'params' => $params],
- in_array($value, $values)
- );
- }
- }
- $html .= '</select>';
- return $html;
- }
- /**
- * Return option HTML node
- *
- * @param array $option
- * @param boolean $selected
- * @return string
- */
- protected function _optionToHtml($option, $selected = false)
- {
- $selectedHtml = $selected ? ' selected="selected"' : '';
- if ($this->getIsRenderToJsTemplate() === true) {
- $selectedHtml .= ' <%= option_extra_attrs.option_' . self::calcOptionHash($option['value']) . ' %>';
- }
- $params = '';
- if (!empty($option['params']) && is_array($option['params'])) {
- foreach ($option['params'] as $key => $value) {
- if (is_array($value)) {
- foreach ($value as $keyMulti => $valueMulti) {
- $params .= sprintf(' %s="%s" ', $keyMulti, $this->escapeHtml($valueMulti));
- }
- } else {
- $params .= sprintf(' %s="%s" ', $key, $this->escapeHtml($value));
- }
- }
- }
- return sprintf(
- '<option value="%s"%s %s>%s</option>',
- $this->escapeHtml($option['value']),
- $selectedHtml,
- $params,
- $this->escapeHtml($option['label'])
- );
- }
- /**
- * Alias for toHtml()
- *
- * @return string
- */
- public function getHtml()
- {
- return $this->toHtml();
- }
- /**
- * Calculate CRC32 hash for option value
- *
- * @param string $optionValue Value of the option
- * @return string
- */
- public function calcOptionHash($optionValue)
- {
- return sprintf('%u', crc32($this->getName() . $this->getId() . $optionValue));
- }
- }
|