1+ <?php
2+
3+ namespace app \components ;
4+
5+ use app \modules \editor \models \Level ;
6+ use app \modules \editor \models \Node ;
7+ use app \modules \editor \models \Sequence ;
8+ use app \modules \editor \models \Parameter ;
9+ use app \modules \editor \models \TreeDiagram ;
10+
11+ /**
12+ * Class EventTreeXMLImport - Класс реализующий импорт деревьев событий в формате XML (EETD).
13+ * @package app\components
14+ */
15+ class EventTreeXMLImport
16+ {
17+ public static $ array_nodes ;
18+ public static $ j ;
19+
20+ /**
21+ * Добавление нового узла (элемента) в XML-документ.
22+ *
23+ * @param $parent - родетельский xml-элемент
24+ * @param $tree_diagram_id - идентификатор диаграммы
25+ * @param $level_id - идентификатор уровня
26+ * @param $node_id - идентификатор узла (события или механизма)
27+ */
28+ public static function addChild ($ parent , $ tree_diagram_id , $ level_id , $ node_id )
29+ {
30+ //$parent родительский xml-элемент
31+ // Если у родетельского xml-элемента есть дочернии
32+ if ($ parent ->count () != 0 ) {
33+ // Получаем у родетельского xml-элемента дочернии
34+ foreach ($ parent ->children () as $ child ) {
35+ // Проверки если имя дочернего элемента равны
36+ if ($ child ->getName () == 'Operator ' )
37+ self ::addChild ($ child , $ tree_diagram_id , $ level_id , $ node_id );
38+ if ($ child ->getName () == 'Event ' ) {
39+ // Создание Node
40+ $ node_model = new Node ();
41+ $ node_model ->name = (string )$ child ['name ' ];
42+ $ node_model ->certainty_factor = (real )$ child ['certainty_factor ' ];
43+ $ node_model ->description = (string )$ child ['description ' ];
44+ $ node_model ->operator = Node::AND_OPERATOR ;
45+
46+ if ((string )$ child ['type ' ] == 'Инициирующее событие ' || (string )$ child ['type ' ] == 'Initial event ' )
47+ $ node_model ->type = Node::INITIAL_EVENT_TYPE ;
48+ if ((string )$ child ['type ' ] == 'Событие ' || (string )$ child ['type ' ] == 'Event ' )
49+ $ node_model ->type = Node::EVENT_TYPE ;
50+ if ((string )$ child ['type ' ] == 'Механизм ' || (string )$ child ['type ' ] == 'Mechanism ' )
51+ $ node_model ->type = Node::MECHANISM_TYPE ;
52+
53+ // Ннахождение parent_node из таблицы $array_nodes если родитель не определен,
54+ // но присутствует значение parent_node в xml
55+ if ($ node_id == null && (integer )$ child ['parent_node ' ] <> 0 )
56+ for ($ i = 0 ; $ i < self ::$ j ; $ i ++)
57+ if ((integer )$ child ['parent_node ' ] == self ::$ array_nodes [$ i ]['node_template ' ])
58+ $ node_model ->parent_node = self ::$ array_nodes [$ i ]['node ' ];
59+ else
60+ $ node_model ->parent_node = $ node_id ;
61+ $ node_model ->tree_diagram = $ tree_diagram_id ;
62+ $ node_model ->level_id = $ level_id ;
63+ $ node_model ->save ();
64+
65+ // Таблица $array_nodes внесение значений, где:
66+ // 'node_template' значение id node из xml
67+ // 'node' значение нового id node из только что созданного
68+ self ::$ array_nodes [self ::$ j ]['node_template ' ] = (integer )$ child ['id ' ];
69+ self ::$ array_nodes [self ::$ j ]['node ' ] = $ node_model ->id ;
70+ self ::$ j ++;
71+
72+ // Создание модели Sequence
73+ $ sequence_model = new Sequence ();
74+ $ sequence_model ->tree_diagram = $ tree_diagram_id ;
75+ $ sequence_model ->level = $ level_id ;
76+ $ sequence_model ->node = $ node_model ->id ;
77+ $ sequence_model_count = Sequence::find ()->where (['tree_diagram ' => $ tree_diagram_id ])->count ();
78+ $ sequence_model ->priority = $ sequence_model_count ;
79+ $ sequence_model ->save ();
80+
81+ self ::addChild ($ child , $ tree_diagram_id , $ level_id , $ node_model ->id );
82+ }
83+ if ($ child ->getName () == 'Parameter ' ) {
84+ // Создание Parameter
85+ $ parameter_model = new Parameter ();
86+ $ parameter_model ->name = (string )$ child ['name ' ];
87+ $ parameter_model ->description = (string )$ child ['description ' ];
88+ if ((string )$ child ['operator ' ] == '= ' )
89+ $ parameter_model ->operator = Parameter::EQUALLY_OPERATOR ;
90+ if ((string )$ child ['operator ' ] == '> ' )
91+ $ parameter_model ->operator = Parameter::MORE_OPERATOR ;
92+ if ((string )$ child ['operator ' ] == '< ' )
93+ $ parameter_model ->operator = Parameter::LESS_OPERATOR ;
94+ if ((string )$ child ['operator ' ] == '>= ' )
95+ $ parameter_model ->operator = Parameter::MORE_EQUAL_OPERATOR ;
96+ if ((string )$ child ['operator ' ] == '<= ' )
97+ $ parameter_model ->operator = Parameter::LESS_EQUAL_OPERATOR ;
98+ if ((string )$ child ['operator ' ] == '≠ ' )
99+ $ parameter_model ->operator = Parameter::NOT_EQUAL_OPERATOR ;
100+ if ((string )$ child ['operator ' ] == '≈ ' )
101+ $ parameter_model ->operator = Parameter::APPROXIMATELY_EQUAL_OPERATOR ;
102+ $ parameter_model ->value = (string )$ child ['value ' ];
103+ $ parameter_model ->node = $ node_id ;
104+ $ parameter_model ->save ();
105+ }
106+ }
107+ }
108+ }
109+
110+ /**
111+ * Очистка диаграммы.
112+ *
113+ * @param $id - идентификатор диаграммы
114+ * @throws \Throwable
115+ * @throws \yii\db\StaleObjectException
116+ */
117+ public static function cleanDiagram ($ id )
118+ {
119+ $ level_mas = Level::find ()->where (['tree_diagram ' => $ id ])->all ();
120+ foreach ($ level_mas as $ elem )
121+ $ elem ->delete ();
122+ $ node_mas = Node::find ()->where (['tree_diagram ' => $ id ])->all ();
123+ foreach ($ node_mas as $ elem )
124+ $ elem ->delete ();
125+ }
126+
127+ /**
128+ * Импорт XML-кода.
129+ *
130+ * @param $id - идентификатор диаграммы
131+ * @param $file - XML-файл дерева событий
132+ * @throws \Throwable
133+ * @throws \yii\db\StaleObjectException
134+ */
135+ public function importXMLCode ($ id , $ file )
136+ {
137+ self ::cleanDiagram ($ id );
138+
139+ // Массив node (для копирования связей)
140+ self ::$ array_nodes = array ();
141+ self ::$ j = 0 ;
142+
143+ $ tree_diagram_model = TreeDiagram::find ()->where (['id ' => $ id ])->one ();
144+ $ tree_diagram_model ->description = (string )$ file ['description ' ];
145+ $ tree_diagram_model ->save ();
146+
147+ $ parent_level = null ;
148+ foreach ($ file ->Level as $ level ) {
149+ $ level_model = new Level ();
150+ $ level_model ->name = (string )$ level ['name ' ];
151+ $ level_model ->description = (string )$ level ['description ' ];
152+ $ level_model ->parent_level = $ parent_level ;
153+ $ level_model ->tree_diagram = $ id ;
154+ $ level_model ->save ();
155+ $ parent_level = $ level_model ->id ;
156+ // Создание дочерних элементов
157+ self ::addChild ($ level , $ id , $ parent_level , null );
158+ }
159+ // Удаление файла
160+ //unlink('uploads/temp.xml');
161+ }
162+ }
0 commit comments