public function getAssignedKeywords() { if (($keywords = $this->getKeywords()) === false) { static::raiseError(__CLASS__ . '::getKeywords() returned false!'); return false; } if (empty($keywords)) { return null; } $names = array(); foreach ($keywords as $keyword_idx) { try { $keyword = new \Mtlda\Models\KeywordModel(array('idx' => $keyword_idx)); } catch (\Exception $e) { static::raiseError(__METHOD__ . "(), failed to load KeywordModel({$keyword_idx})!"); return false; } if (($name = $keyword->getName()) === false) { static::raiseError(get_class($keyword) . '::getName() returned false!'); return false; } array_push($names, $name); } return implode(', ', $names); }
protected function buildKeywordSuggestions() { global $tmpl; $archive_item_keywords = array(); if (!isset($this->archiveItem) || empty($this->archiveItem)) { static::raiseError(__METHOD__ . '(), have no item to operate on!'); return false; } if (!$this->keywords->hasItems()) { return true; } if ($this->archiveItem->hasKeywords()) { if (($assigned_keywords = $this->archiveItem->getKeywords()) === false) { static::raiseError(get_class($this->archiveItem) . '::getKeywords() returned false!'); return false; } foreach ($assigned_keywords as $idx) { try { $keyword = new \Mtlda\Models\KeywordModel(array('idx' => $idx)); } catch (\Exception $e) { static::raiseError(__METHOD__ . '(), failed to load KeywordModel!', false, $e); return false; } if (($name = $keyword->getName()) === false) { static::raiseError(get_class($keyword) . '::getName() returned false!'); return false; } array_push($archive_item_keywords, $name); } } $sources = array(); if ($this->archiveItem->hasTitle()) { if (($title = $this->archiveItem->getTitle()) === false) { static::raiseError(get_class($this->archiveItem) . '::getTitle() returned false!'); return false; } array_push($sources, $title); } if (($filename = $this->archiveItem->getFileNameBase()) === false) { static::raiseError(get_class($this->archiveItem) . '::getFileName() returned false'); return false; } array_push($sources, $filename); if ($this->archiveItem->hasIndices()) { if (($indices = $this->archiveItem->getIndices(true)) === false) { static::raiseError(get_class($this->archiveItem) . '::getIndices() returned false!'); return false; } if (!isset($indices) || empty($indices) || !is_array($indices)) { static::raiseError(get_class($this->archiveItem) . '::getIndices() returned invalid data!'); return false; } foreach ($indices as $index) { if (($text = $index->getDocumentText()) === false) { static::raiseError(get_class($index) . '::getDocumentText() returned false!'); return false; } array_push($sources, $text); } } if (is_a($this->archiveItem, 'Mtlda\\Models\\DocumentModel') && $this->archiveItem->hasProperties()) { if (($properties = $this->archiveItem->getProperties()) === false) { static::raiseError(get_class($this->archiveItem) . '::getProperties() returned false!'); return false; } if (!isset($properties) || empty($properties) || !is_array($properties)) { static::raiseError(get_class($this->archiveItem) . '::getProperties() returned invalid data!'); return false; } foreach ($properties as $property) { if (($value = $property->getDocumentValue()) === false) { static::raiseError(get_class($property) . '::getDocumentValue() returned false!'); return false; } array_push($sources, $value); } } if (($sources = array_unique($sources)) === false) { static::raiseError(__METHOD__ . '(), failed to filter sources!'); return false; } $existing_keywords = array(); foreach ($this->keywords->getItems() as $keyword) { if (($name = $keyword->getName()) === false) { static::raiseError(get_class($keyword) . '::getName() returned false!'); return false; } array_push($existing_keywords, $name); } $suggestions = array(); $words = array(); foreach ($sources as $source) { $source = str_replace('_', ' ', $source); $source = preg_replace('/[^[:alnum:][:space:]]/u', '', $source); if (count($found_words = str_word_count($source, 1)) < 1) { continue; } array_walk($found_words, function (&$word, $key) { $word = trim($word); return true; }); $found_words = array_filter($found_words, function ($word) { if (strlen($word) < 1) { return false; } return true; }); if (count($found_words) < 1) { continue; } foreach ($found_words as $word) { array_push($words, $word); } } foreach ($words as $key => $word) { if (isset($existing_keywords) && !empty($existing_keywords) && ($matching_keyword = preg_grep("/{$word}/", $existing_keywords)) && isset($matching_keyword) && !empty($matching_keyword) && is_array($matching_keyword) && count($matching_keyword) > 0 && ($matching_keyword = array_shift($matching_keyword))) { $words[$key] = $matching_keyword; continue; } unset($words[$key]); } if (($words = array_count_values($words)) === false) { static::raiseError(__METHOD__ . '(), array_count_values() returned false!'); return false; } if (!arsort($words, SORT_NUMERIC)) { static::raiseError(__METHOD__ . '(), arsort() returned false!'); return false; } if (($words = array_slice($words, 0, 10)) === false) { static::raiseError(__METHOD__ . '(), array_slice() returned false!'); return false; } foreach ($words as $word => $occur) { if (in_array($word, $archive_item_keywords)) { continue; } $this->keywordSuggestions[$word] = $occur; } if (isset($this->keywordSuggestions) && !empty($this->keywordSuggestions)) { $tmpl->assign('has_keyword_suggestions', true); } if (!$this->archive->hasItems()) { return true; } $items = array(); $filenames = array(); $titles = array(); $sources = array(); foreach ($this->archive->getItems() as $document) { if (($idx = $document->getIdx()) === false) { static::raiseError(get_class($document) . '::getIdx() returned false!'); return false; } $items[$idx] = $document; if (($filename = $document->getFileName()) === false) { static::raiseError(get_class($document) . '::getFileName() returned false!'); return false; } if ($document->hasTitle() && ($title = $document->getTitle()) === false) { static::raiseError(get_class($document) . '::getTitle() returned false!'); return false; } $filenames[$idx] = $filename; $titles[$idx] = $title; } if ($this->archiveItem->hasTitle()) { $archive_item_title = $this->archiveItem->getTitle(); } $archive_item_filename = $this->archiveItem->getFileName(); foreach ($filenames as $idx => $filename) { if (($diff = levenshtein($archive_item_filename, $filename)) === -1) { continue; } if ($diff > 10) { continue; } $document = $items[$idx]; if (!$document->hasKeywords()) { continue; } if (($keywords = $document->getKeywords()) === false) { static::raiseError(get_class($document) . '::getKeywords() returned false!'); return false; } if (!isset($keywords) || empty($keywords)) { continue; } foreach ($keywords as $idx) { try { $keyword = new \Mtlda\Models\KeywordModel(array('idx' => $idx)); } catch (\Exception $e) { static::raiseError(__METHOD__ . '(), failed to load KeywordModel!', false, $e); return false; } if (($name = $keyword->getName()) === false) { $this->raiseErrror(get_class($keyword) . '::getName() returned false!'); return false; } array_push($sources, $name); } } if (isset($archive_item_title)) { foreach ($titles as $idx => $title) { if (($diff = levenshtein($archive_item_title, $title)) === -1) { continue; } if ($diff > 10) { continue; } $document = $items[$idx]; if (!$document->hasKeywords()) { continue; } if (($keywords = $document->getKeywords()) === false) { static::raiseError(get_class($document) . '::getKeywords() returned false!'); return false; } if (!isset($keywords) || empty($keywords)) { continue; } foreach ($keywords as $idx) { try { $keyword = new \Mtlda\Models\KeywordModel(array('idx' => $idx)); } catch (\Exception $e) { static::raiseError(__METHOD__ . '(), failed to load KeywordModel!', false, $e); return false; } if (($name = $keyword->getName()) === false) { $this->raiseErrror(get_class($keyword) . '::getName() returned false!'); return false; } array_push($sources, $name); } } } if (($words = array_count_values($sources)) === false) { static::raiseError(__METHOD__ . '(), array_count_values() returned false!'); return false; } if (!arsort($words, SORT_NUMERIC)) { static::raiseError(__METHOD__ . '(), arsort() returned false!'); return false; } if (($words = array_slice($words, 0, 10)) === false) { static::raiseError(__METHOD__ . '(), array_slice() returned false!'); return false; } foreach ($words as $word => $occur) { if (in_array($word, $archive_item_keywords)) { continue; } $this->keywordSuggestionsSimilar[$word] = $occur; } if (isset($this->keywordSuggestionsSimilar) && !empty($this->keywordSuggestionsSimilar)) { $tmpl->assign('has_keyword_suggestions_similar', true); } return true; }