Импорт

Для импорта необходимо активировать модуль ELiS import и модули, поддерживающие импортируемый формат.

ZIP-архив

Иногда надо загрузить большое количество файлов в папку каталога и описание каждого файла в отдельности может занимать слишком много времени.

Способ пригоден при следующих условиях:

  1. Загружаемые файлы можно описать с помощью общего шаблона метаданных (Например Газета, выпуск, год);
  2. Все файлы должны быть загружены в одну папку каталога;
  3. Файлы имеют не слишком большой размер.

Тогда модуль ELiS Import позволяет загрузить файлы описанным ниже способом.

Идея

Можно упростить ввод метаданных, если загрузить просто одним большим пакетом множество файлов в некоторую папку.

Метаданные, необходимые для ввода (заглавие, серия, выпуск, дата публикации и т.д.) можно ввести прямо в названии загружаемых файлов, например сделав названия:

  • “Газета Правда__1__1980.pdf”
  • “Газета Правда__2__1980.pdf”
  • “Газета Правда__3__1980.pdf”

Здесь очевидно угатывается название серии “Правда”, выпуски 1,2,3 за 1980 год.

Но программа импорта не человек, угодать не может и ей надо помочь, создав специальный файл с метаданными, в котором в машиночитаемом виде будет корректно задан способ разбора шаблона названия файла на поля.

В этом же файле с метаданными можно ввести и обязательные поля, общие для всех пакетно-загружамых документов.

Дальше файл с метаданными и загружаемые файлы документов упаковываются в ZIP-архив и загружаются на сервер.

Для пакетной загрузки роль пользователя должна иметь права на импорт всех документов (import all documents) модуля ELiS Import.

Какие ресурсы можно импортировать

В настоящиее время импортировать можно только книги в PDF.

Для добавления поддержки импорта других типов ресурсов обратитесь в техническую поддержку.

Папка с загружаемыми файлами

Создайте рабочую папку с файлами, которые вы хотите пакетным образом загрузить.

В дальнейшем содержимое папки надо будет упаковать в ZIP-архив.

Файл метаданных

В созданной папке создайте текстовый файл metadata_elis.json в кодировке UTF-8.

В файле с помощью любого текстового редактора (например Notepad++) создайте объект JSON со следующей структурой:

{
"encode":"cp866",
"fileNameTemplate":"{title}.pdf",
"nodeTemplate": {"title":"{field_serial} {field_volume}/{field_publish_date}", "type":"pdf", "field_volume":{"und":[{"value":"{field_volume}"}]}}
}

Здесь следующие параметры:

encode - (обязательный параметр) сохраняемая кодировка ZIP-архива. Если вы ZIP-архив упаковываете в Windows, кодировка зависит от локализации и для русской локализации будет cp866 или utf-8 (см. https://www.opennet.ru/tips/2494_zip_rus_patch.shtml). Если при загрузке вы видите, что имена побились, значит некорректно обрабатывается кодировка и стоит ее подобрать.

fileNameTemplate - (обязательный параметр) шаблон названия файлов, из которого будут извлекаться метаданные. Метаданные представляют собой поля к ноде в машиночитаемом виде. Так поле node->title будет иметь шаблон {title}, поле название серии будет иметь шаблон {field_serial}, поле даты публикации {field_publish_date} и т.д. Список поддерживаемых полей приводится ниже. Все поля в шаблоне должны иметь разделители, по которым очевидно возможно выделить в имени файла с помощью регулярных выражений соответствующее поле, так “{title}{field_data_publish}.pdf” - некорректное название файла и лучше использовать “{title}__{field_data_publish}.pdf”. Хорошей идеей будет использовать двойное нижнее подчеркинвание в качестве разделителей.

nodeTemplate - (опциональный параметр) объект, который будет сливаться с объектом node в Drupal. При этом в объекте можно вместо значений использовать подстановку полей, упомянутых в fileNameTemplate.

Есть один момент с сериализацией: в Drupal поля являются хеш-массивами, а в нотации JSON хеш-массивов не бывает и поэтому в JSON хеш-массивы надо заменить на объекты JavaScript.

Шаблон fileNamTemplate

fileNameTemplate - строка, в которой в фигурных скобках находятся поля, автоматически подставляющие значения из имени файла. При импорте по имени файла будут извлечены значения полей и эти значения будут присвоены сохраняемой ноде.

Не любые поля поддерживаются в fileNameTemplate, вот список тех полей, которые вы можете указать в шаблоне, неперечисленные поля заполнятей с помощью nodeTemplate:

  • title (Пример: “Евгений Онегин”)
  • status (Пример: “1”)
  • type (Пример: “pdf”)
  • field_identifier (Пример: “978-5-7944-3126-1”)
  • field_authors (Пример: “Иванов И.И., Петров П.П.”)
  • field_classification (Пример: “Научная статья”)
  • field_tags (Пример: “Физика”)
  • field_serial (Пример: “Уральский рабочий”)
  • field_publisher (Пример: “Издательство Х”)
  • field_publish_date (Пример: “2020”)
  • field_volume (Пример: “2”)
  • field_issue (Пример: “11”)
  • field_is_fragments (Пример: “34-36”)
  • field_edition (Пример: “2”)
  • field_license (Пример: “http://creativecommons.org/licenses/by/4.0”)
  • field_import_source (Пример: “https://example.com/file.pdf”)
  • field_open_access (Пример: “0”)
  • field_allow_unprotected_download (Пример: “1”)
  • field_social_drm (Пример: “0”)
  • field_meta_open_access (Пример: “1”)

При импорте перечисленные поля корректно импортируются.

Шаблон nodeTemplate

Например в Drupal в PHP-коде присвоение полю даты публикации будет:

::
$node->field_publish_date[‘und’][0][‘value’] = ‘2020’;

В файле метададнных в JSON аналогичное присвоение надо будет преставить как

{
"encode":"cp866",
"fileNameTemplate":"{title}.pdf",
"nodeTemplate":{"field_publish_date":{"und":[{"value":"2020"}]}}
}

Здесь объект в nodeTemplate будет слит с объектом node в момент сохранения.

Тип сохраняемой ноды берется из расширения файла, но можно указать его руками “nodeTemplate”:{“type”:”pdf”} для книги в PDF. Типы ноды можно посмотреть в админке в структуре нод.

Подстановка в шаблон nodeTemplate данных из fileNameTemplate

В шаблоне nodeTemplate можно также использовать подстановку полей из шаблона fileNameTemplate, например для газеты можно сформировать составное заглавие:

{
"encode":"cp866",
"fileNameTemplate":"{field_serial}__{field_volume}__{field_publish_date}__{field_issue}.pdf",
"nodeTemplate": {"title":"{field_serial} {field_volume}/{field_publish_date} ({field_issue})", "type":"pdf", "field_volume":{"und":[{"value":"{field_volume}"}]}}
}

Как узнать какую структуру вписать для nodeTemplate

Загрузите один файл, который будет для вас шаблоном в ручном режиме и корректно его опишите.

Вам надо узнать внутреннюю структуру ноды, чтобы преобразовать ее в JSON и подставить в nodeTemplate.

Для этого в /usr/lib64/elis/drupal создайте произвольный файл (например filename.php) с расширением PHP и напишите в нем код:

<?php
$nid = '12345'; // идентификатор ноды, для которой хотите узнать внутреннуюю структуру с полями.
require_once('drupal.bootstrap.php');
$node = node_load($nid);
var_dump($node);

Здесь вместо 12345 подставьте идентификатор той ноды, поля которой вам интересны и выполните файл из консоли командой

$ php filename.php

В результате вы получите дамп объекта, который преобразовав в JSON можете использовать в nodeTemplate.

Вам можно подставлять не весь объект целиком, а только определенные поля (имеют структуру field_имяполя).

Примеры файлов метаданных

Только авторы и заглавие:

  • Иванов И.И., Петров П.П.__Любительская фотография.pdf
  • Сидоров С.С.__История фототехники.pdf
{
"encode":"cp866",
"fileNameTemplate":"{field_authors}__{title}.pdf"
}

Газета с указанием выпуска и года и составным заглавием:

  • Народная свобода__1917__22.pdf
  • Народная свобода__1917__23.pdf
{
"encode":"cp866",
"fileNameTemplate":"{field_serial}__{field_publish_date}__{field_issue}.pdf",
"nodeTemplate": {"title":"{field_serial} {field_issue}/{field_publish_date}", "type":"pdf"}
}

Тезисы докладов от 2020 года, помеченные термином с tid 321 (https://elis.example.com/taxonomy/term/321) в поле классификации (field_classification):

  • Иванов И.И., Петров П.П.__Исследование сферического коня в вакууме.pdf
  • Сидоров С.С.__Особенности ориентации сферичесого коня в вакууме.pdf
{
"encode":"cp866",
"fileNameTemplate":"{field_authors}__{title}.pdf",
"nodeTemplate": {"type":"pdf", "field_publish_date":{"und":[{"value":"2020"}]}, "field_classification":{"und":[{"tid":"321"}]}}
}

Пример архива с кодировкой UTF-8: https://elibsystem.ru/sites/default/files/docs/import/zip/example_import_serial.zip

Пакетная загрузка на сервер

После того, как файл метаданных metadata_elis.json будет готов, упакуйте все загружаемые файлы и metadata_elis.json в ZIP-архив (можно без сжатия). Все файлы должны быть в корне архива. В архиве не должно быть папок и файлов со спецсимволами в названиях.

Перейдите в папку каталог, в которую вы хотите загрузить ресурс (например https://elis.example.com/node/123) и нажмите вкладку Импорт. Если вкладка “Импорт” не видна, значит у роли вашего пользователя нет прав на импорт ресурсов (import all documents).

Перейдите по вкладке импорта и нажмите кнопку импорта ресурсов. В результате вы перейдете на форму загрузки ZIP-архива.

Альтернативно можно перейти по URL: https://elis.example.com/node/123/import/zip.

Начните процедуру импорта ZIP-архива. Она может занять продолжительное время (таймаут выполнения PHP - один час).

Не нажимайте кнопку загрузки дважды.

Может возникнуть ситуация, что браузер не дождется процесса обработки и закроет соединение с ошибкой по таймауту. Если это произошло, вернитись в папку, в которую загружаете файлы чтобы убедиться, что спустя некоторое время они появятся. Для обнаружения ошибок в этом случае смотрите логи на сайте ELiS.

Культура.РФ

Вы можете импортировать все книги из раздела “литература” на сайте https://culture.ru. Всего более 500 книг. Перед запуском процедуры импорта вы должны убедиться, что имеете права на импорт всех размещенных на сайте книг и распространение их через вашу библиотеку. Поставщик ELiS не передает вам вместе с библиотекой какие-либо права на импортируемые книги.

Для импорта:

  1. Включите модули ELiS import и EPUB.
  2. Перейдите под администратором в папку каталога, в которую вы хотите импортировать книги вместе со структурой навигации. Если такая папка каталога еще не создана, создайте ее.
  3. Нажмите вкладку “импорт”. Импорт будет произведен именно в ту папку каталога, в которой вы нажали на вкладку импорта.
  4. Вы увидите ссылку для импорта с сайта Культура.РФ. Нажмите ее.
  5. Вы увидите командную, которую необходимо выполнить для запуска процедуры импорта.
  6. Зайдите на сервер по SSH и выполните эту команду с правами root-а.
  7. Процедура импорта займет от 30 минут до нескольких часов. В течении этого времени не закрывайте SSH-сессию.
  8. Если сессия прервалась, вы сможете повторить процедуру импорта. Ранее импортированные книги повторно импортироваться не будут.

Импортированные книги

Импортированный каталог с сайта Культура.РФ

Импортированный каталог с сайта Культура.РФ

Импортированный файл EPUB встроенный в ELiS

Импортированный файл EPUB встроенный в ELiS

Open Journal System

Вы можете импортировать статьи журнала, опубликованного в Open Journal System (OJS) в автоматическом режиме по расписанию.

Для первого импорта:

  1. Включите модули ELiS OJS и ELiS PDF.
  2. Если импортированные документы будут мультиязычными, влключите модуль locale, title и убедитесь, что у нод для полей title, body разрешен перевод. Если перевод не разрешен, сделайте снапшот, включите перевод, сбросьте кеш и проверьте, что ранее созданные описания и заглавия нод не исчезли.
  3. Перейдите под администратором в папку каталога, в которую вы хотите импортировать книги вместе со структурой навигации. Если такая папка каталога еще не создана, создайте ее.
  4. Проверьте, что у папки есть текстовое поле field_import_source (его можно открыть по URI admin/structure/types/manage/subj/fields/field_import_source), если поля нет, добавьте его, пройдя по admin/structure/types/manage/subj/fields и выбрав field_import_source среди “Добавить существующее поле”.
  5. В корневой папке журнала, созданной ранее, в поле field_import_source введите URL сайта журнала. URL должен быть корневым без конечного слеша, примеры: https://ntb.gpntb.ru/jour или https://press.psu.ru/index.php/bio.
  6. Установите в качестве типа папки (folder_type) серию, в поле серии field_serial введите название серии, как оно заполнено в метаданных на сайте с сохранением регистра.
  7. Запомните идентификатор ноды (nid) корневой папки журнала. Для URL папки https://elis.example.com/node/1234 идентификатором ноды будет ‘1234’.
  8. Теперь вы можете произвести импорт с помощью команды drush. Для выполнения команд зайдите на сервер по SSH и перейдите в папку /var/www/vh/library под пользователем elis: # su elis; cd /var/www/vh/library;
  9. Запустите drush-команду для импорта данных за все время: $ drush elis-ojs-import –nid=1234
  10. Если вы хотите импортировать за диапазон дат, введите команду: $ drush elis-ojs-import –nid=1234 –from=2022-01-01 –until=2022-02-01
  11. После запуска команд импорта вы увидите выполнение процесса. Если он завершился без ошибок, можете перейти к автоматическому импорту по расписанию.
  12. Если вы увидели ошибки, проверьте на сайте в admin/reports/dblog сообщения об ошибках и исправьте их или обратитесь в поддержку.
  13. Проверьте для импортированных ресурсов все ли впорядке, просмотрев ресурсы в папке. Обратите внимание на навигацию, она строится исходя из указанных volume и issue (том, выпуск) в OJS. Если том не указан, вместо тома может использоваться год. Если volume и issue указаны в OJS с ошибкой, то навигация в ELiS также будет с ошибкой. В таком случае надо вначале исправить описание в OJS, затем можно удалить импортированные в ELiS ресурсы и провести повторный импорт (для этого и удобно ограничивать импорт по датам, чтобы не надо было слишком многое удалять).
  14. После того, как импорт будет отлажен, можно перейти к автоматическому импорту при вызове drupal cron. Для этого перейдите на сайте по admin/config/content/elis_ojs и в “Настрйоки OJS в формате JSON” создайте JSON: ‘{“nodes”:[{“nid”:1234}]}’ (без одиночных кавычек). Если вам надо будем импортировать несколько журналов, то укажите их в массиве nodes: {“nodes”:[{“nid”:1234},{“nid”:1235},{“nid”:1236}]}. Все перечисленные ноды должны иметь заполненное field_import_source, быть папками и иметь указанную сервию в поле field_import_source.
  15. Если вы хотите, что у импортированных изданий были дополнтиельно добавлены общие термины тегов, классификации или издателя - просто перед импортом заполните эти поля у корневой папки и все что указано в field_publisher, field_tags, field_classification будет скопировано при импорте на импортируемые ресурсы.
  16. Если метаданные к журналу в OJS заполняются на нескольких языках, убедитесь, что эти языки добавлены в Drupal, включен модуль entity_translation и для всех полей ноды, для которых есть метаданные, включен перевод полей. Как минимум надо включить перевод для полей title, body.

Для последующего импорта

Если в конфигурации интеграции OJS на странице admin/config/content/elis_ojs вы добавили ноду, то импорт будет производиться с помощью drupal cron, вызываемым автоматически несколько раз в день. При этом имерт будет производиться ресурсов OJS добавленных за текущий или предыдущий день.

Если ваш сайт не работал более одного дня, то импорт по расписанию может часть ресурсов не импортировать и надо запустить импорт руками. Запускаемый руками импорт работает в полуавтоматическом режиме: вы можете указать некоторые параметры импорта, но скачивание ресурсов и импорт метаданных производятся автоматически.

Запуск импорта в ручном режиме

Из под пользователя ELiS запустите drush-команду: drush elis-import-ojs –nid=1234

# cd /var/www/vh/library
# su elis
$ drush elis-import-ojs --nid=1234

Здесь в качестве nid укажите идентификатор корневой папки журнала, в которой находятся тома журнала.

Если вам надо импортировать за выбранные даты, то нужно указать параметры –from и –until в формате yyyy-mm-dd:

::
$ drush elis-import-ojs –nid=1234 –from=2022-01-01 –until=2022-05-20

Параметр sync отвечает надо ли синхронизовать метаданные для уже импортированных в ELiS ресурсов (–sync=1) или пропустить синхронизацию для ранее импортированных ресурсов. Пример:

$ drush elis-import-ojs --nid=1234 --from=2022-01-01 --until=2022-05-20 --sync=1

Настройки OJS

По адресу admin/config/content/elis_ojs вы можете настроить импорт ресурсов автоматически. Формат следующий:

{
“nodes”:[
{
“nid”:<nid>, “sync”: false

}, {

“nid”:<nid>, “sync”: false

}, {

“nid”:<nid>, “sync”: false

}

]

}

Пример импорта для ноды 1234:

{“nodes”:[{“nid”:1234]}

Пример импорта для нод 1234 и 1235:

{“nodes”:[{“nid”:1234,”sync”:true},{“nid”:1235}]}

Здесь вместо <nid> надо подставить идентификатор корневой папки журнала в виде числа.

Параметр “sync” опциональный и может не указываться. Если выставить в true, то при синхронизации метаданные в ELiS будут обновляться вслед за изменениями в OJS. По умолчанию false и если после импорта в ELiS метаданные в OJS изменятся, в ELiS это не отразится. Установка в false позволяет меньше потреблять ресурсов при импорте так как если ресурс уже импортирован, какие у него в текущий момент метаданные не проверяется.

Известные ограничения интеграции с OJS

Известные ограничения интеграции:

  1. заголовок ноды может выводиться некорректно (на основном языке);
  2. теги не локализуются (добавляются на всех языках отдельно, вместо локализации отдельных терминов);
  3. список литературы не локализуется (выводится как есть).