123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Form select element
- *
- * @author Magento Core Team <core@magentocommerce.com>
- */
- namespace Magento\Framework\Data\Form\Element;
- use Magento\Framework\Escaper;
- class Multiselect extends AbstractElement
- {
- /**
- * @param Factory $factoryElement
- * @param CollectionFactory $factoryCollection
- * @param Escaper $escaper
- * @param array $data
- */
- public function __construct(
- Factory $factoryElement,
- CollectionFactory $factoryCollection,
- Escaper $escaper,
- $data = []
- ) {
- parent::__construct($factoryElement, $factoryCollection, $escaper, $data);
- $this->setType('select');
- $this->setExtType('multiple');
- $this->setSize(10);
- }
- /**
- * Get the name
- *
- * @return string
- */
- public function getName()
- {
- $name = parent::getName();
- if (strpos($name, '[]') === false) {
- $name .= '[]';
- }
- return $name;
- }
- /**
- * Get the element as HTML
- *
- * @return string
- */
- public function getElementHtml()
- {
- $this->addClass('select multiselect admin__control-multiselect');
- $html = '';
- if ($this->getCanBeEmpty()) {
- $html .= '
- <input type="hidden" id="' . $this->getHtmlId() . '_hidden" name="' . parent::getName() . '" value="" />
- ';
- }
- if (!empty($this->_data['disabled'])) {
- $html .= '<input type="hidden" name="' . parent::getName() . '_disabled" value="" />';
- }
- $html .= '<select id="' . $this->getHtmlId() . '" name="' . $this->getName() . '" ' . $this->serialize(
- $this->getHtmlAttributes()
- ) . $this->_getUiId() . ' multiple="multiple">' . "\n";
- $value = $this->getValue();
- if (!is_array($value)) {
- $value = explode(',', $value);
- }
- $values = $this->getValues();
- if ($values) {
- foreach ($values as $option) {
- if (is_array($option['value'])) {
- $html .= '<optgroup label="' . $option['label'] . '">' . "\n";
- foreach ($option['value'] as $groupItem) {
- $html .= $this->_optionToHtml($groupItem, $value);
- }
- $html .= '</optgroup>' . "\n";
- } else {
- $html .= $this->_optionToHtml($option, $value);
- }
- }
- }
- $html .= '</select>' . "\n";
- $html .= $this->getAfterElementHtml();
- return $html;
- }
- /**
- * Get the HTML attributes
- *
- * @return string[]
- */
- public function getHtmlAttributes()
- {
- return [
- 'title',
- 'class',
- 'style',
- 'onclick',
- 'onchange',
- 'disabled',
- 'size',
- 'tabindex',
- 'data-form-part',
- 'data-role',
- 'data-action'
- ];
- }
- /**
- * Get the default HTML
- *
- * @return string
- */
- public function getDefaultHtml()
- {
- $result = $this->getNoSpan() === true ? '' : '<span class="field-row">' . "\n";
- $result .= $this->getLabelHtml();
- $result .= $this->getElementHtml();
- if ($this->getSelectAll() && $this->getDeselectAll()) {
- $result .= '<a href="#" onclick="return ' .
- $this->getJsObjectName() .
- '.selectAll()">' .
- $this->getSelectAll() .
- '</a> <span class="separator"> | </span>';
- $result .= '<a href="#" onclick="return ' .
- $this->getJsObjectName() .
- '.deselectAll()">' .
- $this->getDeselectAll() .
- '</a>';
- }
- $result .= $this->getNoSpan() === true ? '' : '</span>' . "\n";
- $result .= '<script type="text/javascript">' . "\n";
- $result .= ' var ' . $this->getJsObjectName() . ' = {' . "\n";
- $result .= ' selectAll: function() { ' . "\n";
- $result .= ' var sel = $("' . $this->getHtmlId() . '");' . "\n";
- $result .= ' for(var i = 0; i < sel.options.length; i ++) { ' . "\n";
- $result .= ' sel.options[i].selected = true; ' . "\n";
- $result .= ' } ' . "\n";
- $result .= ' return false; ' . "\n";
- $result .= ' },' . "\n";
- $result .= ' deselectAll: function() {' . "\n";
- $result .= ' var sel = $("' . $this->getHtmlId() . '");' . "\n";
- $result .= ' for(var i = 0; i < sel.options.length; i ++) { ' . "\n";
- $result .= ' sel.options[i].selected = false; ' . "\n";
- $result .= ' } ' . "\n";
- $result .= ' return false; ' . "\n";
- $result .= ' }' . "\n";
- $result .= ' }' . "\n";
- $result .= "\n" . '</script>';
- return $result;
- }
- /**
- * Get the name of the JS object
- *
- * @return string
- */
- public function getJsObjectName()
- {
- return $this->getHtmlId() . 'ElementControl';
- }
- /**
- * @param array $option
- * @param array $selected
- * @return string
- */
- protected function _optionToHtml($option, $selected)
- {
- $html = '<option value="' . $this->_escape($option['value']) . '"';
- $html .= isset($option['title']) ? 'title="' . $this->_escape($option['title']) . '"' : '';
- $html .= isset($option['style']) ? 'style="' . $option['style'] . '"' : '';
- if (in_array((string)$option['value'], $selected)) {
- $html .= ' selected="selected"';
- }
- $html .= '>' . $this->_escape($option['label']) . '</option>' . "\n";
- return $html;
- }
- }
|