예제 #1
0
 /** @return AdminLibBean */
 public static function inst()
 {
     return parent::inst();
 }
예제 #2
0
 /**
  * Метод определяет сущность из библиотеки по переданным параметрам.
  * Может быть задан любой из параметров.
  * 
  * @return FoldedEntity
  */
 public function defineFoldedEntity($type, $ident, $text)
 {
     $this->LOGGER->info();
     $this->LOGGER->info("Определяем элемент по параметрам: [{$type}|{$ident}|{$text}]");
     if ($type && $ident) {
         $this->LOGGER->info('Быстрый поиск по типу и идентификатору');
         $folding = Handlers::getInstance()->getLibManager($type, false);
         return $folding ? $folding->getFoldedEntity($ident) : null;
     }
     $items = LibBean::inst()->getLibItemsSearchAmong($type, $ident, $text);
     $count = is_array($items) ? count($items) : 0;
     if ($count == 0) {
         $this->LOGGER->info('В базе нет подходящих сущностей');
         return null;
     }
     if ($count == 1) {
         $this->LOGGER->info('В базе найдена одна подходящая сущность: ' . $items[0]['grup'] . '-' . $items[0]['ident'] . ' (' . $items[0]['name'] . ')');
         return Handlers::getInstance()->getLibManager($items[0]['grup'])->getFoldedEntity($items[0]['ident']);
     }
     $this->LOGGER->info('В базе найдено {} подходящих сущностей, начинаем выбор...', $count);
     /*
      * В базе есть несколько сущностей, удовлетворяющих нашим условиям.
      * Мы должны выбрать наиболее близкую по тексту ссылки.
      */
     /**
      * Минимальная длина последовательности общих совпадающих символов, при которой можно считать, 
      * что мы нашли элемент библиотеки по тексту.
      * Она не может быть больше длины текста, заданного в ссылке.
      */
     $takeMinLen = min(5, ps_strlen($text));
     $cnt = 0;
     $lastItem = null;
     $lastItemMaxlen = null;
     $lastItemCommonCharsCnt = null;
     foreach ($items as $item) {
         $nowItemMaxlen = StringUtils::getCommonMaxSequenceLen($text, $item['name']);
         if ($nowItemMaxlen < $takeMinLen) {
             continue;
         }
         if (!$lastItemMaxlen || $lastItemMaxlen < $nowItemMaxlen) {
             $cnt = 1;
             $lastItem = $item;
             $lastItemMaxlen = $nowItemMaxlen;
             continue;
         }
         if ($lastItemMaxlen == $nowItemMaxlen) {
             if (!is_numeric($lastItemCommonCharsCnt)) {
                 $lastItemCommonCharsCnt = StringUtils::getCommonCharsCount($text, $lastItem['name']);
             }
             $nowItemCommonCharsCnt = StringUtils::getCommonCharsCount($text, $item['name']);
             if ($nowItemCommonCharsCnt > $lastItemCommonCharsCnt) {
                 //Одинаковая длина общей последовательности букв, но у текущего элемента больше общих букв
                 $lastItem = $item;
                 $lastItemMaxlen = $nowItemMaxlen;
                 $lastItemCommonCharsCnt = $nowItemCommonCharsCnt;
             } else {
                 if ($nowItemCommonCharsCnt == $lastItemCommonCharsCnt) {
                     //Одинаковая длина одинаковой последовательности букв и кол-ва общих букв
                     ++$cnt;
                 }
             }
         }
     }
     $this->LOGGER->info('По окончанию выборки найдено совпадений: ' . $cnt);
     return $cnt == 1 ? Handlers::getInstance()->getLibManager($lastItem['grup'])->getFoldedEntity($lastItem['ident']) : null;
 }