Импорт¶
Для импорта необходимо активировать модуль ELiS import и модули, поддерживающие импортируемый формат.
ZIP-архив¶
Иногда надо загрузить большое количество файлов в папку каталога и описание каждого файла в отдельности может занимать слишком много времени.
Способ пригоден при следующих условиях:
- Загружаемые файлы можно описать с помощью общего шаблона метаданных (Например Газета, выпуск, год);
- Все файлы должны быть загружены в одну папку каталога;
- Файлы имеют не слишком большой размер.
Тогда модуль 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 не передает вам вместе с библиотекой какие-либо права на импортируемые книги.
Для импорта:
- Включите модули ELiS import и EPUB.
- Перейдите под администратором в папку каталога, в которую вы хотите импортировать книги вместе со структурой навигации. Если такая папка каталога еще не создана, создайте ее.
- Нажмите вкладку “импорт”. Импорт будет произведен именно в ту папку каталога, в которой вы нажали на вкладку импорта.
- Вы увидите ссылку для импорта с сайта Культура.РФ. Нажмите ее.
- Вы увидите командную, которую необходимо выполнить для запуска процедуры импорта.
- Зайдите на сервер по SSH и выполните эту команду с правами root-а.
- Процедура импорта займет от 30 минут до нескольких часов. В течении этого времени не закрывайте SSH-сессию.
- Если сессия прервалась, вы сможете повторить процедуру импорта. Ранее импортированные книги повторно импортироваться не будут.
Импортированные книги
Open Journal System¶
Вы можете импортировать статьи журнала, опубликованного в Open Journal System (OJS) в автоматическом режиме по расписанию.
Для первого импорта:
- Включите модули ELiS OJS и ELiS PDF.
- Если импортированные документы будут мультиязычными, влключите модуль locale, title и убедитесь, что у нод для полей title, body разрешен перевод. Если перевод не разрешен, сделайте снапшот, включите перевод, сбросьте кеш и проверьте, что ранее созданные описания и заглавия нод не исчезли.
- Перейдите под администратором в папку каталога, в которую вы хотите импортировать книги вместе со структурой навигации. Если такая папка каталога еще не создана, создайте ее.
- Проверьте, что у папки есть текстовое поле field_import_source (его можно открыть по URI admin/structure/types/manage/subj/fields/field_import_source), если поля нет, добавьте его, пройдя по admin/structure/types/manage/subj/fields и выбрав field_import_source среди “Добавить существующее поле”.
- В корневой папке журнала, созданной ранее, в поле field_import_source введите URL сайта журнала. URL должен быть корневым без конечного слеша, примеры: https://ntb.gpntb.ru/jour или https://press.psu.ru/index.php/bio.
- Установите в качестве типа папки (folder_type) серию, в поле серии field_serial введите название серии, как оно заполнено в метаданных на сайте с сохранением регистра.
- Запомните идентификатор ноды (nid) корневой папки журнала. Для URL папки https://elis.example.com/node/1234 идентификатором ноды будет ‘1234’.
- Теперь вы можете произвести импорт с помощью команды drush. Для выполнения команд зайдите на сервер по SSH и перейдите в папку /var/www/vh/library под пользователем elis: # su elis; cd /var/www/vh/library;
- Запустите drush-команду для импорта данных за все время: $ drush elis-ojs-import –nid=1234
- Если вы хотите импортировать за диапазон дат, введите команду: $ drush elis-ojs-import –nid=1234 –from=2022-01-01 –until=2022-02-01
- После запуска команд импорта вы увидите выполнение процесса. Если он завершился без ошибок, можете перейти к автоматическому импорту по расписанию.
- Если вы увидели ошибки, проверьте на сайте в admin/reports/dblog сообщения об ошибках и исправьте их или обратитесь в поддержку.
- Проверьте для импортированных ресурсов все ли впорядке, просмотрев ресурсы в папке. Обратите внимание на навигацию, она строится исходя из указанных volume и issue (том, выпуск) в OJS. Если том не указан, вместо тома может использоваться год. Если volume и issue указаны в OJS с ошибкой, то навигация в ELiS также будет с ошибкой. В таком случае надо вначале исправить описание в OJS, затем можно удалить импортированные в ELiS ресурсы и провести повторный импорт (для этого и удобно ограничивать импорт по датам, чтобы не надо было слишком многое удалять).
- После того, как импорт будет отлажен, можно перейти к автоматическому импорту при вызове 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.
- Если вы хотите, что у импортированных изданий были дополнтиельно добавлены общие термины тегов, классификации или издателя - просто перед импортом заполните эти поля у корневой папки и все что указано в field_publisher, field_tags, field_classification будет скопировано при импорте на импортируемые ресурсы.
- Если метаданные к журналу в 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¶
Известные ограничения интеграции:
- заголовок ноды может выводиться некорректно (на основном языке);
- теги не локализуются (добавляются на всех языках отдельно, вместо локализации отдельных терминов);
- список литературы не локализуется (выводится как есть).