Введение
Материал посвящен разработке компонентов, использующих не только внутренний интерфейс Joomla(является основой J-ИРБИС), но и программный интерфейс работы с базами данных стандарта ИРБИС. Он ориентирован на программистов с минимальными знаниями PHP, HTML и ИРБИС(на уровне пользователя). И его цель – доказать, что самостоятельное дополнение библиотечного сайта J-ИРБИС – элементарная задача.
В значительной степени это утверждение стало возможно правомерным благодаря гениальной идее Ильи Михайленко, которая заключается в представлении записей ИРБИС как объектов с набором методов. И хотя предлагаемый интерфейс внутренне имеет уже мало общего с тем, который сегодря используется Ильёй для ИРБИС 128, синтаксис работы с записью в них является очень похожим. Поэтому основные навыки, полученные при работе с J-ИРБИС, можно будет использовать в дальнейшем для тюнинга ИРБИС 128.
Разбор принципов работы компонента будет выполняться на примере компонента com_printdisc(пример работы здесь: [
elib.nwpi.ru]). Его основные файлы приложены к данному сообщению, но полностью, вместе с интерфейсом работы с БД ИРБИС, он предосталвяется только пользователям J-ИРБИС. Настоятельно рекомендуется применить компонент как шаблон, который нужно заполнить своим кодом. Написание собственного компонента «с нуля» абсолютно нецелсообразно.
Интерфейс работы с БД
Интерфейс подключается строкой:
require_once("$mosConfig_absolute_path/includes/irbis_api/lib/jwrapper.php");
Далее должен создаваться объект интерфейса($irb):
$irb=new jwrapper();
После этого одними и теми же функциями независимо от поколения ИРБИС(32 или 64) можно читать и писать в любую базу каталога.
Пример поиска записей, их расформатирования и вывода с использованием краткого формата библиографического описания:
$bo_list=$irb->search_list('IBIS','(<.>T=история россии<.>)','','brief');
echo $bo_list;
Поиск выполняется в базе IBIS по заглавию «история».
Результат будет выглядеть приблизительно так:
Ассэль Г. История России : принципы и стратегия [Текст] : учебник для вузов / Г. Ассэль ; [под ред. В. Н. Калгина ; пер. с англ. М. З. Штернгарца], 2001. - 803 с.
Голованов М. Е. История России [Текст] : руководство разработчика / М. Е. Голованов, Е. О. Веселов, 2004. - 320 с.
Пример поиска записей и найденной записи:
$records=$irb->FindRecords('IBIS',' (<.>T=история россии<.>)');
$records – массив с объектами, хранящими найденные ИРБИС-записи.
Представим себе, что $one_record – одна запись БД ИРБИС, представленная в виде объекта.
Тогда:
1. Вывод второго повторения поля поля 610: echo $one_record->GetField(610,2);
2. Вывод MFN записи $one_record: echo $one_record->mfn;
3. Вывод первого повторения подполя 200^a: echo $one_record->GetSubField(200,1,'A');
Комментированный файл printdisc.php
Внимание! Файл приложен к сообщению. Его рекомендуется просматривать в редакторе с подсветкой!
<?
// Стандартная защита всех файлов Joomla. Не менять.
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
// Подключение файла printdisc.html.php, куда согласно неписанным правилам принято помещать основной код вывода HTML. Вместо printdisc автоматически подставляется название компонента.
require_once($mainframe->getPath( 'front_html' ));
// Подключение интерфейса доступа к БД ИРБИС
require_once("$mosConfig_absolute_path/includes/irbis_api/lib/jwrapper.php");
// Определение базовой директории компонента
$basepath="$mosConfig_absolute_path/components/com_printdisc";
// Получение параметров запроса.
$task = mosGetParam( $_REQUEST, 'task', '' ); // Текущая задача. См. ниже.
$req = mosGetParam( $_REQUEST, 'req', '' ); // Запрос на языке ИРБИС или в виде набора идентификаторов дицсиплин, разделённых *
$kaf = mosGetParam( $_REQUEST, 'kaf', '' ); // Аббревиатура кафедры
// Чтение MNU кафедр в ассоциированный массив. Функция mnu_read находится в файле u.php Файл является частью интерфейса
// Результат: $mnu=array(ключ=>значение,...)
$mnu=u::mnu_read($mosConfig_absolute_path.'/!irbis/Common_PFT/kafch.mnu');
// Добавление кода в <header>. В данном случае подключаются скрипты и стили.
$header_tags=<<<H
<script type="text/javascript" language="JavaScript">
var irbis_no_mnu="$mosConfig_live_site/index2.php?option=com_printdisc&Itemid=$Itemid";
</script>
<script type="text/javascript" language="JavaScript" src="$mosConfig_live_site/components/com_printdisc/scripts.js"></script>
<link href="$mosConfig_live_site/components/com_printdisc/styles.css" type="text/css" rel="stylesheet" / >
H;
$mainframe->addCustomHeadTag($header_tags);
// если в параметрах компонента не задана база каталога....
// Массив $params заполняется значениями полей формы настройки компонента, которая должна быть заполнена пользователем.
// Форма настройки формируется на основе файла printdisc.xml(<params>)
if (empty($params['main_base']))
mosErrorAlert('Необходимо заполнить поле "Основная база каталога с книгообеспеченностью" в параметрах компонента!');
switch( $task ) {
case 'discs': // Показ списка дициплин выбранной кафедры в плавающем фрейме.
discs();
break;
case 'list': // Вывод структурированного списка
bo_list();
break;
default:
show::form($mnu); // По уполчанию -- показ формы с плавающим фреймом для выбора дисциплин и выпадающим списком выбора кафедры
break;
}
// Показ списка дициплин выбранной кафедры в плавающем фрейме.
function discs(){
global $kaf;
// Создание объекта интерфейса ИРБИС
$irb=new jwrapper();
// Поиск в базе VUZ записей с выбранной пользователем кафедрой
/* @var $irb iserver64 */
$discs=$irb->FindRecords('VUZ','(<.>KAFCH='.$kaf.'<.>)');
if (!$discs){
show::message('Не найдены дисциплины читаемые выбранной кафедрой');
return;
}
if ($discs<0){
show::message('Ошибка при работе с интерфейсом к БД: '.$irb->get_last_error_message().'('.$discs.')');
return;
}
usort($discs,'sort_discs');
// Создание ассоциативного массива где ключём является идентификатор дициплины, а значением её полное название
/* @var $disc record */
foreach ($discs as $disc){
$discs_array[$disc->GetSubField(3,1,'0')]=$disc->GetSubField(3,1,'A');
}
// HTML код и простой алгоритм построения формы вынесены в printdisc.html.php
show::disc_list($discs_array);
}
function bo_list(){
global $kaf,$req,$basepath,$mnu,$params;
$irb=new jwrapper();
// преобразование строки [идентификатор дисциплины]*[идентификатор дисциплины] в массив идентификаторов
$discs_id=explode('*',$req);
$integrator='';
$disc_req='';
// Формирование запроса из идентификаторов
foreach($discs_id as $disc_id){
if ($disc_id){
$disc_req.=$integrator.'(<.>IDD='.$disc_id.'<.>)';
$integrator='+';
}
}
// Чтение ИРБИС формата генерации XML
$pft=file_get_contents($basepath.'/output_format.pft');
// Формирование массива значений для подстановки. Например, в формате output_format.pft !disc_id! заменяется на $req
$rep_array['disc_id']=$req;
$rep_array['kaf']=$kaf;
$rep_array['format']=($params['output_format'])? "&uf('6".$params['output_format']."')" : file_get_contents($basepath.'/fullwebr_kn.pft');
// Выполнение подстановки. Функция parse_pft находится в файле u.pft
$pft=u::parse_pft($pft,$rep_array);
// Выполнение поиска в основной базе каталога по запросу($params['main_base']), включающему название кафедры и идентификаторы отобранных дисциплин(если есть)
/* @var $irb iserver64 */
$discs=$irb->search_list($params['main_base'],(($disc_req) ? $disc_req.'*': '').'(<.>KAFCH='.$kaf.'<.>)','',$pft,900);
if (!$discs){
show::message('Литература рекомендованная по выбранным дисциплинам отсутствует.');
return;
}
if ($discs<0){
show::message('Ошибка при работе с интерфейсом к БД: '.$irb->get_last_error_message().'('.$discs.')');
return;
}
/*
В норме $irb->search_list должен возвращать список записей типа:
<record>
<title>Базы данных</title>
<title>Информационные технологии</title>
<sortkey>КопейкинБазы д</sortkey>
<bo>
<![CDATA[
<b>М</b><br><b></b><b>Копейкин, М. В.</b> <b></b><br> Базы данных: метод. указания к курсовому проектированию/ М. В. Копейкин, В. В. Спиридонов, Е. О. Шумова. - СПб.: Изд-во СЗТУ, 2004. - 171 с. - Библиогр.: с. 93. - 4.00 р.<br><b>Экземпляры: </b>А(1), АБ(37), ЧЗ(3)+Электронная версия<BR>
]]>
</bo>
</record>
<title> -- заголовки под которыми должно разместиться библиографическое описание
<sortkey> -- ключ сортировки, котрый определяет положение записи в разделе
<bo> -- библиографическое описание
*/
// создание объекта DOMDocument
$doc = new DOMDocument();
// добавление XML шапки.
$doc->loadXML("<?xml version='1.0' encoding='windows-1251'?> \n <root> $discs \n </root>");
// Формирование двух массивов:
$records=$doc->getElementsByTagName('record');
for($d=0;$d<$records->length;$d++){
$record=$records->item($d);
$sortkey=$record->getElementsByTagName('sortkey')->item(0)->nodeValue;
$titles=$record->getElementsByTagName('title');
// 1. $keys = array(заголовок***ключ сортировки***порядковый номер,... )
for($i=0;$i<$titles->length;$i++){
$keys[]=u::utf_win($titles->item($i)->nodeValue.' ***'.$sortkey.'***'.$d);
}
// 2. $bo_records = array(порядковый номер=>библиографическая запись,...)
$bo_records[$d]=u::utf_win($record->getElementsByTagName('bo')->item(0)->nodeValue);
}
// list_struct_keys сортирует ключи и объединяет с ними библиографические записи
// $list_struct_array=array(заголовок=>array(библиографическая запись 1, библиографическая запись2,....),...)
$list_struct_array=u::list_struct_keys($keys,$bo_records);
// Форматированный вывод $list_struct_array
show::bo_list(strtoupper($mnu[$kaf]),$list_struct_array);
}
function sort_discs($a,$b){
return strcmp($a->GetSubField(3,1,'A'), $b->GetSubField(3,1,'A'));
}
?>
Проанализировав этот файл нельзя не признать, что использование внутренних функций J-ИРБИС даёт возможность решить целый набор задач с помощью небольшого по объёму и читабельного кода...
Редактировано 4 раз. Последний раз 30.09.2009 03:07 пользователем Кирилл Соколинский (СЗТУ).