Библиотека PhpIrbis
Библиотека PhpIrbis
Введение
PhpIrbis
представляет собой простую библиотеку для создания клиентских приложений для системы автоматизации библиотек ИРБИС64 на языке PHP.
Пакет не содержит неуправляемого кода и не требует irbis64_client.dll
. Успешно работает на 32-битных и 64-битных версиях операционных систем Windows, MacOS X и Linux.
Основные возможности пакета:
Поиск и расформатирование записей.
Создание и модификация записей, сохранение записей в базе данных на сервере.
Работа с поисковым словарем: просмотр терминов и постингов.
Администраторские функции: получение списка пользователей, его модификация, передача списка на сервер, создание и удаление баз данных.
Пакет состоит из одного файла PhpIrbis.php
и зависит от двух расширений: json
и sockets
, входящих в стандартную поставку PHP.
Поддерживается PHP, начиная с версии 5.4 (как 32-битные, так и 64-битные версии интерпретатора) и сервер ИРБИС64, начиная с 2014. Более ранние версии PHP будут выдавать ошибки, т. к. пакет использует языковые возможности, появившиеся в PHP 5.4. Аналогично обстоит дело и с более ранними версиями сервера ИРБИС64.
ВАЖНО В PhpIrbis
предполагается, что системная кодировка символов PHP – UTF-8. В большинстве случаев это так, но если системная кодировка будет переопределена, то часть строк, участвующих в обмене с сервером, будет испорчена.
Установка
PhpIrbis
можно загрузить с GitHub: [https://github.com/amironov73/PhpIrbis](https://github.com/amironov73/PhpIrbis). Подключение PhpIrbis к своему проекту в этом случае тривиально: достаточно скачать с GitHub файл PhpIrbis.php, положить его рядом с другими файлами с исходным кодом и сослаться на него, например, в директиве require или include:
require_once 'PhpIrbis.php';
Файл PhpIrbis.php
содержит в себе весь необходимый код.
Однако предпочтительным способом является подключение библиотеки PhpIrbis с помощью Composer:

В файле composer.json
достаточно добавить директиву require
, ссылающуюся на пакет amironov73/phpirbis
:
{
"name": "vendor_name/package_name",
"description": "description_text",
"require": {
"amironov73/phpirbis": "dev-master"
}
}
Composer создаёт в файле vendor/autoload.php
автоматический загрузчик классов, которым можно воспользоваться так:
// подключаем сгенерированный загрузчик
require __DIR__ . '/../vendor/autoload.php';
$connection = new Irbis\Connection();
$record = new Irbis\MarcRecord();
// и так далее
Классы и функции пакета PhpIrbis
помещены в пространство имён Irbis
(см. предыдущий пример кода).
Примеры программ
Ниже прилагается пример простой программы. Сначала находятся и загружаются 10 первых библиографических записей, в которых автором является А. С. Пушкин. Показано нахождение значения поля с заданным тегом и подполя с заданным кодом. Также показано расформатирование записи в формат brief
.
ВАЖНО! Обратите внимание, что PhpIrbis
полагается на то, что исходные тексты программ записаны в системной кодировке UTF-8. Поэтому, если кодировка исходных текстов будет отличаться от ожидаемой, литералы будут искажены и программа может перестать работать.
Лучший вариант – избегать употребления в тексте программы литералов с национальными символами. В наших примерах такие литералы употребляются исключительно для простоты изложения.
require_once 'PhpIrbis.php';
try {
// Подключаемся к серверу
$connection = new Irbis\Connection();
$connectString = 'host=127.0.0.1;user=librarian;password=secret;';
$connection->parseConnectionString($connectString);
if (!$connection->connect()) {
echo "Не удалось подключиться!";
echo Irbis\describe_error($connection->lastError);
die(1);
}
// Общие сведения о сервере
echo "<p>Версия сервера: <b>{$connection->serverVersion}</b><br/>";
echo "Интервал: <b>{$connection->interval}</b> мин.<br/>";
// Из INI-файла можно получить настройки для клиента
$ini = $connection->iniFile;
$dbnnamecat = $ini->getValue('Main', 'DBNNAMECAT');
echo "DBNNAMECAT: <b>{$dbnnamecat}</b></p>\n";
// Получаем список доступных баз данных
$databases = $connection->listDatabases('1..' . $dbnnamecat);
echo "<p>Имеются базы данных: <b>" . implode(', ', $databases) . "</b></p>\n";
// Находим записи с автором "Пушкин"
$found = $connection->search('"A=Пушкин$"');
echo "<p>Всего найдено записей: " . count($found) . "</p>\n";
if (count($found) > 10) {
// Ограничиваемся первыми 10 записями
$found = array_slice($found, 0, 10);
}
foreach ($found as $mfn) {
// Считываем запись с сервера
$record = $connection->readRecord($mfn);
// Получаем значение поля/подполя
$title = $record->fm(200, 'a');
echo "<p><b>Заглавие:</b> {$title}<br/>";
// Расформатируем запись на севере
$description = $connection->formatRecord('@brief', $mfn);
echo "<b>Биб. описание:</b> {$description}</p>\n";
}
// Отключаемся от сервера
$connection->disconnect();
}
catch (Exception $exception) {
echo "ОШИБКА: " . $exception;
}
Вышеприведённая программа сгенерирует примерно такую веб-страницу:

В следующей программе создается и отправляется на сервер 10 записей. Показано добавление в запись полей с подполями.
require_once 'PhpIrbis.php';
try {
// Подключаемся к серверу
$connection = new Irbis\Connection();
$connectString = 'host=127.0.0.1;user=librarian;password=secret;';
$connection->parseConnectionString($connectString);
if (!$connection->connect()) {
echo "Не удалось подключиться!";
echo Irbis\describe_error($connection->lastError);
die(1);
}
// Записи будут помещаться в базу SANDBOX
$connection->database = 'SANDBOX';
for ($i = 0; $i < 10; $i++) {
// Создаем запись
$record = new Irbis\MarcRecord();
// Наполняем ее полями: первый автор (поле с подолями),
$record->add(700)
->add('a', 'Миронов')
->add('b', 'А. В.')
->add('g', 'Алексей Владимирович');
// заглавие (поле с подполями),
$record->add(200)
->add('a', "Работа ИРБИС64: версия {$i}.0")
->add('e', 'руководство пользователя');
// выходные данные (поле с подполями),
$record->add(210)
->add('a', 'Иркутск')
->add('c', 'ИРНИТУ')
->add('d', '2018');
// рабочий лист (поле без подполей).
$record->add(920, 'PAZK');
// Отсылаем запись на сервер.
// Обратно приходит запись,
// обработанная AUTOIN.GBL.
$connection->writeRecord($record);
// Распечатываем обработанную запись
echo '<p>' . $record->encode('<br/>') . '</p>';
}
// Отключаемся от сервера
$connection->disconnect();
}
catch (Exception $exception) {
echo "ОШИБКА: " . $exception;
}
Класс Connection
Класс Connection - “рабочая лошадка”. Он осуществляет связь с сервером и всю необходимую перепаковку данных из клиентского представления в сетевое.
Экземпляр клиента создается конструктором:
$connection = new Irbis\Connection();
При создании клиента можно указать (некоторые) настройки:
$client = new Irbis\Connection();
$client->host = 'irbis.rsl.ru';
$client->port = 5555;
$client->username = 'ninja';
$client->password = 'i_am_invisible';
Поле |
Тип |
Назначение |
Значение по умолчанию |
---|---|---|---|
host |
string |
Адрес сервера |
‘127.0.0.1’ |
port |
integer |
Порт |
6666 |
username |
string |
Имя (логин) пользователя |
пустая строка |
password |
string |
Пароль пользователя |
пустая строка |
database |
string |
Имя базы данных |
‘IBIS’ |
workstation |
string |
Тип АРМа (см. таблицу ниже) |
‘C’ |
Типы АРМов
Обозначение |
Тип |
---|---|
‘R’ |
Читатель |
‘C’ |
Каталогизатор |
‘M’ |
Комплектатор |
‘B’ |
Книговыдача |
‘K’ |
Книгообеспеченность |
‘A’ |
Администратор |
Можно использовать мнемонические константы, определённые в PhpIrbis:
const ADMINISTRATOR = 'A'; // Адмнистратор
const CATALOGER = 'C'; // Каталогизатор
const ACQUSITIONS = 'M'; // Комплектатор
const READER = 'R'; // Читатель
const CIRCULATION = 'B'; // Книговыдача
const BOOKLAND = 'B'; // Книговыдача
const PROVISITON = 'K'; // Книгообеспеченность
Обратите внимание, что адрес сервера задается строкой, так что может принимать как значения вроде 192.168.1.1
, так и irbis.yourlib.com
.
Если какой-либо из вышеперечисленных параметров не задан явно, используется значение по умолчанию.
Подключение к серверу и отключение от него
Только что созданный клиент еще не подключен к серверу. Подключаться необходимо явно с помощью метода connect
, при этом можно указать параметры подключения:
$client = new Irbis\Connection();
$client->host = 'myhost.com';
if (!$client->connect()) {
echo "Не удалось подключиться!";
die(1);
}
Отключаться от сервера можно двумя способами: во-первых, с помощью метода disconnect
:
$client->disconnect();
во-вторых, клиент автоматически отключается от сервера при уничтожении экземпляра класса:
unset($client); // Происходит неявный вызов disconnect()
При подключении клиент получает с сервера INI-файл с настройками, которые могут понадобиться в процессе работы:
$client->connect();
// Получаем имя MNU-файла, хранящего перечень форматов
$formatMenuName = $client->iniFile->getValue('Main', 'FmtMnu', 'FMT31.MNU');
Полученный с сервера INI-файл хранится в поле iniFile
.
Повторная попытка подключения с помощью того же экземпляра Irbis\Connection
игнорируется. При необходимости можно создать другой экземпляр и подключиться с его помощью (если позволяют клиентские лицензии). Аналогично игнорируются повторные попытки отключения от сервера.
Проверить статус “клиент подключен или нет” можно с помощью метода isConnected
:
if (!$client->isConnected()) {
// В настоящее время мы не подключены к серверу
}
Вместо индивидуального задания каждого из полей host
, port
, username
, password
и database
, можно использовать метод parseConnectionString
:
$client->parseConnectionString('host=192.168.1.4;port=5555;' .
'username=itsme;password=secret;');
$client->connect();
Многопоточность
Клиент написан в наивном однопоточном стиле, поэтому не поддерживает одновременный вызов методов из разных потоков.
Для одновременной отсылки на сервер нескольких команд необходимо создать соответствующее количество экземпляров подключений (если подобное позволяет лицензия сервера).
Подтверждение подключения
PhpIrbis
самостоятельно не посылает на сервер подтверждений того, что клиент все еще подключен. Этим должно заниматься приложение, например, по таймеру.
Подтверждение посылается серверу методом noOp
:
$client->noOp();
Чтение записей с сервера
$mfn = 123;
$record = $client->readRecord($mfn);
Можно прочитать несколько записей сразу:
$mfns = array(12, 34, 56);
$records = $client->readRecords($mfns);
Можно прочитать определенную версию записи
$mfn = 123;
$version = 3;
$record = $client->readRecordVersion($mfn, $version);
Сохранение записи на сервере
// Любым образом создаём или получаем с сервера запись.
$record = $client->readRecord(123);
// Производим какие-то манипуляции над записью
$record->add(999, '123');
// Отсылаем запись на сервер
$newMaxMfn = $client->writeRecord($record);
echo "New MaxMFN: $newMaxMfn";
Сохранение нескольких записей (возможно, из разных баз данных):
$records = array();
...
if (!$client->writeRecords($records))) {
echo "Failure!";
}
Удаление записи на сервере
$mfn = 123;
$client->deleteRecord($mfn);
Восстановление записи:
$mfn = 123;
$record = $client->undeleteRecord($mfn);
Поиск записей
$found = $client->search('"A=ПУШКИН$"');
echo "Найдено записей: " . count($found);
Обратите внимание, что поисковый запрос заключен в дополнительные кавычки. Эти кавычки явлются элементом синтаксиса поисковых запросов ИРБИС64, и лучше их не опускать.
Вышеприведённый запрос вернёт не более 32 тыс. найденных записей. Сервер ИРБИС64 за одно обращение к нему может выдать не более 32 тыс. записей. Чтобы получить все записи, используйте метод searchAll (см. ниже), он выполнит столько обращений к серверу, сколько нужно.
Поиск с одновременной загрузкой записей:
$records = $client->searchRead('"A=ПУШКИН$"', 50);
echo "Найдено записей: " . count($records);
Поиск и загрузка единственной записи:
$record = $client->searchSingleRecord('"I=65.304.13-772296"');
if (!$record) {
echo 'Не нашли!';
}
Количество записей, соответствующих поисковому выражению:
$expression = '"A=ПУШКИН$"';
$count = $client->searchCount($expression);
Расширенный поиск: можно задать не только количество возвращаемых записей, но и расформатировать их.
$parameters = new Irbis\SearchParameters();
$parameters->expression = '"A=ПУШКИН$"';
$parameters->format = BRIEF_FORMAT;
$parameters->numberOfRecords = 5;
$found = $client->searchEx($parameters);
if (!$found) {
echo 'Не нашли';
} else {
// в $found находится массив FoundLine
$first = $found[0];
echo "<p>MFN: {$first->mfn}, DESCRIPTION: {$first->description}</p>";
}
Поиск всех записей (даже если их окажется больше 32 тыс.):
$found = $client->searchAll('"A=ПУШКИН$"');
echo "Найдено записей: " . count($found);
Подобные запросы следует использовать с осторожностью, т. к. они, во-первых, создают повышенную нагрузку на сервер, и во-вторых, потребляют очень много памяти на клиенте. Некоторые запросы (например, “I=$”) могут вернуть все записи в базе данных, а их там может быть десятки миллионов.
Форматирование записей
$mfn = 123;
$format = BRIEF_FORMAT;
$text = $client->formatRecord($format, $mfn);
echo '<p>Результат форматирования: ' . $text . '</p>';
При необходимости можно использовать в формате все символы UNICODE:
$mfn = 123;
$format = "'Ἀριστοτέλης: ', v200^a";
$text = $client->formatRecord($format, $mfn);
echo '<p>Результат форматирования: ' . $text . '</p>';
Форматирование нескольких записей:
$mfns = array ( 12, 34, 56 );
$format = BRIEF_FORMAT;
$lines = $client->formatRecords($format, $mfns);
echo '<p>Результаты:<br/>' . implode('<br/>', $lines) . '</p>';
Печать таблиц
$table = new Irbis\TableDefinition();
$table->database = 'IBIS';
$table->table = '@tabf1w';
$table->searchQuery = '"T=A$"';
$text = $client->printTable($table);
Работа с контекстом
Контекст в данном случае – файлы обвязки, хранящиеся на сервере ИРБИС64 (форматы, меню и проч.).
Функция |
Назначение |
---|---|
listFiles |
Получение списка файлов на сервере |
readIniFile |
Получение INI-файла с сервера |
readMenuFile |
Получение MNU-файла с сервера |
readSearchScenario |
Загрузка сценариев поиска с сервера |
readTextFile |
Получение текстового файла с сервера |
readTextLines |
Получение текстового файла в виде массива строк |
readTreeFile |
Получение TRE-файла с сервера |
updateIniFile |
Обновление строк серверного INI-файла |
writeTextFile |
Сохранение текстового файла на сервере |
Работа с мастер-файлом
Функция |
Назначение |
---|---|
readRawRecord |
Чтение указанной записи в “сыром” виде |
writeRawRecord |
Сохранение на сервере “сырой” записи |
Работа со словарем
Функция |
Назначение |
---|---|
getRecordPostings |
Массив постингов для указанных MFN и префикса |
listTerms |
Получение списка терминов с указанным префиксом |
readPostings |
Чтение постингов поискового словаря |
readTerms |
Чтение терминов поискового словаря |
readTermsEx |
Расширенное чтение терминов |
Информационные функции
Функция |
Назначение |
---|---|
getDatabaseInfo |
Получение информации о базе данных |
getMaxMfn |
Получение максимального MFN для указанной базы данных |
getServerVersion |
Получение версии сервера |
listDatabases |
Получение списка баз данных с сервера |
toConnectionString |
Получение строки подключения |
Администраторские функции
Нижеперечисленные записи доступны лишь из АРМ “Администратор”, поэтому подключаться к серверу необходимо так:
$client = new Irbis\Connection();
$client->username = 'librarian';
$client->password = 'secret';
$client->workstation = ADMINISTRATOR;
if (!$client->connect()) {
echo 'Не удалось подключиться!';
die(1);
}
Функция |
Назначение |
---|---|
actualizeDatabase |
Актуализация базы данных |
actualizeRecord |
Актуализация записи |
createDatabase |
Создание базы данных |
createDictionary |
Создание словаря |
deleteDatabase |
Удаление базы данных |
deleteFile |
Удаление файла на сервере |
getServerStat |
Получение статистики с сервера |
getUserList |
Получение списка пользователей с сервера |
listProcesses |
Получение списка серверных процессов |
reloadDictionary |
Пересоздание словаря |
reloadMasterFile |
Пересоздание мастер-файла |
restartServer |
Перезапуск сервера |
truncateDatabase |
Опустошение базы данных |
unlockDatabase |
Разблокирование базы данных |
unlockRecords |
Разблокирование записей |
updateUserList |
Обновление списка пользователей на сервере |
Расширение функциональности
executeAnyCommand(string $command, array $params) – выполнение произвольной команды с параметрами в кодировке ANSI.
Классы MarcRecord, RecordField и SubField
MarcRecord
Каждый экземпляр класса MarcRecord
соответствует одной записи в базе данных ИРБИС. Он содержит следующие поля:
Поле |
Тип |
Назначение |
---|---|---|
database |
string |
Имя базы данных, из которой загружена данная запись. Для вновь созданных записей пустая строка |
mfn |
integer |
Номер записи в мастер-файле. Для вновь созданных записей 0 |
status |
integer |
Статус записи: логически удалена, отсутствует (см. ниже) |
version |
integer |
Номер версии записи |
fields |
array |
Массив полей записи |
Статус записи: набор флагов (определены как константы в PhpIrbis
)
Имя |
Число |
Значение |
---|---|---|
LOGICALLY_DELETED |
1 |
Логически удалена (может быть восстановлена) |
PHYSICALLY_DELETED |
2 |
Физически удалена (не может быть восстановлена) |
ABSENT |
4 |
Отсутствует |
NON_ACTUALIZED |
8 |
Не актуализирована |
LAST |
32 |
Последняя версия записи |
LOCKED |
64 |
Запись заблокирована на ввод |
add($tag, $value=’’) – добавляет в конец записи поле с указанными меткой и значением. Возвращает добавленное поле, поэтому может использоваться для “цепочечных” вызовов методов, добавляющих подполя в это поле (см. пример ниже).
clear() – очищает запись (удаляет все поля). Возвращает $this
.
decode(array $lines) – декодирование записи из протокольного представления.
encode($delimiter) – кодирование записи в протокольное представление.
fm($tag, $code=’’) – получение значения поля (или подполя, если задан $code
) с указанной меткой. Если поле (или подполе) не найдено, возвращает null
.
fma($tag, $code=’’) – получение массива значений полей (или подполей, если задан $code
) с указанной меткой. Если поля (или подполя) не найдены, возвращает пустой массив.
getField($tag, $occurrence=0) – получение поля с указанной меткой (с учётом повторения). Если поле не найдено, возвращает null
.
getFields($tag) – получение массива полей с указанной меткой. Если поля не найдены, возвращается пустой массив.
insertAt($index, RecordField $field) – вставка поля в указанную позицию.
isDeleted() – проверка статуса, не удалена ли запись.
removeAt($index) – удаление поля по указанному индексу.
removeField($tag) – удаление всех полей с указанной меткой.
reset() – сброс состояния записи, отвязка её от базы данных. Поля данных остаются при этом нетронутыми. Возвращает $this
.
verify($throw=true) – проверяет, правильно ли сформирована запись (и все её подполя). При обнаружении ошибки бросает исключение, если $throw==true
.
$record = new Irbis\MarcRecord();
$record->add(700)
->add('a', 'Миронов')
->add('b', 'А. В.')
->add('g', 'Алексей Владимирович');
$record->add(200)
->add('a', 'Заглавие книги');
RecordField
Поле |
Тип |
Назначение |
---|---|---|
tag |
integer |
Метка поля |
value |
string |
Значение поля до первого разделителя |
subfields |
array |
Массив подполей |
__construct($tag=0, $value=’’) – конструктор поля.
add($code, $value) – добавляет подполе с указанными кодом и значением к полю. Возвращает $this
, так что может испольоваться для “цепочечных” вызовов.
clear() – очищает поле (удаляет значение и все подполя). Возвращает $this
.
decode($line) – декодирование поля из протокольного представления.
getEmbeddedFields() – получает массив встроенных полей из данного поля.
getFirstSubfield($code) – возвращает первое вхождение подполя с указанным кодом или null
.
getFirstSubfieldValue($code) – возвращает значение первого вхождения подполя с указанным кодом или пустую строку.
insertAt($index, SubField $subfield) – вставка подполя в указанную позицию.
removeAt($index) – удаление подполя по указанному индексу.
removeSubfield($code) – удаление всех подполей с указанным кодом.
verify($throw=true) – проверяет, правильно ли сформировано поле (и все его подполя). При обнаружении ошибки бросает исключение, если $throw==true
.
$field = new Irbis\RecordField(700);
$field->add('a', 'Миронов')
->add('b', 'А. В.')
->add('g', 'Алексей Владимирович');
SubField
Поле |
Тип |
Назначение |
---|---|---|
code |
string |
Код подполя (один символ!) |
value |
string |
Значение подполя |
__construct($code=’’, $value=’’) – конструктор подполя.
verify($throw=true) – проверяет, правильно ли сформировано подполе. При обнаружении ошибки бросает исключение, если $throw==true
.
$subfield = new Irbis\SubField('a', 'Подполе A');
RawRecord
Запись с нераскодированными полями/подполями.
Поле |
Тип |
Назначение |
---|---|---|
database |
string |
Имя базы данных, из которой загружена данная запись. Для вновь созданных записей пустая строка |
mfn |
integer |
Номер записи в мастер-файле. Для вновь созданных записей 0 |
status |
integer |
Статус записи: логически удалена, отсутствует (см. ниже) |
version |
integer |
Номер версии записи |
fields |
array |
Массив полей записи в “сыром” виде |
Прочие (вспомогательные) классы и функции
FoundLine
Строка найденной записи, может содержать результат расформатирования найденной записи.
IniFile, IniSection и IniLine
INI-файл, состоящий из секций, которые в свою очередь состоят из строк вида “ключ=значение”.
TreeFile и TreeLine
TRE-файл – древовидный справочник.
DatabaseInfo
Информация о базе данных ИРБИС.
ProcessInfo
Информация о запущенном на ИРБИС-сервере процессе.
VersionInfo
Информация о версии ИРБИС-сервера.
ClientInfo
Информация о клиенте, подключенном к серверу ИРБИС (не обязательно о текущем).
UserInfo
Информация о зарегистрированном пользователе системы (по данным client_m.mnu
).
TableDefinition
Данные для метода printTable
.
ServerStat
Статистика работы ИРБИС-сервера.
PostingParameters
Параметры для запроса постингов с сервера.
TermParameters
Параметры для запроса терминов с сервера.
TermInfo
Информация о термине поискового словаря.
TermPosting
Постинг термина в поисковом индексе.
SearchParameters
Параметры для поиска записей (метод searchEx).
SearchScenario
Сценарий поиска.
ParFile
PAR-файл – содержит пути к файлам базы данных ИРБИС.
OptFile и OptLine
OPT-файл – файл оптимизации рабочих листов и форматов показа.
GblStatement и GblSettings
Классы для глобальной корректировки базы данных.
ClientQuery
Клиентский запрос. Инфраструктурный класс.
ServerResponse
Ответ сервера. Инфраструктурный класс.
Построитель запросов
Класс Search
представляет собой построитель запросов в синтаксисе прямого поиска ИРБИС64. В нём имеются следующие статические методы:
all() – отбор всех документов в базе. Фактически строит запрос
I=$
.equals($prefix, …) – поиск по совпадению с одним из перечисленных значений. Возвращает построитель запросов для последующих цепочечных вызовов.
Экземплярные методы:
and_(….) – логическое И. Возвращает построитель запросов для последующих цепочечных вызовов.
not_($text) – логическое НЕ. Возвращает построитель запросов для последующих цепочечных вызовов.
or_(…) – логическое ИЛИ. Возвращает построитель запросов для последующих цепочечных вызовов.
sameField(…) – логический оператор “в том же поле”. Возвращает построитель запросов для последующих цепочечных вызовов.
sameRepeat(…) – логический оператор “в том же повторении поля”. Возвращает построитель запросов для последующих цепочечных вызовов.
Пример:
$expression = (string) Search::equals('TJ=', 'Аврора',
'Новый мир')->and_(Search::equals('G=', '199$', '200$'));
Поскольку вышеприведённый синтаксис довольно громоздкий, предоставляются следующие функции, значительно упрощающие формирование запроса:
Функция |
Поиск по |
---|---|
author |
автору |
bbk |
индексу ББК |
document_kind |
виду документа |
keyword |
ключевым словам |
language |
языку текста |
magazine |
заглавию журнала |
mhr |
месту хранения |
number |
инвентарному номеру |
place |
месту издания (городу) |
publisher |
издательству |
rzn |
разделу знаний |
subject |
предметной рубрике |
title |
заглавию |
udc |
индексу УДК |
year |
году издания |
Пример применения построителя с упрощённым формированием запроса:
$client = new Irbis\Connection();
$client->host = 'irbis.server';
$client->port = 5555;
$client->username = 'ninja';
$client->password = 'i_am_invisible';
$client->connect();
$expression = Irbis\author('Пушкин$')->and_(Irbis\title('СКАЗКИ$'));
$found = $client->searchCount($expression);
echo "Найдено: ", $found;
$client->disconnect();
Глобальная корректировка
Глобальная корректировка (ГК) позволяет применить изменения сразу к нескольким записям в базе данных (даже ко всей базе в целом). Это очень мощный инструмент, который следует использовать с осторожностью.
Документация по глобальной корректировке доступна на сайте http://sntnarciss.ru/irbis/spravka/pril00701000000.htm
Операторы ГК
Глобальная корректировка состоит из отдельных операторов. Каждый оператор выполняет одно действие, например, добавляет в запись поле или подполе, заменяет одну строку на другое и т. д. Также существуют составные операторы, которые включают в себя несколько операторов (например, условный оператор, который в зависимости от выполнения определённых условий исполняет или нет группу операторов).
Оператор ГК в PhpIrbis
воплощён в классе GblStatement
, включающем в себя следующие поля:
Поле |
Тип |
Назначение |
---|---|---|
command |
string |
Команда, выполняемая оператором. Например, |
parameter1 |
string |
Первый параметр, как правило, спецификация поля/подполя. |
parameter2 |
string |
Второй параметр, как правило, спецификация повторения. |
format1 |
string |
Первый формат, например, выражение для замены. |
format2 |
string |
Второй формат, например, заменяющее выражение. |
Класс GblStatement
снабжен конструктором:
/**
* GblStatement constructor.
*
* @param string $command Команда.
* @param string $parameter1 Параметр 1.
* @param string $parameter2 Параметр 2.
* @param string $format1 Формат 1.
* @param string $format2 Формат 2.
*/
public function __construct($command,
$parameter1 = 'XXXXXXXXX',
$parameter2 = 'XXXXXXXXX',
$format1 = 'XXXXXXXXX',
$format2 = 'XXXXXXXXX')
Лишние (не нужные для данной команды) параметры можно не задавать, они автоматически будут заполнены символом
X
.
Пример инициализации операторов ГК (формат немного сокращен для читаемости):
$statements = array (
new GblStatement ('ADD', '920', 'XXXX', 'ATHRA'),
new GblStatement ('DEL', '1007', '1'),
new GblStatement ('REP', '330^f', 'F', "(if p(v330) then if p(v330^f) then ... fi/)")
);
Настройки ГК
Настроек для ГК довольно много, поэтому они собраны в класс GblSettings
, предоставляющий следующий поля:
Поле |
Тип |
Назначение |
---|---|---|
actualize |
bool |
Актуализировать записи? |
autoin |
bool |
Запускать autoin.gbl? |
database |
string |
Имя базы данных, на которой будет выполняться ГК. |
filename |
string |
Имя файла на сервере, хранящего сценарий ГК. |
formalControl |
string |
Применять формальный контроль? |
lowerBound |
int |
Нижняя граница MFN для поиска обрабатываемых записей. |
maxMfn |
int |
Максимальный MFN. |
mfnList |
array |
Массив явно заданных MFN, на которых будет выполняться ГК. |
minMfn |
int |
Минимальный MFN. 0 означает “все записи в базе”. |
parameters |
array |
(Опциональные) параметры ГК. |
searchExpression |
string |
Поисковое выражение отбора записей по словарю. |
sequentialExpression |
string |
Выражение для отбора записей последовательным поиском (опциональное). |
statements |
array |
Массив операторов. |
upperBound |
int |
Верхняя граница MFN для поиска обрабатываемых записей. |
Если какая-либо из настроек не задана, она принимает (разумное) значение по умолчанию. Абсолютно необходимым является задание массива операторов, т. к. иначе ГК не имеет смысла.
Простой пример выполнения ГК
$settings = new Irbis\GblSettings();
$settings->database = 'IBIS';
$settings->mfnList = array(1, 2, 3);
$settings->statements = array (
new Irbis\GblStatement(ADD_FIELD, '3000', 'XXXXXXXXX', "'Hello'")
);
$result = $connection->globalCorrection($settings);
foreach($result as $line) {
echo "<br/>$line";
}
Построитель ГК
Для более удобного формирования массива операторов ГК можно применять класс Gbl
, вынесенный в файл Gbl.php
. В частности, с его помощью довольно наглядно (за счёт отступов) формируются вложенные группы операторов.
Предоставляются следующие методы:
Метод |
Назначение |
---|---|
add |
Добавление нового повторения поля в заданное (существующее или нет) поле. |
all |
Дополняет записи всеми полями текущей записи. |
build |
Выдача настроек ГК по заданным значениям. |
change |
Замена данных в поле или в подполе. |
changeWithCase |
Замена данных в поле или в подполе с учётом регистра символов. |
comment |
Комментарий. Может находиться между другими операторами и содержать любой текст. |
correct |
Из текущей записи вызывает на корректировку другие записи, отобранные по поисковым терминам из текущей или другой базы данных. |
delete |
Удаляет поле или подполе. |
deleteRecord |
Удаляет записи, поданные на корректировку. Не требует никаких дополнительных данных. |
empty_ |
Очищает (опустошает) текущую запись. |
if_ |
Определяет условие выполнения операторов, следующих за ним. |
newMfn |
Создаёт новую запись в текущей или другой базе данных. |
parameter |
Задание параметра ГК. |
putlog |
Формирование пользовательского протокола. |
repeat |
Организует цикл выполнения группы операторов. |
replace |
Замена целиком поля или подполя на новое значение. |
statement |
Добавление произвольного оператора к ГК. |
undelete |
Восстанавливает удалённые записи. |
undo |
Переход к одной из предыдущих копий записи. |
Пример применения построителя.
$gbl = new \Irbis\Gbl();
$gbl->parameter('mhr.mnu', 'Укажите место хранения')
->comment('Это комментарий в начале')
->newMfn("'TEST'",
(new \Irbis\Gbl())->add(700, "'^AἈριστοτέλης'")
->add(200, "'^Aアリストテレス'")
->add(300, "'Пробная запись'")
->add(920, "'PAZK'")
)
->comment('Это комментарий в конце');
$settings = $gbl->build();
$settings->database = 'IBIS';
$result = $connection->globalCorrection($settings);
Сформированные настройки выдаются методом build
.
Поиск для чайников
Класс IrbisTeapot поддерживает так называемый “поиск для чайников”, т. е. запрос на языке, максимально приближенном к естественному, когда Web-приложение пытается самостоятельно найти документы, удовлетворяющие запросу.
Класс Teapot
предоставляет следующие поля для настройки:
Поле |
Тип |
Назначение |
---|---|---|
prefixes |
array |
Массив префиксов для терминов (см. ниже). |
suffix |
string |
Суффикс для терминов (по умолчанию |
settings |
RelevanceSettings |
Настройки для оценки релевантности (см. ниже). |
limit |
int |
Максимальное количество возвращаемых записей. |
По умолчанию используются следующий набор префиксов:
Префикс |
Поисковый атрибут |
---|---|
A= |
Индивидуальный автор/редактор |
T= |
Поиск по заглавию |
M= |
Коллективный автор (например, конференция) |
K= |
Ненормированное ключевое слово |
Суффикс может иметь любое из следующих значений
Суффикс |
Значение |
---|---|
‘’ |
Пустая строка означает точное совпадение |
‘$’ |
Совпадение с точностью до конца термина |
‘@’ |
Поиск с учетом русской морфологии |
Класс RelevanceSettings
содержит следующие поля
Поле |
Тип |
Назначение |
---|---|---|
coefficients |
array |
Массив коэффициентов релевантности (см. ниже). |
extraneous |
double |
Релевантность для упоминаний в посторонних полях (по умолчанию 1). |
multiplier |
double |
Мультипликатор для случая полного совпадения (по умолчанию 2). |
Класс RelevanceCoefficient
предназначен для хранения коэффициентов релевантности и содержит следующие поля
Поле |
Тип |
Назначение |
---|---|---|
fields |
array |
Массив меток полей, для которых действует данный коэффициент. |
value |
double |
Собственно значение коэффициента. |
По умолчанию используется следующий набор коэффициентов для библиографической базы IBIS
Метки полей |
Коэффициент |
Назначение поля |
---|---|---|
ЗАГЛАВИЕ ИЛИ АВТОРЫ |
||
200 |
10 |
Основное заглавие |
700, 701 |
10 |
Индивидуальные авторы |
710, 711, 971, 972 |
10 |
Коллективные авторы |
923 |
10 |
Выпуск, часть |
922 |
10 |
Статья сборника |
925 |
10 |
Несколько томов в одной книге |
961 |
10 |
Индивидуальные авторы |
962 |
10 |
Коллективные авторы в общей части |
461 |
10 |
Заглавие общей части |
463 |
10 |
Издание, в котором опубликована статья |
РЕДАКТОРЫ |
||
702 |
7 |
Редакторы |
ПРОЧИЕ ЗАГЛАВИЯ |
||
510 |
7 |
Параллельное заглавие |
517 |
7 |
Разночтение заглавия |
541 |
7 |
Перевод заглавия |
924 |
7 |
“Другое” заглавие |
921 |
7 |
Транслитерированное заглавие |
СОДЕРЖАНИЕ |
||
330 |
6 |
Оглавление |
922 |
6 |
Статья из журнала |
РУБРИКИ |
||
606 |
5 |
Предметная рубрика |
607 |
5 |
Географическая рубрика |
600, 601 |
5 |
Персоналия |
965 |
5 |
Дескриптор |
СЕРИЯ |
||
225 |
4 |
Серия |
КЛЮЧЕВЫЕ СЛОВА |
||
610 |
3 |
Ненормированное ключевое слово |
331 |
3 |
Аннотация |
При необходимости настройки для оценки релевантности можно загрузить из json-файла с помощью метода RelevanceSettings::load($filename)
.
Стандарт кодирования
См. https://www.php-fig.org/psr/psr-1/ и https://www.php-fig.org/psr/psr-2/
В файлах должны использоваться только теги
<?php
и<?=
.Файлы должны быть в кодировке UTF-8 без BOM.
Файлы должны либо декларировать символы (классы, функции, константы и т. д.) либо вызывать побочные эффекты (например, вывод HTML или изменение INI-файлов), но не то и другое одновременно.
Пространства имён и классы должны соответствовать “автозагрузочным” PSR (PSR-0, PSR-4). В конечном итоге это означает, что каждый класс должен располагаться в отдельном файле и в пространстве имён с хотя бы одним верхним уровнем (именем производителя).
Имена классов должны быть PascalCase.
Имена констант в классах должны быть В_ВЕРХНЕМ_РЕГИСТРЕ_С_ПОДЧЁРКИВАНИЯМИ.
Имена методов должны быть camelCase.
Отступы 4 пробела.
Открывающая фигурная скобка в определении класса должна располагаться на новой строке, а закрывающая фигурная скобка должна располагаться на следующей строке после тела класса.
Открывающая фигурная скобка в определении метода должна располагаться на новой строке, а закрывающая фигурная скобка должна располагаться на следующей строке после тела метода.
Область видимости должна быть указана явно для всех свойств и методов.
После ключевых слов в управляющих конструкциях должен располагаться один пробел, а после вызовов функций и методов – не должен.
Открывающая фигурная скобка в управляющих конструкциях должна располагаться в той же строке, что и сама конструкция, а закрывающая фигурная скобка должна располагаться на следующей строке после тела конструкции.