ILIAS  trunk Revision v11.0_alpha-1769-g99a433fe2dc
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
class.ilMDKeyword.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
27 class ilMDKeyword extends ilMDBase
28 {
29  private string $keyword = '';
31 
32  // SET/GET
33  public function setKeyword(string $a_keyword): void
34  {
35  $this->keyword = $a_keyword;
36  }
37 
38  public function getKeyword(): string
39  {
40  return $this->keyword;
41  }
42 
43  public function setKeywordLanguage(ilMDLanguageItem $lng_obj): void
44  {
45  $this->keyword_language = $lng_obj;
46  }
47 
49  {
50  return is_object($this->keyword_language) ? $this->keyword_language : null;
51  }
52 
53  public function getKeywordLanguageCode(): string
54  {
55  return is_object($this->keyword_language) ? $this->keyword_language->getLanguageCode() : '';
56  }
57 
58  public function save(): int
59  {
60  $fields = $this->__getFields();
61  $fields['meta_keyword_id'] = array('integer', $next_id = $this->db->nextId('il_meta_keyword'));
62 
63  if ($this->db->insert('il_meta_keyword', $fields)) {
64  $this->setMetaId($next_id);
65  return $this->getMetaId();
66  }
67  return 0;
68  }
69 
70  public function update(): bool
71  {
72  return $this->getMetaId() && $this->db->update(
73  'il_meta_keyword',
74  $this->__getFields(),
75  array("meta_keyword_id" => array('integer', $this->getMetaId()))
76  );
77  }
78 
79  public function delete(): bool
80  {
81  if ($this->getMetaId()) {
82  $query = "DELETE FROM il_meta_keyword " .
83  "WHERE meta_keyword_id = " . $this->db->quote($this->getMetaId(), 'integer');
84  $res = $this->db->manipulate($query);
85 
86  return true;
87  }
88  return false;
89  }
90 
94  public function __getFields(): array
95  {
96  return array(
97  'rbac_id' => array('integer', $this->getRBACId()),
98  'obj_id' => array('integer', $this->getObjId()),
99  'obj_type' => array('text', $this->getObjType()),
100  'parent_type' => array('text', $this->getParentType()),
101  'parent_id' => array('integer', $this->getParentId()),
102  'keyword' => array('text', $this->getKeyword()),
103  'keyword_language' => array('text', $this->getKeywordLanguageCode())
104  );
105  }
106 
107  public function read(): bool
108  {
109  if ($this->getMetaId()) {
110  $query = "SELECT * FROM il_meta_keyword " .
111  "WHERE meta_keyword_id = " . $this->db->quote($this->getMetaId(), 'integer');
112 
113  $res = $this->db->query($query);
114  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
115  $this->setRBACId((int) $row->rbac_id);
116  $this->setObjId((int) $row->obj_id);
117  $this->setObjType($row->obj_type ?? '');
118  $this->setParentId((int) $row->parent_id);
119  $this->setParentType($row->parent_type ?? '');
120  $this->setKeyword($row->keyword ?? '');
121  $this->setKeywordLanguage(new ilMDLanguageItem($row->keyword_language ?? ''));
122  }
123  }
124  return true;
125  }
126 
127  public function toXML(ilXmlWriter $writer): void
128  {
129  $writer->xmlElement(
130  'Keyword',
131  array(
132  'Language' => $this->getKeywordLanguageCode() ?: 'en'
133  ),
134  $this->getKeyword()
135  );
136  }
137 
138  // STATIC
139 
143  public static function _getIds(int $a_rbac_id, int $a_obj_id, int $a_parent_id, string $a_parent_type): array
144  {
145  global $DIC;
146 
147  $ilDB = $DIC->database();
148 
149  $query = "SELECT meta_keyword_id FROM il_meta_keyword " .
150  "WHERE rbac_id = " . $ilDB->quote($a_rbac_id, 'integer') . " " .
151  "AND obj_id = " . $ilDB->quote($a_obj_id, 'integer') . " " .
152  "AND parent_id = " . $ilDB->quote($a_parent_id, 'integer') . " " .
153  "AND parent_type = " . $ilDB->quote($a_parent_type, 'text') . " " .
154  "ORDER BY meta_keyword_id ";
155 
156  $res = $ilDB->query($query);
157  $ids = [];
158  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
159  $ids[] = (int) $row->meta_keyword_id;
160  }
161  return $ids;
162  }
163 
167  public static function _getKeywordsByLanguage(int $a_rbac_id, int $a_obj_id, string $a_type): array
168  {
169  global $DIC;
170 
171  $ilDB = $DIC->database();
172  $ilObjDataCache = $DIC['ilObjDataCache'];
173 
174  $query = "SELECT keyword,keyword_language " .
175  "FROM il_meta_keyword " .
176  "WHERE rbac_id = " . $ilDB->quote($a_rbac_id, 'integer') . " " .
177  "AND obj_id = " . $ilDB->quote($a_obj_id, 'integer') . " " .
178  "AND obj_type = " . $ilDB->quote($a_type, 'text') . " ";
179  $res = $ilDB->query($query);
180  $keywords = [];
181  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
182  if ($row->keyword) {
183  $keywords[$row->keyword_language][] = $row->keyword;
184  }
185  }
186  return $keywords;
187  }
188 
192  public static function _getKeywordsByLanguageAsString(int $a_rbac_id, int $a_obj_id, string $a_type): array
193  {
194  $key_string = [];
195  foreach (self::_getKeywordsByLanguage($a_rbac_id, $a_obj_id, $a_type) as $lng_code => $keywords) {
196  $key_string[$lng_code] = implode(",", $keywords);
197  }
198  return $key_string;
199  }
200 
204  public static function _searchKeywords(string $a_query, string $a_type, int $a_rbac_id = 0): array
205  {
206  global $DIC;
207 
208  $ilDB = $DIC->database();
209 
210  $qs = 'AND ';
211  $counter = 0;
212  foreach ((array) explode(' ', $a_query) as $part) {
213  if ($counter++) {
214  $qs .= 'OR ';
215  }
216  $qs .= ($ilDB->like('keyword', 'text', $part) . ' ');
217  }
218 
219  if ($a_rbac_id) {
220  $query = "SELECT obj_id FROM il_meta_keyword " .
221  "WHERE rbac_id = " . $ilDB->quote($a_rbac_id, 'integer') . ' ' .
222  'AND obj_type = ' . $ilDB->quote($a_type, 'text') . ' ' .
223  $qs;
224  } else {
225  $query = "SELECT obj_id FROM il_meta_keyword " .
226  'WHERE obj_type = ' . $ilDB->quote($a_type, 'text') . ' ' .
227  $qs;
228  }
229 
230  $res = $ilDB->query($query);
231  $obj_ids = [];
232  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
233  $obj_ids[] = $row->obj_id;
234  }
235 
236  return $obj_ids;
237  }
238 
242  public static function _getMatchingKeywords(string $a_query, string $a_type, int $a_rbac_id = 0): array
243  {
244  global $DIC;
245 
246  $ilDB = $DIC->database();
247 
248  $query = "SELECT DISTINCT keyword FROM il_meta_keyword " .
249  'WHERE obj_type = ' . $ilDB->quote($a_type, 'text') . ' ' .
250  'AND ' . $ilDB->like('keyword', 'text', '%' . trim($a_query) . '%') . ' ';
251 
252  if ($a_rbac_id) {
253  $query .= "AND rbac_id = " . $ilDB->quote($a_rbac_id, 'integer') . ' ';
254  }
255 
256  $res = $ilDB->query($query);
257  $kws = [];
258  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
259  $kws[] = $row->keyword;
260  }
261  return $kws;
262  }
263 
264  public static function lookupKeywords(int $a_rbac_id, int $a_obj_id, bool $a_return_ids = false): array
265  {
266  global $DIC;
267 
268  $ilDB = $DIC->database();
269 
270  $query = "SELECT * FROM il_meta_keyword " .
271  "WHERE rbac_id = " . $ilDB->quote($a_rbac_id, 'integer') . ' ' .
272  "AND obj_id = " . $ilDB->quote($a_obj_id, 'integer') . ' ';
273  $res = $ilDB->query($query);
274  $kws = [];
275  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
276  if (!$a_return_ids) {
277  if (is_string($row->keyword) && $row->keyword !== '') {
278  $kws[] = $row->keyword;
279  }
280  } else {
281  $kws[] = $row->meta_keyword_id;
282  }
283  }
284  return $kws;
285  }
286 
287  public static function updateKeywords(ilMDGeneral $a_md_section, array $a_keywords): void
288  {
289  // trim keywords
290  $new_keywords = array();
291  foreach ($a_keywords as $lang => $keywords) {
292  foreach ((array) $keywords as $keyword) {
293  $keyword = trim($keyword);
294  if ($keyword !== "" && !(isset($new_keywords[$lang]) && in_array($keyword, $new_keywords[$lang], true))) {
295  $new_keywords[$lang][] = $keyword;
296  }
297  }
298  }
299 
300  // update existing author entries (delete if not entered)
301  foreach ($ids = $a_md_section->getKeywordIds() as $id) {
302  $md_key = $a_md_section->getKeyword($id);
303  $lang = $md_key->getKeywordLanguageCode();
304 
305  // entered keyword already exists
306  if (is_array($new_keywords[$lang] ?? false) && in_array($md_key->getKeyword(), $new_keywords[$lang], true)) {
307  unset($new_keywords[$lang][array_search($md_key->getKeyword(), $new_keywords[$lang], true)]);
308  } else { // existing keyword has not been entered again -> delete
309  $md_key->delete();
310  }
311  }
312 
313  // insert entered, but not existing keywords
314  foreach ($new_keywords as $lang => $key_arr) {
315  foreach ($key_arr as $keyword) {
316  if ($keyword !== "") {
317  $md_key = $a_md_section->addKeyword();
318  $md_key->setKeyword(ilUtil::stripSlashes($keyword));
319  $md_key->setKeywordLanguage(new ilMDLanguageItem($lang));
320  $md_key->save();
321  }
322  }
323  }
324  }
325 }
$res
Definition: ltiservices.php:66
static _getKeywordsByLanguage(int $a_rbac_id, int $a_obj_id, string $a_type)
static _getMatchingKeywords(string $a_query, string $a_type, int $a_rbac_id=0)
static _getKeywordsByLanguageAsString(int $a_rbac_id, int $a_obj_id, string $a_type)
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
setKeyword(string $a_keyword)
setRBACId(int $a_id)
toXML(ilXmlWriter $writer)
static updateKeywords(ilMDGeneral $a_md_section, array $a_keywords)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
setObjId(int $a_id)
global $DIC
Definition: shib_login.php:22
static lookupKeywords(int $a_rbac_id, int $a_obj_id, bool $a_return_ids=false)
setParentId(int $a_id)
$lang
Definition: xapiexit.php:25
static _getIds(int $a_rbac_id, int $a_obj_id, int $a_parent_id, string $a_parent_type)
ilMDLanguageItem $keyword_language
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
getKeyword(int $a_keyword_id)
setParentType(string $a_parent_type)
xmlElement(string $tag, $attrs=null, $data=null, $encode=true, $escape=true)
Writes a basic element (no children, just textual content)
setMetaId(int $a_meta_id, bool $a_read_data=true)
setKeywordLanguage(ilMDLanguageItem $lng_obj)
setObjType(string $a_type)
static _searchKeywords(string $a_query, string $a_type, int $a_rbac_id=0)