ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilECSCmsTreeCommandQueueHandler.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
25 {
26  private ilLogger $log;
27 
29  private int $mid = 0;
30 
31  public function __construct(ilECSSetting $server)
32  {
33  global $DIC;
34  $this->log = $DIC->logger()->wsrv();
35 
36  $this->server = $server;
37  $this->init();
38  }
39 
43  public function getServer(): ilECSSetting
44  {
45  return $this->server;
46  }
47 
48 
52  public function handleCreate(ilECSSetting $server, $a_content_id): bool
53  {
54  $this->log->debug('ECS cms tree create');
55 
56 
57  try {
58  $dir_reader = new ilECSDirectoryTreeConnector($this->getServer());
59  $res = $dir_reader->getDirectoryTree($a_content_id);
60  $nodes = $res->getResult();
61 
62  if ($this->log->isHandling(ilLogLevel::DEBUG)) {
63  $this->log->dump($nodes, ilLogLevel::DEBUG);
64  }
65  } catch (ilECSConnectorException $e) {
66  $this->log->error('Tree creation failed with mesage ' . $e->getMessage());
67  return false;
68  }
69 
70  $cms_tree = $nodes;
71  $data = new ilECSCmsData();
72  $data->setServerId($server->getServerId());
73  $data->setMid($this->mid);
74  $data->setCmsId($cms_tree->rootID);
75  $data->setTreeId($a_content_id);
76  $data->setTitle($cms_tree->directoryTreeTitle);
77  $data->setTerm($cms_tree->term);
78  $data->save();
79 
80  $tree = new ilECSCmsTree($a_content_id);
81  $tree->insertRootNode($a_content_id, $data->getObjId());
82  $tree->setRootId($data->getObjId());
83 
84 
85  foreach ((array) $cms_tree->nodes as $node) {
86  // Add data entry
87  $data = new ilECSCmsData();
88  $data->setServerId($this->getServer()->getServerId());
89  $data->setMid($this->mid);
90  $data->setCmsId($node->id);
91  $data->setTreeId($a_content_id);
92  $data->setTitle($node->title);
93  $data->setTerm($node->term);
94  $data->save();
95 
96  // add to tree
97  if ($node->parent->id) {
98  $parent_id = ilECSCmsData::lookupObjId(
99  $this->getServer()->getServerId(),
100  $this->mid,
101  $a_content_id,
102  $node->parent->id
103  );
104  $tree->insertNode($data->getObjId(), $parent_id);
105  }
106  }
107  return true;
108  }
109 
113  public function handleDelete(ilECSSetting $server, int $a_content_id): bool
114  {
115  $this->log->debug('ECS cms tree delete');
116 
117  $data = new ilECSCmsData();
118  $data->setServerId($this->getServer()->getServerId());
119  $data->setMid($this->mid);
120  $data->setTreeId($a_content_id);
121  $data->deleteTree();
122 
123  $tree = new ilECSCmsTree($a_content_id);
124  $tree->deleteTree($tree->getNodeData(ilECSCmsTree::lookupRootId($a_content_id)));
125 
127  $this->getServer()->getServerId(),
128  $this->mid,
129  $a_content_id
130  );
131  return true;
132  }
133 
137  public function handleUpdate(ilECSSetting $server, $a_content_id): bool
138  {
139  $this->log->debug('ECS cms tree update');
140 
141 
142  // 1) Mark all nodes as deleted
143  // 2a) Delete cms tree
144  // 2) Add cms tree table entries
145  // 2) Replace the cms data table entries
146  // 3) Insert deleted tree nodes in tree
147  // 4) Sync tree
148 
149  try {
150  $dir_reader = new ilECSDirectoryTreeConnector($this->getServer());
151  $res = $dir_reader->getDirectoryTree($a_content_id);
152  $nodes = $res->getResult();
153  if ($this->log->isHandling(ilLogLevel::DEBUG)) {
154  $this->log->dump($nodes, ilLogLevel::DEBUG);
155  }
156  } catch (ilECSConnectorException $e) {
157  $this->log->error('Tree creation failed with message ' . $e->getMessage());
158  return false;
159  }
160 
161  // read old tree structure
162  $tree = new ilECSCmsTree($a_content_id);
163 
164  $root_node = $tree->getNodeData(ilECSCmsTree::lookupRootId($a_content_id));
165 
166  $old_nodes = array();
167  if ($root_node['child']) {
168  $old_nodes = $tree->getSubTree($root_node, true);
169  }
170 
171  if ($this->log->isHandling(ilLogLevel::DEBUG)) {
172  $this->log->debug('Old tree data... ');
173  $this->log->dump($old_nodes, ilLogLevel::DEBUG);
174  }
175 
176  // Delete old cms tree
177  ilECSCmsTree::deleteByTreeId($a_content_id);
178 
179  // Mark all nodes in cms data as deleted
181  $this->getServer()->getServerId(),
182  $this->mid,
183  $a_content_id,
184  true
185  );
186 
187  // Check for update or new entry
188  $cms_tree = $nodes;
189 
190  $data_obj_id = ilECSCmsData::lookupObjId(
191  $this->getServer()->getServerId(),
192  $this->mid,
193  $a_content_id,
194  $cms_tree->rootID
195  );
196 
197  $data = new ilECSCmsData($data_obj_id);
198  $data->setServerId($server->getServerId());
199  $data->setMid($this->mid);
200  $data->setCmsId($cms_tree->rootID);
201  $data->setTreeId($a_content_id);
202  $data->setTitle($cms_tree->directoryTreeTitle);
203  $data->setTerm($cms_tree->term);
204 
205  if ($data_obj_id) {
206  $data->setDeleted(false);
207  $data->update();
208  } else {
209  $data->save();
210  }
211 
212  $tree->insertRootNode($a_content_id, $data->getObjId());
213  $tree->setRootId($data->getObjId());
214 
215 
216  foreach ((array) $cms_tree->nodes as $node) {
217  $data_obj_id = ilECSCmsData::lookupObjId(
218  $this->getServer()->getServerId(),
219  $this->mid,
220  $a_content_id,
221  $node->id
222  );
223 
224  // update data entry
225  $data = new ilECSCmsData($data_obj_id);
226  $data->setTitle($node->title);
227  $data->setTerm($node->term);
228  $data->setDeleted(false);
229 
230  if ($data_obj_id) {
231  $data->update();
232  } else {
233  $data->setCmsId($node->id);
234  $data->setMid($this->mid);
235  $data->setServerId($this->getServer()->getServerId());
236  $data->setTreeId($a_content_id);
237  $data->setDeleted(false);
238  $data->save();
239 
240  $data_obj_id = $data->getObjId();
241  }
242 
243  // add to tree
244  $parent_id = ilECSCmsData::lookupObjId(
245  $this->getServer()->getServerId(),
246  $this->mid,
247  $a_content_id,
248  $node->parent->id
249  );
250  $tree->insertNode($data->getObjId(), $parent_id);
251  }
252 
253  // Insert deleted nodes in tree
255  $this->getServer()->getServerId(),
256  $this->mid,
257  $a_content_id
258  );
259 
260  foreach ($deleted as $obj_id) {
261  $parent = 0;
262  foreach ($old_nodes as $node) {
263  if ($node['child'] === $obj_id) {
264  $parent = $node['parent'];
265  break;
266  }
267  }
268 
269  if ($parent && $tree->isInTree($parent)) {
270  $tree->insertNode($obj_id, $parent);
271  }
272  }
273 
274  // Sync tree
275  $sync = new ilECSCmsTreeSynchronizer(
276  $this->getServer(),
277  $this->mid,
278  $a_content_id
279  );
280  $sync->sync();
281 
282  return true;
283  }
284 
288  private function init(): void
289  {
290  $this->mid = ilECSParticipantSettings::getInstanceByServerId($this->getServer()->getServerId())->lookupCmsMid();
291  }
292 }
$res
Definition: ltiservices.php:66
static writeAllDeleted($a_server_id, $a_mid, $a_tree_id, $a_deleted_flag)
Write deleted status.
handleDelete(ilECSSetting $server, int $a_content_id)
Handle delete.
static getInstanceByServerId(int $a_server_id)
Get instance by server id.
getServerId()
Get current server id.
static lookupRootId($a_tree_id)
lookup root id
handleUpdate(ilECSSetting $server, $a_content_id)
Handle update.
static lookupObjId(int $a_server_id, int $a_mid, int $a_tree_id, string $cms_id)
server()
description: > This example shows how a Progress Bar can be rendered and updated by the server...
Definition: server.php:43
static deleteMappings(int $a_server_id, int $a_mid, int $a_tree_id)
Delete mappings.
Interface for all command queue handler classes.
static findDeletedNodes(int $a_server_id, int $a_mid, int $a_tree_id)
Find deleted nodes Uses a left join since this is more robust.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
global $DIC
Definition: shib_login.php:26
handleCreate(ilECSSetting $server, $a_content_id)
static deleteByTreeId(int $a_tree_id)
Delete tree by tree_id.