1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
bpt.php
См. документацию.
1<?php
2
3namespace Bitrix\Bizproc\Workflow\Template\Packer;
4
5use Bitrix\Bizproc\Workflow\Template\Entity\WorkflowTemplateTable;
6use Bitrix\Bizproc\Workflow\Template\Tpl;
7use Bitrix\Main;
8use Bitrix\Main\Localization\Loc;
9use CBPDocument;
10use CBPRuntime;
11
12class Bpt extends BasePacker
13{
16
17 protected $useCompression = true;
18
19 public function enableCompression()
20 {
21 $this->useCompression = true;
22 }
23
24 public function disableCompression()
25 {
26 $this->useCompression = false;
27 }
28
29 public function makePackageData(Tpl $tpl)
30 {
31 $documentService = CBPRuntime::GetRuntime(true)->getDocumentService();
32 $documentFieldsTmp = $documentService->GetDocumentFields($tpl->getDocumentComplexType(), true);
33 $documentFieldsAliasesMap = CBPDocument::getDocumentFieldsAliasesMap($documentFieldsTmp);
34
35 $documentFields = [];
36 $len = mb_strlen("_PRINTABLE");
37 foreach ($documentFieldsTmp as $k => $v)
38 {
39 if (mb_strtoupper(mb_substr($k, -$len)) != "_PRINTABLE")
40 {
41 $documentFields[$k] = $v;
42 }
43 }
44
45 $tplData = $tpl->collectValues();
46
47 if ($documentFieldsAliasesMap)
48 {
49 self::replaceTemplateDocumentFieldsAliases($tplData['TEMPLATE'], $documentFieldsAliasesMap);
50 self::replaceVariablesDocumentFieldsAliases($tplData['PARAMETERS'], $documentFieldsAliasesMap);
51 self::replaceVariablesDocumentFieldsAliases($tplData['VARIABLES'], $documentFieldsAliasesMap);
52 self::replaceVariablesDocumentFieldsAliases($tplData['CONSTANTS'], $documentFieldsAliasesMap);
53 }
54
55 return [
56 "VERSION" => 2,
57 "TEMPLATE" => $tplData["TEMPLATE"],
58 "PARAMETERS" => $tplData["PARAMETERS"],
59 "VARIABLES" => $tplData["VARIABLES"],
60 "CONSTANTS" => $tplData["CONSTANTS"],
61 "DOCUMENT_FIELDS" => $documentFields,
62 ];
63 }
64
65 public function pack(Tpl $tpl)
66 {
67 $datum = $this->makePackageData($tpl);
68 $datum = serialize($datum);
69
70 if ($this->useCompression)
71 {
72 $datum = $this->compress($datum);
73 }
74
75 return (new Result\Pack())->setPackage($datum);
76 }
77
78 public function unpack($data)
79 {
80 $result = new Result\Unpack();
81
82 $datumTmp = \CheckSerializedData($data) ? @unserialize($data, ['allowed_classes' => false]) : null;
83
84 if (!is_array($datumTmp) || is_array($datumTmp) && !array_key_exists("TEMPLATE", $datumTmp))
85 {
86 $datumTmp = $this->uncompress($data);
87 $datumTmp = \CheckSerializedData($datumTmp) ? @unserialize($datumTmp, ['allowed_classes' => false]) : null;
88 }
89
90 if (!is_array($datumTmp) || is_array($datumTmp) && !array_key_exists("TEMPLATE", $datumTmp))
91 {
92 $result->addError(new Main\Error(Loc::getMessage("BIZPROC_WF_TEMPLATE_BPT_WRONG_DATA")));
93 return $result;
94 }
95
96 if (array_key_exists("VERSION", $datumTmp) && $datumTmp["VERSION"] == 2)
97 {
98 $datumTmp["CONSTANTS"] = $datumTmp["CONSTANTS"] ?? [];
99 }
100
102 $tpl = WorkflowTemplateTable::createObject();
103 $tpl->set('TEMPLATE', $datumTmp['TEMPLATE']);
104 $tpl->set('PARAMETERS', $datumTmp['PARAMETERS']);
105 $tpl->set('VARIABLES', $datumTmp['VARIABLES']);
106 $tpl->set('CONSTANTS', $datumTmp['CONSTANTS']);
107 $result->setTpl($tpl);
108
109 if (is_array($datumTmp['DOCUMENT_FIELDS'] ?? null))
110 {
111 $result->setDocumentFields($datumTmp['DOCUMENT_FIELDS']);
112 }
113
114 return $result;
115 }
116
117 private static function replaceTemplateDocumentFieldsAliases(&$template, $aliases)
118 {
119 foreach ($template as &$activity)
120 {
121 self::replaceActivityDocumentFieldsAliases($activity, $aliases);
122 if (is_array($activity["Children"] ?? null))
123 {
124 self::replaceTemplateDocumentFieldsAliases($activity['Children'], $aliases);
125 }
126 }
127 }
128
129 private static function replaceActivityDocumentFieldsAliases(&$activity, $aliases)
130 {
131 if (!is_array($activity['Properties']))
132 return;
133
134 foreach ($activity['Properties'] as $key => $value)
135 {
136 $activity['Properties'][$key] = self::replaceValueDocumentFieldsAliases($value, $aliases);
137 // Replace field conditions
138 if ($activity['Type'] === 'IfElseBranchActivity' && $key === 'fieldcondition')
139 {
140 $activity['Properties'][$key] = self::replaceFieldConditionsDocumentFieldsAliases(
141 $activity['Properties'][$key],
142 $aliases
143 );
144 }
145 }
146 }
147
148 private static function replaceVariablesDocumentFieldsAliases(&$variables, $aliases)
149 {
150 if (!is_array($variables))
151 return;
152
153 foreach ($variables as $key => &$variable)
154 {
155 $variable['Default'] = self::replaceValueDocumentFieldsAliases($variable['Default'], $aliases);
156 //Type Internalselect use options as link to document field.
157 if (
158 isset($variable['Options'])
159 && is_scalar($variable['Options'])
160 && array_key_exists($variable['Options'], $aliases)
161 )
162 {
163 $variable['Options'] = $aliases[$variable['Options']];
164 }
165 }
166 }
167
168 private static function replaceValueDocumentFieldsAliases($value, $aliases)
169 {
170 if (is_array($value))
171 {
172 $replacesValue = array();
173 foreach ($value as $key => $val)
174 {
175 if (array_key_exists($key, $aliases))
176 $key = $aliases[$key];
177
178 $replacesValue[$key] = self::replaceValueDocumentFieldsAliases($val, $aliases);
179 }
180
181 if (
182 sizeof($replacesValue) == 2
183 && isset($replacesValue[0])
184 && $replacesValue[0] == 'Document'
185 && isset($replacesValue[1])
186 && array_key_exists($replacesValue[1], $aliases)
187 )
188 {
189 $replacesValue[1] = $aliases[$replacesValue[1]];
190 }
191 $value = $replacesValue;
192 }
193 else
194 {
195 foreach ($aliases as $search => $replace)
196 {
197 $value = preg_replace('#(\{=\s*Document\s*\:\s*)'.$search.'#i', '\\1'.$replace, $value);
198 }
199 }
200
201 return $value;
202 }
203
204 private static function replaceFieldConditionsDocumentFieldsAliases($conditions, $aliases)
205 {
206 foreach ($conditions as $key => $condition)
207 {
208 if (array_key_exists($condition[0], $aliases))
209 $conditions[$key][0] = $aliases[$condition[0]];
210 }
211
212 return $conditions;
213 }
214}
makePackageData(Tpl $tpl)
Определения bpt.php:29
getDocumentComplexType()
Определения tpl.php:21
Определения error.php:15
$data['IS_AVAILABLE']
Определения .description.php:13
$template
Определения file_edit.php:49
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$activity
Определения options.php:214
CheckSerializedData($str, $max_depth=200)
Определения tools.php:4949
$value
Определения Param.php:39
if(empty($signedUserToken)) $key
Определения quickway.php:257
$val
Определения options.php:1793
$k
Определения template_pdf.php:567