Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Web Ирбис и Z-Ирбис :  ИРБИС Irbis
 
Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 21, November, 2005 04:25

ОПТИМИЗАЦИЯ РАБОТЫ СО СЛОВАРЁМ И «МЕХАНИЗМ СЛЕЖЕНИЯ ЗА ОТМЕЧЕННЫМ»
Как мы знаем, в базовой поставке Web IRBIS каждое обращение к словарю терминов сопровождается генерацией новых страниц, подобных текущей, и завершается повторной загрузкой поисковой формы. Хорошо ли, что для просмотра 20 терминов словаря, пользователь должен грузить все наши меню, баннеры, новости и другую, совершенно ненужную для работы со словарём информацию? Полагаю, что нет. Однако, именно так происходит в большинстве библиотек работающих с Web Irbis.
Кроме того, даже после того, как пользователь отберёт необходимые ему термины, он получит не запрос по терминам словаря, а запрос по набору слов, нарезанных из терминов и соединённых операторами ИЛИ. Результатом такого запроса, естественно, оказывается половина базы. :) В моём случае, к этому добавлялась ещё и некорректная обработка сервером чекбоксов, по причине чего, половина отобранных терминов просто забывалась. Таковы особенности стандартного механизма работы со словарём.
Поскольку новый механизм «слежения за отмеченным», который ожидается в 2006 году может оказаться не лучше старого и дожидаться его у меня нет ни времени, ни желания, я решил самостоятельно устранить все проблемы.


Полагаю, существует только три корректных способа загрузки словаря:
1. В плавающем фрейме.
2. Во всплывающем окне
3. В обычном фрейме
Первый способ, видимо, является самым простым, поскольку не требует изменения в дизайне. Второй - наиболее наглядным, а поэтому наиболее удобным для пользователей, если у них не отключены всплывающие окна. Третий – самым универсальным, поскольку может использоваться даже с IE 3.
Из них я предпочёл второй, как самый наглядный и удобный при небольшом экране. Все описываемые решения предельно просты и универсальны.
Их основные достоинства в том, что они:
1. Сводят к минимуму перекачку информации
2. Могут быть использованы для любого словаря, независимо от его структуры.
3. Позволяют корректным способом объединять результаты отбора в разнородных словарях.
4. Избавляют от необходимости использовать код CDS/ISIS
Общий принцип банален: всплывающее окно(или фрейм) конструирует при помощи Java Script запрос и записывает его в основную поисковую форму. При необходимости, основная форма тут же отправляется на сервер.

Привожу главные элементы главной поисковой формы(Main.frm):

<!-- Эта поисковая форма на странице единственная. Вторую можно удалить. -->
<form action="/cgi-bin/irbis32r/cgiirbis_32.exe" enctype="Multipart/form-data" name="mainsearch" method="POST">

<!-- В I21DBNAM записывается название текущей базы без префикса -->
<!FORMAT='<input type="hidden" name="I21DBNAM" value="' if v1050<>'' then v1050 else &uf('g0_'v1) fi'">'>
<!FORMAT='<input type="hidden" name="I21DBN" value="' if v1050<>'' then v1050 else &uf('g0_'v1) fi, '">'>
<input type="hidden" name="C21COM" value="S">
<input type="hidden" name="S21FMT" value="fullwebr">
<input type="hidden" name="S21STN" value="1">
<input type="hidden" name="S21CNR" value="100">
<input type="hidden" name="S21REF" value="10">
<input type="hidden" name="S21LOG" value="1">
<!FORMAT=if (v5<>'') then '<input type="hidden" name="Z21ID" value="',v5,'">'>


<script>
//Открывает словарь с указанным префиксом во всплывающем окне
function OpenDic(prf) {
var dic =window.open('/cgi-bin/irbis32r/cgiirbis_32.exe?I21DBN='+mainsearch.I21DBNAM.value+'_EX&I21DBNAM='+mainsearch.I21DBNAM.value+'&S21FMT=fullwebr&T21PRF='+prf+'&T21CNR=20&C21COM=T', 'Dictionary', 'width=400,height=530,top=1');
dic.focus();
}
</script>

<!-- Поле, куда записывается поисковый запрос. Обязательно должно присутствовать. Может быть скрытым -->
<input type="text" class="inptransparent" name="S21ALL" size="110" >

<!-- Ссылки на словари -->
<a href="javascript: OpenDic('SP=')">Список специальностей</a>
<a href="javascript: OpenDic('D=')">Список дисциплин</a>

<!-- Остальное практически без изменений. Параметры советую именовать с использованием префикса, как это сделало в данном примере -->
<td height="32" align="left" >Дисциплина:</td>
<td height="32" >
<input type="hidden" name="D_S21P01" value="3">
<input type="hidden" name="D_S21P02" value="1">
<input type="hidden" name="D_S21P03" value="D=">
<input class="inp1" size="53" name="D_S21STR" >
<!-- и т. п. -->
</form>




Всплывающее окно:

<script language="JavaScript">

//Запускается при щелчке на термине словаря.
//Формирует поисковое выражение и инициирует поиск
function lm(term) {
opener.mainsearch.S21ALL.value="(<.>"+gsearch.T21PRF.value+term+"<.>)";
opener.mainsearch.submit();
self.close();
}


//Конструирует поисковые выражения из отмеченных терминов и префикса
function addsearch(){

var integrator="";
var prf;
var s_expression="";

var terms=opener.mainsearch.S21ALL.value.split("<.>");
for (i=0; i<gsearch.T21CHK.length; i++){
if (gsearch.T21CHK[i].checked){
terms[i+terms.length]=gsearch.T21PRF.value+gsearch.T21CHK[i].value;
}
}

terms.sort();

for(i=0; i<terms.length; i++){
if (terms[i]){
if (terms[i].indexOf("=")>0){
if (prf){ if (terms[i].indexOf(prf[0]+"=")<0) integrator=")*(";}
s_expression+=integrator+"<.>"+terms[i]+"<.>";
prf=terms[i].split("=");
integrator="%2B";
}
}
}

if (s_expression) s_expression= "("+s_expression+")";
opener.mainsearch.S21ALL.value=s_expression;

}
</script>


</HEAD>

<body onunload="addsearch()">
<CENTER>
<table cellpadding="0" cellspacing="0" border="0" width="100%" BGCOLOR=WHITE>
<form action="/cgi-bin/irbis32r/cgiirbis_32.exe" enctype="Multipart/form-data" method="POST" name="gsearch">
<!FORMAT='<input type="hidden" name="I21DBNAM" value="' if v1050<>'' then v1050 else &uf('g0_'v1) fi'">'>
<!FORMAT='<input type="hidden" name="I21DBN" value="' if v1050<>'' then v1050'_EX' else if v1:'_EX' then v1 else v1'_EX' fi, fi, '">'>
<!FORMAT='<input type="hidden" name="T21PRF" value="',if (v8<>'') then v8 else 'K=' fi,'">' >
<!FORMAT='<input type="hidden" name="T21CNR" value="',if (v1012<>'') then v1012 else '20' fi,'">' >
<input TYPE="hidden" name="C21COM" value='T'>

<script>
//Вывод динамически создаваемого алфавита ссылок для навигации по словарю. Не будем заставлять читателя качать несколько лишних килобайт. :)
var letters="АБВГДЖЗЕКЛМНОПРСТУФХЦЧЩ123456789";
for (var i=0;i<letters.length;i++) {
document.writeln("<a href='/cgi-bin/irbis32r/cgiirbis_32.exe?I21DBN="+gsearch.I21DBNAM.value+"_EX&I21DBNAM="+gsearch.I21DBNAM.value+ "&S21FMT=fullwebr&T21PRF="+gsearch.T21PRF.value+"&T21CNR=20&T21TRM="+letters.charAt(i)+"&C21COM=T'>" +letters.charAt(i)+"</a>" )
}
<!-- ******************ФОРМАТ ВЫВОДА СЛОВАРЯ ************************************-->
'<tr><td valign="CENTER" width="5%" ALIGN=RIGHT>',v1004,
'</br></td><td valign="Top"><input type="checkbox" name="T21CHK" value="',v1003,
'">',
|<a href="javascript: lm('|v1003|')">|
,v1003,
'</a><br></td></tr>'
<!-- ******************/ФОРМАТ ВЫВОДА СЛОВАРЯ ************************************-->

<a href="javascript: gsearch.submit(); ">Далее >>></a>
<input type="button" onclick="javascript: self.close(); " class="sub1" value="Возврат к поиску">

<input name="T21TRM" class="inp1"
<!FORMAT='value="',v1003,'"'>
width="45" style="width: 200px; ">

<input type="submit" class="sub1" value="Перейти к термину">

</form>

Если кому-то очень не нравиться идея автоматического формирования запроса и постоянного применения усечения, то можно поступить иначе:
function lm(term,prf) {
if (prf=="D=") opener.mainsearch.D_S21STR.value= term; else opener.mainsearch.SP_S21STR.value= term;
opener.mainsearch.submit();
close();
}

Вот, и всё. Никакого лишнего трафика и никакой лишней редакции.
Конечно, я вовсе не утверждаю, что предложенный способ является самым совершенным, поэтому буду рад любым соображениям по поводу того, как оптимизировать код, или заменить его на лучший.



Отправка отредактированного (18-01-06 11:27)

Re: Опыт доработки WEB IRBIS
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 21, November, 2005 14:27

Кирилл. Все то, что Вы описываете, все-лишь Ваша реализация конкретных функций. Не кто не говорит, что это невозможно. Делайте наздоровье. Если Вы еще напишите об этом доклад на том же Крыме, то это будет очень познавательно. Но не нужно путать пример интерфейса и конкретную реализацию.

ЗЫ. Я при обсуждении этой теме уже в кровь пальцы сбил :))))

Re: Опыт доработки WEB IRBIS
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 22, November, 2005 22:08

Хотите чтобы я свое выложил? Пожалуйста. Вот так у меня реализована команда INSERT_ALL_PARAMETERS на JS. Функции auth() и no_auth() соответственно проводят логинг и разлогинг не теряя при этом текущего контекста работы. Есть еще функция показа словаря, но вот не помню, доделал ли я ее и использую ли :)...

[... реализация ниже. Исправленная и дополненная комментами ...]

Re: Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 23, November, 2005 15:52

Максим, я рассчитывал что вы дадите хотя бы краткое объяснение, почему вам пришлось воспользоваться именно таким средством. Я понимаю, что INSET_ALL приводит к удвоению параметров. Но что препятствует использованию другой, тоже достаточно простой схемы?
<form action="/cgi-bin/irbis32r/cgiirbis_32.exe" enctype="Multipart/form-data" method="POST">
<!FORMAT=if v1052<>'' then '<input type="hidden" name="S21LOG" value="' v1052 '">' fi,>
<!FORMAT=if v1009<>'' then '<input type="hidden" name="S21FMT" value="' v1009 '">' fi,>
. . . . . . . . .

Конечно, операторы вашем примере комментировать не нужно, но вот назначение функций – очень желательно. Разобраться можно во всём, но это значительно упростит задачу.

Re: Опыт доработки WEB IRBIS
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 23, November, 2005 20:34

Объясню почему: просто перечисление всех возможных вариантов переменных не возможно хотябы из-за того, что операторы поиска имеют цифровой префикс. Я его могу поставить какой угодно. Этого никак не предусмотреть при предлагаемом вами методе. К тому же я могу добавлять свои параметры в ИНИ. Мне что, при каждом удобном случае править эту конструкцию? НЕЕЕЕЕ. Мой вариант вообще не привязан ни к каким переменным, кроме переменных авторизации.

Обращение к функции auth():
<form action="/cgi/irbis64r/cgiirbis_64.exe" metod="get" onsubmit="return auth();">
логин (фамилия) :
<input type="hidden" name="Z21FLAGID" value="1">
<input type="text" name="Z21FAMILY" class="auth" size="14">
пароль (штрих-код):
<input type="password" name="Z21ID" class="auth" size="14">
<input class="auth_btn" type="submit" value="OK" name="submit">
</form>

Обращение к функции no_auth():
<a href="javascript: no_auth();">
<img border="0" src="/images/close_session.gif" width="9" height="9">
</a>

Вот, поправил маленько и закомментил
//добавляет в массив Params новую переменную типа VAR1=3
function AddValue(Params,value){
for(index=0;index<Params.length;index++){
if(value.substr(0,value.indexOf('=',0)) == Params[index].substr(0,Params[index].indexOf('=',0))){
Params[index]=value;
return Params;
}
};
Params.push(value)
return Params;
};
//=========================================
//создается массив Params из переменных строки запроса
function Constructor(Params){
var SearchString = document.location.search;
SearchString = SearchString.substr(1,SearchString.length);
while(SearchString.indexOf('&',0) > -1){
AddValue(Params,SearchString.substr(0,SearchString.indexOf('&',0)));
SearchString = SearchString.substr(SearchString.indexOf('&',0)+1,SearchString.length);
};
AddValue(Params,SearchString);
return Params;
};
//=========================================
//возвращает значение переменной NAME, т.е. то, что после =
function GetParameterByName(Params,name){
for(var index=0;index < Params.length;index++){
var SepPos = Params[index].indexOf('=',0);
if(Params[index].substr(0,SepPos) == name){
return Params[index].substr(SepPos+1,Params[index].length);
};
};
};
//=========================================
//возвращает имя параменной по индексу в массиве Params. Используется в паре с GetParameterByName
function GetParameterNameByIndex(Params,Index){
var SepPos = Params[Index].indexOf('=',0);
return Params[Index].substr(0,SepPos);
};
//=========================================
//возвращает значение переменной по индексу в массиве Params
function GetParameterByIndex(Params,Index){
var SepPos = Params[Index].indexOf('=',0);
return Params[Index].substr(SepPos+1,Params[Index].length);
};
//=========================================
//jосуществляет контроль за процессом авторизации. Убирает из строки запроса лишние
//параметры и вставляет последовательно нужные
function auth() {
Params=null;
var Params = Array();
Params = Constructor(Params);
if(document.getElementById("Z21FAMILY").value==""){
alert("Необходимо заполнить поле: логин");
document.getElementById("Z21FAMILY").focus();
return false;
};
if(document.getElementById("Z21ID").value==""){
alert("Необходимо заполнить поле: пароль");
document.getElementById("Z21ID").focus();
return false;
};
var tmp_var = document.location.pathname+"?Z21FLAGID=1&Z21FAMILY="+document.getElementById("Z21FAMILY").value+"&Z21ID="+document.getElementById("Z21ID").value;
while(Params.length > 0){
index = Params.pop();
if((index.indexOf('Z21FLAGID',0) == -1)&(index.indexOf('Z21FAMILY',0) == -1)&(index.indexOf('Z21ID',0) == -1)&(index !== undefined)&(index !== '')){
tmp_var = tmp_var + "&" + index;
};
};
if(((navigator.appName=="Microsoft Internet Explorer")&(parseFloat(navigator.appVersion)<4))|((navigator.appName=="Netscape")&(parseFloat(navigator.appVersion)<4))){
alert("Для корректной работы требуется IE 4.0 или NN 4.0");
return true;
}
else {
document.location.href=tmp_var;
return false;
};
return false;
};
//==============================================
//осуществляет контроль за закрытием сеанса пользователя, убирая из строки запроса параметры авторизации
function no_auth() {
Params=null;
var Params = Array();
Params = Constructor(Params);
var tmp_var = document.location.pathname+"?"+Params.pop();
while(Params.length > 0){
index = Params.pop();
if((index.indexOf('Z21FLAGID',0) == -1)&(index.indexOf('Z21FAMILY',0) == -1)&(index.indexOf('Z21ID',0) == -1)&(index !== undefined)&(index !== '')){
tmp_var = tmp_var + "&" + index;
};
};
document.location.href=tmp_var;
return false;
};

Re: Опыт доработки WEB IRBIS
Пользователь: DiManiac (IP-адрес скрыт)
Дата: 24, November, 2005 00:44

Макс. Где сами разработчики говорят про пример интерфейса? Это, блин, послепродажные отмазки какие-то.
К тому же, сами разработчики почему-то продолжают дорабатывать этот пример. Константин даже новую версию написал.
Другое дело, что они сами говорят, что на других браузерах даже не пробовали запускать.

Re: Опыт доработки WEB IRBIS
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 24, November, 2005 12:35

Диман. А давай попробуем провести параллели.
1. АРМ Каталогизатор - гибко настраиваемый интерфейс с возможностью переработки полей ввода и вариантов отображения записей.
2. Web-Ирбис - CGI-технология, позволяющая работать к базами формата ISIS. При этом интерфейс возможно изменить полностью.

Естественно, что интерфейс в дистрибутиве меняется. Это то же, что и смена интерфейса в 64-м. Ты же все равно как-то должен представлять веб-ирбис. А значит нужна красивая картинка, чтобы людям понравилось.
Естественно, если клиента полностью устраивает интерфейс дистрибутива, то он будет использовать его. С этой точки зрения ошибок действительно быть не должно. И Кирилл правильно делает, что указывает на них. Я имею притензии только к форме изложения. Это, конечно, ошибки, но не критичные на столько, что все сразу не работает. Они могут быть исправлены самими пользователями за 1-2 минуты. Ну так и напишите, что "нашел ошибку, исправил. И вам советую ее исправить в дистрибутиве". А так, что прямо вот "ошиблись, теперь кайтесь и возвращайте вааще деньги. Гоните тут лажу, которая не работает". Веб-ирбис работает. Не корректно работает интерфейс. Так что поймите разницу и примите во внимание.

Re: Опыт доработки WEB IRBIS
Пользователь: DiManiac (IP-адрес скрыт)
Дата: 25, November, 2005 14:21

Тут принципиальная разница в количестве и качестве ошибок.
И еще более принципиальная - никто не рассматривает Ирбис в отрыве от интерфейса.

1-2 минуты... Ты оптимист :) У меня Веб-Ирбис нормально не работает уже месяца два. При условии, что заниматься приходится не только им, а всей библиотекой. Тебе хорошо, ты удаленно работаешь. В тишине, небось :)

Re: Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 14, December, 2005 02:34

НАЗВАНИЕ: «Формат вывода полных данных по полям(all)»

1. ПРОБЛЕМА Удалённое администрирование невозможно без возможности просмотра всех полей записи. Как мы знаем, вывод всех полей осуществляет функция &unifor('0'). Тем не менее, в Web она непригодна, поскольку использует RTF теги форматирования.

2. СПОСОБЫ РЕШЕНИЯ. Чтобы заменить теги RTF на HTML можно использовать только 2 средства: ISIS и Java Script. В нижеприведённом листинге используется первый вариант.

3. АЛГОРИТМ. Результат работы функции &unifor('0') записывается в глобальную переменную от которой «откусываются» разделённые пробелами фрагменты. Если во фрагменте присутствует RTF тег, он заменяется на аналогичный HTML.

Re: Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 14, December, 2005 02:35

4. ПРИМЕНЕНИЕ. Скопировать приведённый листинг в файл allweb.pft и добавить указать название файла в выпадающем списке S21FMT.
<select class="inp1" name="S21FMT">
<option value="fullwebr" selected="">полный формат </option>
<option value="briefweb">краткий формат </option>
<option value="allweb">UNIMARC </option>
</select>
–—--Листинг allweb.pft–——-
,###,
'<tr><td width=10% align="center" valign="top"><b><--MFNCOUNT-->.</b>',
'</td>',
'<td width=90% colspan="3">',
,mfn,'<BR>',
&uf('+1'),
&uf('+1W3000#',&unifor('0')),
(if &uf('G2 ',&uf('+1R3000'))<> &uf('+1R3000') then,
&uf('+1W3002#',&uf('g0 ',&uf('+1R3000'))),' ',
if &uf('+1R3002'):'_\b0' then, &uf('g0_',&uf('+1R3002')),'_</b>' else,
if &uf('+1R3002'):'\b0' then, '</b>' else, if &uf('+1R3002'):'\b' then '<b>' else,
if &uf('+1R3002'):'\par' then, &uf('g0\',&uf('+1R3002')),'<br>' else, &uf('+1R3002'),fi,
fi, fi,fi,
&uf('+1W3000#',&uf('G2 ',&uf('+1R3000'))),fi),
'<hr noshade size="1"></td></tr>',
–————————--
5. НЕДОСТАТКИ.
А) Алгоритм не универсален и его нельзя порекомендовать его для обработки других данных. Он пригоден только для этого случая.
Б) Обработка записей таким способом может отнимать много системных ресурсов.

PS
Как я уже сказал, этот формат позволяет выводить все данные, в том числе и системные поля – 1, 2 1009 и т. п. Так вот, просмотрев системные поля, я понял, что разработчики недаром применяют сложную конструкцию if v1100<>’’ then . . . вместо простой if p(v1100) then . . .
Всё дело снова в кривизне системы. Даже будучи пустыми, поля будут всё равно выводятся и p() будет возвращать значение True.

Re: Опыт доработки WEB IRBIS
Пользователь: Константин Сбойчаков (IP-адрес скрыт)
Дата: 21, December, 2005 18:41

(if &uf('+4T ')<>'' then &uf('+4T '),'#: ',&uf('+4F ') fi/)
Формат возвращает список меток и полей
Его можно настроить для работы в ИНтернет

Все новые форматы приводятся в релизах ИРБИС список которых можно взять на FTP

Re: Опыт доработки WEB IRBIS
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 21, December, 2005 18:43

хех, +4... еще что-то новое. Это для версии 5.2 уже?

Re: Опыт доработки WEB IRBIS
Пользователь: Константин Сбойчаков (IP-адрес скрыт)
Дата: 22, December, 2005 11:52

Этот unifor появится в версии ИРБИС 5.2
С его помощью в частности можно представить запись в текстовом формате выгрузки, используемом в ИРБИС.

Re: Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 22, December, 2005 14:16

Константин Сбойчаков писал(а):
> (if &uf('+4T ')<>'' then &uf('+4T '),'#: ',&uf('+4F ') fi/)
> Формат возвращает список меток и полей
> Его можно настроить для работы в ИНтернет
>
> Все новые форматы приводятся в релизах ИРБИС список которых
> можно взять на FTP

Когда вы это писали, вам не жалко было времени пользователей, которые начнут штудировать все документы на FTP в поисках несуществующего описания?


Re: Опыт доработки WEB IRBIS
Пользователь: Константин Сбойчаков (IP-адрес скрыт)
Дата: 22, December, 2005 14:38

>>>Когда вы это писали, вам не жалко было времени пользователей, которые начнут штудировать все документы на FTP в поисках несуществующего описания?

Приношу свои извинения

Re: Опыт доработки WEB IRBIS
Пользователь: Анонимный пользователь (IP-адрес скрыт)
Дата: 26, December, 2005 16:40

Может, я пока не врубился да ваще давненько не имел дела с вебом...
но мне тоже показалось, что создание новые поисковых форм - это не доработка, а настройка, и что настраиваемость - это не недостаток, а достоинство системы (любой).



Отправка отредактированного (26-12-05 16:43)

Re: Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 18, January, 2006 11:24

СЛЕЖЕНИЕ ЗА ОТМЕЧЕННЫМ - поправки

Мой предыдущий алгоритм работал не вполне корректно. При отборе из нескольких словарей он объединял все термины оператором ИЛИ, в то время, как большинство поисковых форм предполагают объединение полей оператором И.

Например, при отборе по словарю авторов и заглавий раньше формировалось такое поисковое выражение(напомню - %2B - эквивалент +):

(<.>A=АБАКУЛИНА, Л. И.$<.>)%2B(<.>A=АНТОНОВ, О. Г.$<.>)%2B(<.>T=АНАЛИТИЧЕСКАЯ ХИМИЯ$<.>)%2B(<.>T=БАЗЫ ДАННЫХ$<.>)

Оно отбирало все описания, содержащие хотя бы один из указанных терминов.

Новый вариант реструктурирует поисковые выражения таким образом, что между терминами одного словаря устанавливаются префиксы ИЛИ, а между группами терминов из разных словарей - И:

(<.>A=АБАКУЛИНА, Л. И.<.>%2B<.>A=АНТОНОВ, О. Г.<.>)*(<.>T=АНАЛИТИЧЕСКАЯ ХИМИЯ<.>%2B<.>T=БАЗЫ ДАННЫХ<.>)

В остальном, эта функция полностью эквивалентна addsearch() старого варианта. Проверена в Opera 7.6, Explorer 6, Mozilla 1.0.7. См. новый код смотрите в сообщении №1.

Re: Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 29, March, 2006 23:52

ОПТИМИЗАЦИЯ СКРИПТОВ В ПРОФЕССИОНАЛЬНОМ ПОИСКЕ

В последние версии WEB IRBIS был добавлен режим Профессионального поиска, который даёт возможность читателю конструировать поисковые запросы. Понятно, что самостоятельное написание на Java Script функций, которые позволяли бы это делать - задача невыполнимая. Поэтому разработчиками были применены готовые функции, взятые из системы OPAC Global.

Естественно, использование наукоемких разработок других производителей - разумный шаг. Тем не менее, как мне представляется, творческий подход при этом мог бы дать несколько лучшие результаты.
Приведу целиком те функции, о которых здесь идёт речь:


************************************************


function PasteLogic_OR()
{
if (OPAK.S21STR_1.value == "") return false;
rs="";
if (OPAK.S21_CHK.checked) rs="$";
if (document.OPAK.S21ALL.value == "")
{
document.OPAK.S21ALL.value = "(" + '"' + document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}else
{
document.OPAK.S21ALL.value = document.OPAK.S21ALL.value + "+("+'"' + document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}


OPAK.S21STR_1.value = "";
return false;
}



function PasteLogic_AND()
{
if (OPAK.S21STR_1.value == "") return false;
rs="";
if (OPAK.S21_CHK.checked) rs="$";
if (document.OPAK.S21ALL.value == "")
{
document.OPAK.S21ALL.value = "(" +'"'+ document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}else
{
document.OPAK.S21ALL.value = document.OPAK.S21ALL.value + "*(" +'"'+ document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}


OPAK.S21STR_1.value = "";
return false;
}

function PasteLogic_NOT()
{
if (OPAK.S21STR_1.value == "") return false;
rs="";
if (OPAK.S21_CHK.checked) rs="$";
if (document.OPAK.S21ALL.value == "")
{
document.OPAK.S21ALL.value = "(" +'"'+ document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}else
{
document.OPAK.S21ALL.value = document.OPAK.S21ALL.value + "^(" +'"'+ document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}


OPAK.S21STR_1.value = "";
return false;
}


function PasteLogic()
{
rs="";
if (OPAK.S21_CHK.checked) rs="$";
if (OPAK.S21STR_1.value != ""){
if (document.OPAK.S21ALL.value == "")
{
document.OPAK.S21ALL.value = "("+'"' + document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}else
{
document.OPAK.S21ALL.value = "(" +'"'+ document.OPAK.S21ALL.value + '"'+")" + "+(" +'"'+ document.OPAK.PREFIX.value + OPAK.S21STR_1.value + rs+'"'+")"
}
}
OPAK.S21STR_1.value = "";
if (OPAK.S21ALL.value != "") return true;
if (OPAK.S21ALL.value == "") return false;
}
******************************************************
Как мне кажется, что дублирования кода, которое имеет место во всех этих функциях можно было бы избежать, заменив четыре этих функции на одну.

function PasteLogic(log){
ms=document.mainsearch;
if (ms.TRUNCATION.checked) rs="$"; else rs="";
if (!ms.S21ALL.value) log="";
if (ms.USER_TERM.value) ms.S21ALL.value+= log +"(<.>"+ ms.PREFIX.value + ms.USER_TERM.value + rs+"<.>)";
ms.USER_TERM.value = "";
}

Прокомментирую, какие объекты в ней используются:
PREFIX - выбранный из выпадающего списка префикс.
USER_TERM - поле, куда пользователь ввёл термин.
TRUNCATION - флажок «Усечение».
S21ALL - поле с запросом.
В форме было бы неплохо использовать для кнопок операторов не тип SUBMIT, с системными именами(name) C21COM и т. п. , а кнопки типа BUTTON:

<input type="button" value="ИЛИ" onclick="PasteLogic('%2B')">
<input type="button" value="И" onclick="PasteLogic('*')">
<input type="button" value="НЕТ" onclick="PasteLogic('^')">

Как видно из этого листинга, вместо 4 функций используется одна, но с разными параметрами.

PS
Полагаю, что эта функция могла бы быть ещё короче.

Re: Опыт доработки WEB IRBIS
Пользователь: Constantin (IP-адрес скрыт)
Дата: 03, April, 2006 12:04

Правда, что внешний интерфейс професионального поиска похож на ОПАК, но сделан самостоятельно, тем более что это просто набор элементов ввода.
Причина похожести - использование этого интерфейса в режиме заимствования записей из ОПАК в ИРБИС Каталогизаторе, чтобы люди узнавали знакомый режим.
Никаких заимствований java script не производилось и производится не могло - разработчики ОПАК позаботилиь об этом сами - код не доступен для скачивания.

Re: Опыт доработки WEB IRBIS
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 04, April, 2006 01:01

Да, вы правы, я ошибся. Хотя я не в восторге от OPAC, но всё-таки с моей стороны было очень опрометчиво допустить, что его разработчики могли продублировать один и тот же код четыре раза в четырёх разных функциях...



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