ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
AllResourcesDataSource.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
27 
32 {
33  public function __construct()
34  {
35  global $DIC;
37  $DIC->resourceStorage()->collection()->id() // ad hoc collection
38  );
39  }
40 
41  public function process(): void
42  {
43  $r = $this->db->query($this->getCountQuery());
44  $this->filtered_amount_of_items = (int)$this->db->fetchAssoc($r)['cnt'];
45 
46  $r = $this->db->query($this->getDataQuery());
47 
48  $rid_strings = [];
49  while ($d = $this->db->fetchAssoc($r)) {
50  $rid_strings[] = $d['rid'] ?? '';
51  }
52  $this->irss->preload($rid_strings);
53  foreach ($rid_strings as $rid_string) {
54  $rid_instance = $this->irss->manage()->find($rid_string);
55  if (!$rid_instance instanceof \ILIAS\ResourceStorage\Identification\ResourceIdentification) {
56  continue;
57  }
58  $this->collection->add($rid_instance);
59  }
60  }
61 
62  public function getSortationsMapping(): array
63  {
64  return [
65  SortDirection::BY_TITLE_ASC => 'revision_title ASC', // Default
66  SortDirection::BY_TITLE_DESC => 'revision_title DESC',
67  SortDirection::BY_SIZE_ASC => 'file_size ASC',
68  SortDirection::BY_SIZE_DESC => 'file_size DESC',
69  SortDirection::BY_CREATION_DATE_ASC => 'creation_date ASC',
70  SortDirection::BY_CREATION_DATE_DESC => 'creation_date DESC',
71  ];
72  }
73 
77  public function getFilterItems(
78  Factory $ui_factory,
80  ): array {
81  $stakeholders = [];
82  $r = $this->db->query('SELECT DISTINCT * FROM il_resource_stkh');
83  while ($d = $this->db->fetchAssoc($r)) {
84  $class_name = $d['class_name'] ?? '';
85  if (!class_exists($class_name)) {
86  continue;
87  }
89  $stakeholder = new $class_name();
90 
91  $stakeholders[$d['id']] = $stakeholder->getConsumerNameForPresentation();
92  }
93 
94  asort($stakeholders);
95 
96  return [
97  'title' => $ui_factory->input()->field()->text(
98  $lng->txt('title'),
99  ),
100  'size' => $ui_factory->input()->field()->numeric(
101  $lng->txt('file_size_bigger_than')
102  ),
103  'stakeholder' => $ui_factory->input()->field()->select(
104  $lng->txt('stakeholders'),
105  $stakeholders
106  ),
107 // 'revisions' => $ui_factory->input()->field()->numeric(
108 // $lng->txt('revisions_more_than'),
109 // ),
110  ];
111  }
112 
113  private function getCountQuery(): string
114  {
115  return $this->getBaseQuery(true);
116  }
117 
118  private function getDataQuery(): string
119  {
120  return $this->getBaseQuery(false) . " LIMIT " . $this->offset . ", " . $this->limit;
121  }
122 
123 
124 
125  private function getBaseQuery(bool $count_only): string
126  {
127  // SELECT
128  $q = $this->buildSelect($count_only);
129  // FROM AND JOINS
130  $q .= " FROM il_resource_revision
131  JOIN il_resource_info ON il_resource_revision.rid = il_resource_info.rid AND
132  il_resource_info.version_number = il_resource_revision.version_number
133  JOIN il_resource_stkh_u ON il_resource_revision.rid = il_resource_stkh_u.rid";
134 
135  // WHERE
136  $q .= $this->buildQueryFilter();
137 
138  if (!$count_only) {
139  $q .= " GROUP BY il_resource_revision.rid ";
140  }
141 
142  // $q .= $this->buildHaving();
143 
144  if (!$count_only) {
145  $q .= $this->buildSortation();
146  }
147 
148  return $q;
149  }
150 
151 
152  private function buildSortation(): string
153  {
154  return " ORDER BY " . ($this->getSortationsMapping()[$this->sort_direction]
156  }
157 
158  private function buildSelect(bool $count_only): string
159  {
160  if ($count_only) {
161  return "SELECT COUNT(il_resource_revision.rid) AS cnt";
162  }
163 
164  return "SELECT il_resource_revision.rid
165  , MAX(il_resource_revision.version_number) AS max_revision
166  , il_resource_revision.title AS revision_title
167  , il_resource_info.title AS file_title
168  , il_resource_info.size AS file_size
169  , il_resource_info.creation_date AS creation_date
170  , il_resource_stkh_u.stakeholder_id AS stakeholder";
171  }
172 
173  private function buildQueryFilter(): string
174  {
175  $filters = [];
176  $filter_values = [];
177  $query = '';
178  if ($this->filter_values !== null) {
179  if (isset($this->filter_values['title']) && $this->filter_values['title'] !== '') {
180  $filter_values[] = $this->db->quote("%" . $this->filter_values['title'] . "%", 'text');
181  $filters[] = " il_resource_revision.title LIKE %s ";
182  }
183  if (isset($this->filter_values['size']) && $this->filter_values['size'] !== '') {
184  $greater_than = (int)$this->filter_values['size'] * BaseToComponent::SIZE_FACTOR * BaseToComponent::SIZE_FACTOR;
185  $filter_values[] = $this->db->quote($greater_than, 'integer');
186  $filters[] = " il_resource_info.size > %s ";
187  }
188 
189  if (isset($this->filter_values['stakeholder']) && $this->filter_values['stakeholder'] !== '') {
190  $filter_values[] = $this->db->quote("" . $this->filter_values['stakeholder'] . "", 'text');
191  $filters[] = " il_resource_stkh_u.stakeholder_id = %s ";
192  }
193  }
194  if ($filters !== []) {
195  $query = " WHERE " . implode(" AND ", $filters);
196  $query = vsprintf($query, $filter_values);
197  }
198 
199  return $query;
200  }
201  private function buildHaving(): string
202  {
203  $filters = [];
204  $filter_values = [];
205  $query = '';
206  if ($this->filter_values !== null) {
207  if (isset($this->filter_values['revisions']) && $this->filter_values['revisions'] !== '') {
208  $filter_values[] = $this->db->quote($this->filter_values['revisions'], 'integer');
209  $filters[] = "MAX(il_resource_revision.version_number) > %s ";
210  }
211  }
212  if ($filters !== []) {
213  $query = " HAVING " . implode(" AND ", $filters);
214  $query = vsprintf($query, $filter_values);
215  }
216 
217  return $query;
218  }
219 }
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
Interface Observer Contains several chained tasks and infos about them.
input()
description: purpose: > In opposite to components with a purely receptive or at most navigational ch...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This is how the factory for UI elements looks.
Definition: Factory.php:37
global $DIC
Definition: shib_login.php:25
__construct(Container $dic, ilPlugin $plugin)
global $lng
Definition: privfeed.php:32
$q
Definition: shib_logout.php:18
$r