Опыт доработки 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)