Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Region.php
Go to the documentation of this file.
1 <?php
7 
9 
15 class Region implements \Magento\Framework\Data\Form\Element\Renderer\RendererInterface
16 {
27  protected static $_regionCollections;
28 
34  protected $_escaper = null;
35 
39  protected $_countryFactory;
40 
46  public function __construct(
47  \Magento\Directory\Model\CountryFactory $countryFactory,
48  \Magento\Directory\Helper\Data $directoryHelper,
49  \Magento\Framework\Escaper $escaper
50  ) {
51  $this->_countryFactory = $countryFactory;
52  $this->_directoryHelper = $directoryHelper;
53  $this->_escaper = $escaper;
54  }
55 
62  public function render(AbstractElement $element)
63  {
64  $countryId = false;
65  $isRegionRequired = false;
66  if ($country = $element->getForm()->getElement('country_id')) {
67  $countryId = $country->getValue();
68  $isRegionRequired = $this->_directoryHelper->isRegionRequired($countryId);
69  }
70 
71  $html = '<div class="field field-region ' . ($isRegionRequired ? 'required' : '') . '">' . "\n";
72 
73  $regionCollection = false;
74  if ($countryId) {
75  if (!isset(self::$_regionCollections[$countryId])) {
76  self::$_regionCollections[$countryId] = $this->_countryFactory->create()->setId(
77  $countryId
78  )->getLoadedRegionCollection()->toOptionArray();
79  }
80  $regionCollection = self::$_regionCollections[$countryId];
81  }
82 
83  $regionId = intval($element->getForm()->getElement('region_id')->getValue());
84 
85  $htmlAttributes = $element->getHtmlAttributes();
86  foreach ($htmlAttributes as $key => $attribute) {
87  if ('type' === $attribute) {
88  unset($htmlAttributes[$key]);
89  break;
90  }
91  }
92 
93  // Output two elements - for 'region' and for 'region_id'.
94  // Two elements are needed later upon form post - to properly set data to address model,
95  // otherwise old value can be left in region_id attribute and saved to DB.
96  // Depending on country selected either 'region' (input text) or 'region_id' (selectbox) is visible to user
97  $regionHtmlName = $element->getName();
98  $regionIdHtmlName = str_replace('region', 'region_id', $regionHtmlName);
99  $regionHtmlId = $element->getHtmlId();
100  $regionIdHtmlId = str_replace('region', 'region_id', $regionHtmlId);
101 
102  if ($isRegionRequired) {
103  $element->addClass('required-entry');
104  }
105 
106  if ($regionCollection && count($regionCollection) > 0) {
107  $elementClass = $element->getClass();
108  $html .= '<label class="label" for="' .
109  $regionIdHtmlId .
110  '"><span>' .
111  $element->getLabel() .
112  '</span>' .
113  '</label>';
114  $html .= '<div class="control">';
115 
116  $html .= '<select id="' . $regionIdHtmlId . '" name="' . $regionIdHtmlName . '" ' . $element->serialize(
117  $htmlAttributes
118  ) . '>' . "\n";
119  foreach ($regionCollection as $region) {
120  $selected = $regionId == $region['value'] ? ' selected="selected"' : '';
121  $regionVal = 0 == $region['value'] ? '' : (int)$region['value'];
122  $html .= '<option value="' . $regionVal . '"' . $selected . '>' . $this->_escaper->escapeHtml(
123  __($region['label'])
124  ) . '</option>';
125  }
126  $html .= '</select>' . "\n";
127 
128  $html .= '<input type="hidden" name="' . $regionHtmlName . '" id="' . $regionHtmlId . '" value=""/>';
129 
130  $html .= '</div>';
131  $element->setClass($elementClass);
132  } else {
133  $html .= '<label class="label" for="' .
134  $regionHtmlId .
135  '"><span>' .
136  $element->getLabel() .
137  '</span></label>';
138  $html .= '<div class="control">';
139  $html .= '<input id="' .
140  $regionHtmlId .
141  '" name="' .
142  $regionHtmlName .
143  '" value="' .
144  $element->getEscapedValue() .
145  '" ' .
146  $element->serialize(
147  $htmlAttributes
148  ) . "/>" . "\n";
149  $html .= '<input type="hidden" name="' . $regionIdHtmlName . '" id="' . $regionIdHtmlId . '" value=""/>';
150  $html .= '</div>' . "\n";
151  }
152  $html .= '</div>' . "\n";
153  return $html;
154  }
155 }
__()
Definition: __.php:13
render(AbstractElement $element)
Definition: Region.php:62
__construct(\Magento\Directory\Model\CountryFactory $countryFactory, \Magento\Directory\Helper\Data $directoryHelper, \Magento\Framework\Escaper $escaper)
Definition: Region.php:46
$element
Definition: element.phtml:12