Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
J-ИРБИС :  ИРБИС Irbis
 
Написание плагинов для J-ИРБИС
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 30, September, 2009 02:44

Введение
Материал посвящен разработке компонентов, использующих не только внутренний интерфейс 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>&nbsp;&nbsp;&nbsp;&nbsp; Базы данных: метод. указания к курсовому проектированию/ М. В. Копейкин, В. В. Спиридонов, Е. О. Шумова. - СПб.: Изд-во СЗТУ, 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 пользователем Кирилл Соколинский (СЗТУ).

Вложения: printdisc.rar (10KB)  
Re: Написание плагинов для J-ИРБИС
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 30, September, 2009 15:18

Чтобы получить иллюстрации к листингу, изменил на рабочем сайте код и забыл вернуть его в исходное состояние. Дело было поздно ночью... :( Поэтому около часа назад компонент выдавал XML. Сейчас код восстановлен, и его работоспособность можно непосредственно наблюдать.



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.