50 $this->
logger = $DIC->logger()->cal();
72 return new SingleType(ilCopyDefinition::class);
91 $this->
logger->debug(
'Start collecting files!');
92 $this->
logger->dump($input);
93 $definition = $input[0];
94 $initiated_by_folder_action = $input[1]->getValue();
95 $object_ref_ids = $definition->getObjectRefIds();
98 foreach ($object_ref_ids as $object_ref_id) {
100 $object_type = $object->getType();
101 $object_name = $object->getTitle();
102 $object_temp_dir =
"";
104 if ($object_type ===
"fold" || $object_type ===
"crs") {
106 $files_from_folder = $this->
recurseFolder($object_ref_id, $object_name, $object_temp_dir, $num_recursions, $initiated_by_folder_action);
107 $files = array_merge($files, $files_from_folder);
108 } elseif (($object_type ===
"file") && (($file_dirs = $this->
getFileDirs(
113 $files[] = $file_dirs;
116 $this->
logger->debug(
'Collected files:');
117 $this->
logger->dump($files);
120 foreach ($files as $file) {
121 $definition->addCopyDefinition($file[
'source_dir'], $file[
'target_dir']);
122 $this->
logger->debug(
'Added new copy definition: ' . $file[
'source_dir'] .
' -> ' . $file[
'target_dir']);
125 $is_empty_folder = preg_match_all(
"/\/$/", (
string) $file[
'target_dir']);
126 if (!$is_empty_folder) {
130 $definition->setObjectRefIds($object_ref_ids);
131 $definition->setNumFiles($num_files);
143 private function getFileDirs($a_ref_id,
string $a_file_name,
string $a_temp_dir): false|array
147 $user = $DIC->user();
148 $ilAccess = $DIC->access();
149 if ($ilAccess->checkAccessOfUser($user->getId(),
"read",
"", $a_ref_id)) {
151 $source_dir = $file->getFile();
153 if (@!is_file($source_dir)) {
157 $filname_with_suffix = $this->
ensureSuffix($a_file_name, $file->getFileExtension());
159 $target_dir = $a_temp_dir .
'/' . $filname_with_suffix;
164 if (isset(self::$targets[$target_dir])) {
165 $target_info = pathinfo($target_dir);
167 $extension = isset($target_info[
"extension"]) ?
"." . $target_info[
"extension"] :
"";
168 $target_dir = $a_temp_dir .
$filename .
" (" . ++self::$targets[$target_dir] .
")" . $extension;
170 self::$targets[$target_dir] = 0;
174 "source_dir" => $source_dir,
175 "target_dir" => $target_dir,
190 private function recurseFolder($a_ref_id,
string $a_folder_name,
string $a_temp_dir,
int|
float $a_num_recursions, $a_initiated_by_folder_action): array
194 $num_recursions = $a_num_recursions + 1;
195 $tree = $DIC->repositoryTree();
196 $ilAccess = $DIC->access();
201 if ($num_recursions <= 1 && $a_initiated_by_folder_action) {
202 $temp_dir = $a_temp_dir;
207 $subtree = $tree->getChildsByTypeFilter($a_ref_id, [
"fold",
"file"]);
209 foreach ($subtree as $child) {
210 if (!$ilAccess->checkAccess(
"read",
"", $child[
"ref_id"])) {
216 if ($child[
"type"] ==
"fold") {
217 $files_from_folder = $this->
recurseFolder($child[
"ref_id"], $child[
'title'], $temp_dir, $num_recursions, $a_initiated_by_folder_action);
218 $files = array_merge($files, $files_from_folder);
219 } elseif (($child[
"type"] ===
"file") && (($dirs = $this->
getFileDirs($child[
"ref_id"], $child[
'title'], $temp_dir)) !==
false)) {
224 if (empty($subtree)) {
227 "target_dir" => $temp_dir .
'/',
Description of class class.
recurseFolder($a_ref_id, string $a_folder_name, string $a_temp_dir, int|float $a_num_recursions, $a_initiated_by_folder_action)
static getASCIIFilename(string $a_filename)
static _isInTrash(int $ref_id)
run(array $input, Observer $observer)
static getInstanceByRefId(int $ref_id, bool $stop_on_error=true)
get an instance of an Ilias object by reference id
getFileDirs($a_ref_id, string $a_file_name, string $a_temp_dir)
trait ilObjFileSecureString
Trait ilObjFileSecureString.
getExpectedTimeOfTaskInSeconds()
int the amount of seconds this task usually taskes. If your task-duration scales with the the amount ...
ensureSuffix(string $title, ?string $suffix=null)