%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/Rendering/ |
Current File : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/Rendering/DataClassGenerator.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Forms\Rendering; use Nette\Forms\Container; use Nette\Forms\Controls; use Nette\Forms\Form; /** * Generates blueprint of form data class. */ final class DataClassGenerator { /** @var string */ public $classNameSuffix = 'FormData'; /** @var bool */ public $propertyPromotion = false; /** @var bool */ public $useSmartObject = true; public function generateCode(Form $form, ?string $baseName = null): string { $baseName = $baseName ?? preg_replace('~Form$~', '', ucwords((string) $form->getName())); return $this->processContainer($form, $baseName); } private function processContainer(Container $container, string $baseName): string { $nextCode = ''; $props = []; foreach ($container->getComponents() as $name => $input) { if ($input instanceof Controls\BaseControl && $input->isOmitted()) { continue; } elseif ($input instanceof Controls\Checkbox) { $type = 'bool'; } elseif ($input instanceof Controls\MultiChoiceControl) { $type = 'array'; } elseif ($input instanceof Controls\ChoiceControl) { $type = 'string|int'; if (!$input->isRequired()) { $type .= '|null'; } } elseif ($input instanceof Controls\HiddenField || $input instanceof Controls\TextBase) { $type = 'string'; foreach ($input->getRules() as $rule) { if ($rule->validator === Form::Integer) { $type = 'int'; break; } } if (!$input->isRequired()) { $type = '?' . $type; } } elseif ($input instanceof Controls\UploadControl) { $type = '\Nette\Http\FileUpload'; if (!$input->isRequired()) { $type = '?' . $type; } } elseif ($input instanceof Container) { $type = $baseName . ucwords($name); $nextCode .= $this->processContainer($input, $type); $type .= $this->classNameSuffix; } else { $type = ''; } $props[] = 'public ' . ($type ? $type . ' ' : '') . '$' . $name; } $class = $baseName . $this->classNameSuffix; return "class $class\n" . "{\n" . ($this->useSmartObject ? "\tuse \\Nette\\SmartObject;\n\n" : '') . ($this->propertyPromotion ? "\tpublic function __construct(\n" . ($props ? "\t\t" . implode(",\n\t\t", $props) . ",\n" : '') . "\t) {\n\t}\n" : ($props ? "\t" . implode(";\n\t", $props) . ";\n" : '') ) . "}\n\n" . $nextCode; } }