1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
tabletservice.php
См. документацию.
1<?php
2
3namespace Bitrix\Main\Cli\Command\Make\Service;
4
5use Bitrix\Main\Application;
6use Bitrix\Main\Cli\Command\Make\Service\Tablet\GenerateDto;
7use Bitrix\Main\Cli\Command\Make\Templates\Tablet\FieldTemplate;
8use Bitrix\Main\Cli\Command\Make\Templates\TabletTemplate;
9use Bitrix\Main\Cli\Helper\PathGenerator;
10use Bitrix\Main\Cli\Helper\NamespaceGenerator;
11use Bitrix\Main\Cli\Helper\Renderer;
12use Bitrix\Main\Loader;
13use Bitrix\Perfmon\BaseDatabase;
14use InvalidArgumentException;
15
16final class TabletService
17{
18 private Renderer $renderer;
19 private PathGenerator $PathGenerator;
20 private NamespaceGenerator $NamespaceGenerator;
21 private string $defaultRootFolder;
22
23 public function __construct(string $defaultRootFolder = null)
24 {
25 Loader::requireModule('perfmon');
26
27 $this->renderer = new Renderer();
29 $this->defaultRootFolder = $defaultRootFolder ?? (string)$_SERVER['DOCUMENT_ROOT'];
30 }
31
32 public function generateContent(GenerateDto $dto): string
33 {
34 $namespace = $this->generateNamespace($dto);
35 $className = $this->generateClassName($dto->tableName);
36 $fileTemplate = new TabletTemplate(
37 $dto->tableName,
38 $className,
39 $namespace,
40 $this->getFieldsTempaltes($dto->tableName),
41 );
42
43 return $fileTemplate->getContent();
44 }
45
46 public function generateFile(GenerateDto $dto): void
47 {
48 $namespace = $this->generateNamespace($dto);
49 $className = $this->generateClassName($dto->tableName);
50 $fileTemplate = new TabletTemplate(
51 $dto->tableName,
52 $className,
53 $namespace,
54 $this->getFieldsTempaltes($dto->tableName),
55 );
56
57 $this->PathGenerator = new PathGenerator(
58 $dto->psr4,
59 $dto->rootFolder ?: $this->defaultRootFolder,
60 );
61 $filePath = $this->PathGenerator->generatePathToClass($namespace, $className);
62
63 $this->renderer->renderToFile($filePath, $fileTemplate);
64 }
65
66 #region internal
67
68 private function generateNamespace(GenerateDto $dto): string
69 {
70 $namespace = $dto->namespace;
71 if (empty($namespace))
72 {
73 $moduleId = $dto->moduleId;
74 if (empty($moduleId))
75 {
76 throw new InvalidArgumentException('If namespace option is not set, module argument MUST BE set!');
77 }
78
79 $namespace = $this->NamespaceGenerator->generateNamespaceForModule($moduleId, 'Tablet');
80 }
81
82 return $namespace;
83 }
84
85 private function generateClassName(string $name): string
86 {
87 $name = preg_replace('/Table$/i', '', $name);
88 if (empty($name))
89 {
90 throw new InvalidArgumentException('Invalid table name');
91 }
92
93 $parts = explode('_', $name);
94 $parts = array_map(
95 static fn($i) => ucfirst($i),
96 $parts,
97 );
98
99 return join('', $parts) . 'Table';
100 }
101
108 private function getFieldsTempaltes(string $tableName, ?string $connectionName = null): array
109 {
110 $connection = Application::getConnection($connectionName ?? 'default');
112
113 $resultTemplates = [];
114
115 [,$columns] = $builder->getTableFields($tableName);
116 $uniqueIndexes = $builder->getUniqueIndexes($tableName);
117 foreach ($columns as $columnName => $columnInfo)
118 {
119 $resultTemplates[$columnName] = $this->createFieldTemplate($columnName, $columnInfo, $uniqueIndexes);
120 }
121
122
123 return $resultTemplates;
124 }
125
126 private function createFieldTemplate(string $columnName, array $columnInfo, array $uniqueIndexes): FieldTemplate
127 {
128 $typeOrm = $columnInfo['orm_type'];
129 $length = $columnInfo['length'];
130 $nullable = $columnInfo['nullable'];
131 $default = $columnInfo['default'];
132 $increment = $columnInfo['increment'];
133
134 // process size
135 $size = null;
136 if ($typeOrm === 'integer')
137 {
138 if (str_starts_with($columnInfo['type~'], 'tinyint'))
139 {
140 $size = 1;
141 }
142 elseif (str_starts_with($columnInfo['type~'], 'smallint'))
143 {
144 $size = 2;
145 }
146 elseif (str_starts_with($columnInfo['type~'], 'mediumint'))
147 {
148 $size = 3;
149 }
150 elseif (str_starts_with($columnInfo['type~'], 'bigint'))
151 {
152 $size = 8;
153 }
154 }
155
156 // process indexes
157 $primary = false;
158 $unique = false;
159
160 // TODO: scan unique and fulltext indexes
161 foreach ($uniqueIndexes as $indexName => $columnNames)
162 {
163 if (in_array($columnName, $columnNames))
164 {
165 $primary = true;
166 break;
167 }
168 }
169
170 return new FieldTemplate(
171 $columnName,
172 $typeOrm,
173 $primary,
174 $unique,
175 $increment,
176 $nullable,
177 $default,
178 $size,
179 $length,
180 );
181 }
182
183 #endregion internal
184}
$connection
Определения actionsdefinitions.php:38
static getConnection($name="")
Определения application.php:638
__construct(string $defaultRootFolder=null)
Определения tabletservice.php:23
generatePathToClass(string $namespace, string $className)
Определения pathgenerator.php:13
static requireModule($moduleName)
Определения loader.php:174
static createFromConnection($connection)
Определения basedatabase.php:23
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$moduleId
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
$name
Определения menu_edit.php:35
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$i
Определения factura.php:643