Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
AbstractFormContainers.php
Go to the documentation of this file.
1 <?php
8 
9 use Magento\Mtf\Block\Form;
10 use Magento\Mtf\Client\Element\SimpleElement;
11 use Magento\Mtf\Fixture\FixtureInterface;
12 use Magento\Mtf\Fixture\InjectableFixture;
13 use Magento\Mtf\Client\ElementInterface;
14 use Magento\Mtf\Client\Locator;
15 
19 abstract class AbstractFormContainers extends Form
20 {
26  protected $containers = [];
27 
33  protected $unassignedFields = [];
34 
40  protected $header = 'header.page-header';
41 
47  protected $closeButton = 'aside[style]:not([style=""]) [data-role="closeBtn"]';
48 
54  protected function init()
55  {
56  $this->containers = $this->getFormMapping();
57  return $this;
58  }
59 
67  protected function getContainer($containerName)
68  {
69  $containerClass = $this->containers[$containerName]['class'];
71  $container = $this->blockFactory->create($containerClass, ['element' => $this->_rootElement]);
72  if (!$container instanceof AbstractContainer) {
73  throw new \Exception('Wrong Container Class.');
74  }
75  $container->setWrapper(
76  isset($this->containers[$containerName]['wrapper']) ? $this->containers[$containerName]['wrapper'] : ''
77  );
78  $container->setMapping(
79  isset($this->containers[$containerName]['fields']) ? (array)$this->containers[$containerName]['fields'] : []
80  );
81 
82  return $container;
83  }
84 
94  public function getData(FixtureInterface $fixture = null, SimpleElement $element = null)
95  {
96  $data = [];
97 
98  if (null === $fixture) {
99  foreach ($this->containers as $containerName => $containerData) {
100  $this->openContainer($containerName);
101  $containerData = $this->getContainer($containerName)->getFieldsData();
102  $data = array_merge($data, $containerData);
103  }
104  } else {
105  $hasData = ($fixture instanceof InjectableFixture) ? $fixture->hasData() : true;
106  $dataByContainers = $hasData ? $this->getFixtureFieldsByContainers($fixture) : [];
107  foreach ($dataByContainers as $containerName => $containerFields) {
108  if (!$containerName) {
109  continue;
110  }
111  $this->openContainer($containerName);
112  $containerData = $this->getContainer($containerName)->getFieldsData($containerFields);
113  $data = array_merge($data, $containerData);
114  }
115  }
116 
117  return $data;
118  }
119 
127  public function fill(FixtureInterface $fixture, SimpleElement $element = null)
128  {
129  $containers = $this->getFixtureFieldsByContainers($fixture);
130  return $this->fillContainers($containers, $element);
131  }
132 
143  protected function getFixtureFieldsByContainers(InjectableFixture $fixture)
144  {
145  $dataByContainer = [];
146  $data = $fixture->getData();
147  foreach ($data as $field => $value) {
148  $attributes = $fixture->getDataFieldConfig($field);
149  $attributes['value'] = $value;
150  if (array_key_exists('group', $attributes) && $attributes['group'] != 'null') {
151  $dataByContainer[$attributes['group']][$field] = $attributes;
152  } elseif (!array_key_exists('group', $attributes)) {
153  $this->unassignedFields[$field] = $attributes;
154  }
155  }
156  return $dataByContainer;
157  }
158 
170  protected function fillContainers(array $dataByContainers, SimpleElement $element = null)
171  {
172  $context = ($element === null) ? $this->_rootElement : $element;
173  foreach ($dataByContainers as $containerName => $containerFields) {
174  $this->openContainer($containerName);
176  $container = $this->getContainer($containerName);
177  $container->setFieldsData($containerFields, $context);
178  }
179  if (!empty($this->unassignedFields)) {
180  $this->fillMissedFields();
181  }
182  return $this;
183  }
184 
191  protected function fillMissedFields()
192  {
193  foreach (array_keys($this->containers) as $containerName) {
194  $container = $this->getContainer($containerName);
195  if ($this->openContainer($containerName)) {
196  $mapping = $container->dataMapping($this->unassignedFields);
197  foreach ($mapping as $fieldName => $data) {
198  $element = $this->getElement($this->_rootElement, $data);
199  if ($element->isVisible()) {
200  $element->setValue($data['value']);
201  unset($this->unassignedFields[$fieldName]);
202  }
203  }
204  if ($this->browser->find($this->closeButton)->isVisible()) {
205  $this->browser->find($this->closeButton)->click();
206  }
207  if (empty($this->unassignedFields)) {
208  break;
209  }
210  }
211  }
212 
213  if (!empty($this->unassignedFields)) {
214  throw new \Exception(
215  'Could not find all elements on the tabs: ' . implode(', ', array_keys($this->unassignedFields))
216  );
217  }
218  }
219 
226  protected function getContainerElement($containerName)
227  {
228  $selector = $this->containers[$containerName]['selector'];
229  $strategy = isset($this->containers[$containerName]['strategy'])
230  ? $this->containers[$containerName]['strategy']
231  : Locator::SELECTOR_CSS;
232  return $this->_rootElement->find($selector, $strategy);
233  }
234 
241  abstract protected function openContainer($containerName);
242 }
fill(FixtureInterface $fixture, SimpleElement $element=null)
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$value
Definition: gender.phtml:16
$attributes
Definition: matrix.phtml:13
getData(FixtureInterface $fixture=null, SimpleElement $element=null)
$element
Definition: element.phtml:12