Экспорт публикаций сотрудников СФУ на сайты институтов и кафедр

В базе публикаций имеется возможность экспорта публикаций сотрудников в анкеты на сторонние сайты, например, на сайты институтов или кафедр. См. пример анкеты на официальном сайте СФУ. Для этого на страницу анкеты нужно внедрить серверный код (например, PHP), который будет загружать и выводить содержимое страницы с адресом вида:

http://scholar.sfu-kras.ru/author/EVaganov?included=yes&min=2&stats=no&dbs=no

Описание поддерживаемых параметров в адресе:

  • EVaganov — имя сетевой учётной записи СФУ сотрудника (совпадает с именем электронной почты сотрудника имя@sfu-kras.ru);
  • included — обязательный параметр, при экспорте следует указывать значение yes;
  • min (по умолчанию 1) — минимальное количество публикаций (если публикаций меньше, то вернётся пустая страница);
  • stats (по умолчанию yes) — показывать или нет статистику с количеством публикаций и цитирований (yes или no);
  • dbs (по умолчанию yes) — показывать или нет вхождения публикаций в базы данных Scopus, Web of Science, eLIBRARY.RU (yes или no);
  • links (по умолчанию yes) — показывать или нет ссылки на публикации и авторов в списке публикаций (yes или no);
  • split (по умолчанию 0) — разбивать или нет длинный список публикаций на два списка как указано в шаблоне split_template; указывается число публикаций в первом списке (параметр нужен для того, чтобы вывести сначала, например, только 10 публикаций, а остальные показывать при клике по ссылке);
  • split_template (по умолчанию %first&<hr/>%rest) — шаблон для форматирования списка публикаций из двух подсписков (например: %first<div class='collapsed-block'><a href='#show' class='trigger'>Показать ещё публикации</a><div class='collapsed-content'>%rest</div></div>).

Ниже дан пример функции на языке PHP для загрузки публикаций, их кеширования и форматирования. В параметрах функция принимает рабочий e-mail пользователя (для извлечения оттуда имени пользователя) и значение параметра split. Код приведён для системы Drupal, используются функции cache_set и cache_get для кеширования данных в базе данных.


/**
 * Загружает публикации сотрудника с scholar.sfu-kras.ru и возвращает форматированный список публикаций.
 * Показывает первые $split публикаций, остальные разворачиваются при клике
 * (для этого сайт должен реализовать через JS .collapsed-block > .trigger + .collapsed-content).
 * Кеширует загруженные публикации 1 час.
 *
 * @param string $email e-mail пользователя, откуда извлекается имя учётной записи СФУ
 * @param int $split кол-во публикаций, которые отображаются сразу (остальные после клика)
 *
 * @return string HTML-код с форматированным списком публикаций
 */
function scholar_show_publications($email, $split = 0) {
  // определяем имя учётной записи СФУ
  $sfu_account = FALSE;
  if (preg_match('/^([a-z0-9.-]+)@sfu-kras[.]ru$/i', $email, $matches)) {
    $sfu_account = $matches[1];
  }

  // если не нашлась учётная запись СФУ, то выходим
  if ($sfu_account == '') {
    return '';
  }

  // загрузка из кеша
  $cache = cache_get($cid = "scholar:$sfu_account:$split");
  if ($cache && time() - $cache->created < 60 * 60) {
    return $cache->data;
  }

  // шаблон HTML-кода для сворачиваемого списка
  $split_template = urlencode("
    %first
    <div class='collapsed-block'>
        <a href='#show' class='trigger'>Показать ещё публикации</a>
        <div class='collapsed-content'>%rest</div>
    </div>
    ");

  // получаем и форматируем конечный результат
  $url = "http://scholar.sfu-kras.ru/author/$sfu_account?included=yes&min=2&stats=no&dbs=no&links=yes&split=$split&split_template=$split_template";
  $pubs = @file_get_contents($url, FALSE, stream_context_create(array('http' => array('timeout' => 5))));
  // если что-то успешно загрузилось
  if ($pubs != '') {
    // добавляем CSS-код
    $result = "
        <style type='text/css'>
            .publication-authors a {color: inherit !important;}
            .publication-authors a:hover {color: #ff6600 !important;}
            .collapsed-block .collapsed-content {display: none;}
        </style>
        $pubs
    ";
  }
  // если возникла ошибка, но в старом кеше что-то есть, то берём из кеша
  elseif ($pubs === FALSE && $cache && $cache->data != '') {
    $result = $cache->data;
  }
  else {
    $result = '';
  }

  // сохранение в кеш (если не было ошибки) и возврат результата
  if ($pubs !== FALSE) {
    cache_set($cid, $result);
  }
  return $result;
}

Пример использования в PHP-шаблоне анкеты сотрудника (в случае Drupal): print scholar_show_publications($node->field_person_email[0]['value'], 10).

Для поддержки разворачивания всех публикаций при клике и открытия ссылок в новом окне потребуется JavaScript-код. Пример кода с использованием библиотеки jQuery:


$(document).ready(function() {
	// поддержка разворачиваемых блоков
	$('.collapsed-block .trigger').click(function() {
		var content = $(this).parents('.collapsed-block:first').find('.collapsed-content');
		if (content.css('display') == 'none') {
			content.show();
		}
		else {
			content.hide();
		}
		return false;
	});

	// открытие ссылок в публикациях в новом окне
	$('.publications-list a').click(function() {
		window.open($(this).attr('href'), '_blank');
		return false;
	});
});

По техническим вопросам можно обращаться по электронной почте sppa [at] sfu-kras [dot] ru или по телефону (391) 291-27-20 (Бархатов Андрей Вячеславович).