Библиотека 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:

Подключение в интерфейсе PhpStorm

В файле 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;
}

Вышеприведённая программа сгенерирует примерно такую веб-страницу:

example1

В следующей программе создается и отправляется на сервер 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

Команда, выполняемая оператором. Например, ADD или DEL.

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 пробела.

  • Открывающая фигурная скобка в определении класса должна располагаться на новой строке, а закрывающая фигурная скобка должна располагаться на следующей строке после тела класса.

  • Открывающая фигурная скобка в определении метода должна располагаться на новой строке, а закрывающая фигурная скобка должна располагаться на следующей строке после тела метода.

  • Область видимости должна быть указана явно для всех свойств и методов.

  • После ключевых слов в управляющих конструкциях должен располагаться один пробел, а после вызовов функций и методов – не должен.

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