ILIAS  release_8 Revision v8.24
class.ilComponentDefinitionReader.php
Go to the documentation of this file.
1<?php
19declare(strict_types=1);
20
22{
26 protected array $processors;
27
28 public function __construct(
30 ) {
31 $this->processors = $processor;
32 }
33
38 public function purge(): void
39 {
40 foreach ($this->processors as $p) {
41 $p->purge();
42 }
43 }
44
49 public function readComponentDefinitions(): void
50 {
51 foreach ($this->getComponents() as [$type, $component, $path]) {
52 $file = $this->readFile($path);
53 foreach ($this->processors as $processor) {
54 $processor->beginComponent($component, $type);
55 }
56 $this->parseComponentXML($type, $component, $file);
57 foreach ($this->processors as $processor) {
58 $processor->endComponent($component, $type);
59 }
60 }
61 }
62
63 protected function readFile(string $path): string
64 {
65 if (!file_exists($path)) {
66 throw new \InvalidArgumentException(
67 "Cannot find file $path."
68 );
69 }
70 return file_get_contents($path);
71 }
72
73 protected function parseComponentXML(string $type, string $component, string $xml): void
74 {
75 $xml_parser = null;
76 try {
77 $xml_parser = xml_parser_create("UTF-8");
78 xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
79 xml_set_object($xml_parser, $this);
80 xml_set_element_handler($xml_parser, 'beginTag', 'endTag');
81 if (!xml_parse($xml_parser, $xml)) {
82 $code = xml_get_error_code($xml_parser);
83 $line = xml_get_current_line_number($xml_parser);
84 $col = xml_get_current_column_number($xml_parser);
85 $msg = xml_error_string($code);
86 throw new \InvalidArgumentException(
87 "Error $code component xml of $type/$component, on line $line in column $col: $msg"
88 );
89 }
90 } finally {
91 if ($xml_parser) {
92 xml_parser_free($xml_parser);
93 }
94 }
95 }
96
97 public function beginTag($_, string $name, array $attributes): void
98 {
99 foreach ($this->processors as $processor) {
100 $processor->beginTag($name, $attributes);
101 }
102 }
103
104 public function endTag($_, string $name): void
105 {
106 foreach ($this->processors as $processor) {
107 $processor->endTag($name);
108 }
109 }
110
114 protected function getComponents(): \Iterator
115 {
116 foreach ($this->getComponentInfo("Modules", "module.xml") as $i) {
117 yield $i;
118 }
119 foreach ($this->getComponentInfo("Services", "service.xml") as $i) {
120 yield $i;
121 }
122 }
123
127 protected function getComponentInfo(string $type, string $name): \Iterator
128 {
129 $dir = __DIR__ . "/../../../" . $type;
130 foreach ($this->getComponentPaths($dir, $name) as $c) {
131 yield [
132 $type,
133 $c,
134 realpath($dir . "/" . $c . "/" . $name)
135 ];
136 }
137 }
138
142 protected function getComponentPaths(string $root, string $name): \Iterator
143 {
144 $dir = opendir($root);
145 while ($sub = readdir($dir)) {
146 if ($sub === "." || $sub === "..") {
147 continue;
148 }
149 if (!is_dir($root . "/" . $sub)) {
150 continue;
151 }
152 if (!is_file($root . "/" . $sub . "/" . $name)) {
153 continue;
154 }
155 yield $sub;
156 }
157 }
158}
beginTag($_, string $name, array $attributes)
readComponentDefinitions()
This reads the component.xml of all components in the core and processes them with the provided proce...
__construct(ilComponentDefinitionProcessor ... $processor)
purge()
This methods is supposed to purge existing data in the registered processor.
parseComponentXML(string $type, string $component, string $xml)
$c
Definition: cli.php:38
An ilComponentDefinitionProcessor processes some attributes from a component.xml (i....
$path
Definition: ltiservices.php:32
if($format !==null) $name
Definition: metadata.php:247
$i
Definition: metadata.php:41
$attributes
Definition: metadata.php:248
$xml
Definition: metadata.php:351
$type