registerArgument('element', RootRenderableInterface::class, 'A RootRenderableInterface instance', true); } public function render(): string { $formElement = $this->arguments['element']; if ($formElement instanceof RenderableInterface && !$formElement->isEnabled()) { return ''; } $gridRowElement = $formElement->getParentRenderable(); $gridRowChildElements = $gridRowElement->getElements(); $gridViewPortConfiguration = $gridRowElement->getProperties()['gridColumnClassAutoConfiguration']; if (empty($gridViewPortConfiguration)) { return ''; } $gridSize = (int)$gridViewPortConfiguration['gridSize']; $columnsToCalculate = []; $usedColumns = []; foreach ($gridRowChildElements as $childElement) { if ($childElement instanceof RenderableInterface && !$childElement->isEnabled()) { continue; } if (empty($childElement->getProperties()['gridColumnClassAutoConfiguration'])) { foreach ($gridViewPortConfiguration['viewPorts'] as $viewPortName => $configuration) { $columnsToCalculate[$viewPortName]['elements'] = ($columnsToCalculate[$viewPortName]['elements'] ?? 0) + 1; } } else { $gridColumnViewPortConfiguration = $childElement->getProperties()['gridColumnClassAutoConfiguration']; foreach ($gridViewPortConfiguration['viewPorts'] as $viewPortName => $configuration) { $configuration = $gridColumnViewPortConfiguration['viewPorts'][$viewPortName] ?? []; if ( isset($configuration['numbersOfColumnsToUse']) && (int)$configuration['numbersOfColumnsToUse'] > 0 ) { $usedColumns[$viewPortName]['sum'] = ($usedColumns[$viewPortName]['sum'] ?? 0); $usedColumns[$viewPortName]['sum'] += (int)$configuration['numbersOfColumnsToUse']; if ($childElement->getIdentifier() === $formElement->getIdentifier()) { $usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'] = (int)$configuration['numbersOfColumnsToUse']; if ($usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'] > $gridSize) { $usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'] = $gridSize; } } } else { $columnsToCalculate[$viewPortName]['elements'] = ($columnsToCalculate[$viewPortName]['elements'] ?? 0) + 1; } } } } $classes = []; foreach ($gridViewPortConfiguration['viewPorts'] as $viewPortName => $configuration) { if (isset($usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'])) { $numbersOfColumnsToUse = $usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse']; } else { $restColumnsToDivide = $gridSize - ($usedColumns[$viewPortName]['sum'] ?? 0); $restElements = (int)$columnsToCalculate[$viewPortName]['elements']; if ($restColumnsToDivide < 1) { $restColumnsToDivide = $gridSize; } $numbersOfColumnsToUse = floor($restColumnsToDivide / $restElements); } $classes[] = str_replace( '{@numbersOfColumnsToUse}', (string)$numbersOfColumnsToUse, $configuration['classPattern'] ); } return implode(' ', $classes); } }