Показать сообщение отдельно
  #1 (permalink)  
Старый 13.02.2010, 14:58
Аспирант
Отправить личное сообщение для Hag1989 Посмотреть профиль Найти все сообщения от Hag1989
 
Регистрация: 25.10.2009
Сообщений: 50

Взаимодействие пользовательской формы с БД XML
Здравствуйте!

Я разрабатываю электронный определитель растений для Лесотехнической академии им. Кирова. Идея основана на фильтрации данных из БД в формате XML на 223 вида. При выборе пользователем в интерактивной HTML форме того или иного состояния признака (идентификатор поля checkbox будет соответствовать значению параметра ячейки БД) должна происходить фильтрация подходящих видов с последующим заполнением таблицы (куда попадут названия вида и соответствующее ему изображение)

У меня уже есть функции: генерации таблицы, фильтрации данных выбираемых из БД и заполнении таблицы, но фильтрация строк происходит некорректно.

Разметка БД XML:

Код:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Row>
    <Col>Larix</Col>
    <Col>img/1.gif</Col>
    <Col>1</Col>
    <Col>3</Col>
    <Col>5</Col>
    
  </Row>
  <Row>
    <Col>Pinus</Col>
    <Col>img/2.gif</Col>
    <Col>1</Col>
    <Col>3</Col>
    <Col>5</Col>
    
  </Row>
  <Row>
    <Col>Picea</Col>
    <Col>img/3.gif</Col>
    <Col>2</Col>
    <Col>3</Col>
    <Col>-</Col>
    
  </Row>
  <Row>
    <Col>Pseudotsuga</Col>
    <Col>img/4.gif</Col>
    <Col>2</Col>
    <Col>3</Col>
    <Col>-</Col>
   
  </Row>
  <Row>
    <Col>Abies</Col>
    <Col>img/5.gif</Col>
    <Col>2</Col>
    <Col>4</Col>
    <Col>-</Col>
    
  </Row>
  <Row>
    <Col>Tsuga</Col>
    <Col>img/6.gif</Col>
    <Col>2</Col>
    <Col>3</Col>
    <Col>-</Col>
    
  </Row>
</Root>

Разметка пользовательской формы; функции javascript:
Код:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<!-- form ----------------------------------------------------------------- -->
<form name="" action="" method="" onSubmit="return false" enctype="multipart/form-data">
<table width="500" border="2" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <th colspan="2" scope="col">ПОБЕГИ</th>
  </tr>
  <tr>
    <td colspan="2" bgcolor="#00FF66"><div align="center">Типы побегов</div></td>
  </tr>
  <tr>
    <td width="32">1</td>
    <td width="368"><label>
      <input type="checkbox" name="1" id="checkbox1" checked />
    Ауксибласты и брахибласты</label></td>
  </tr>
  <tr>
    <td>2</td>
    <td><label>
      <input type="checkbox" name="2" id="checkbox2" checked />
    Только ауксибласты</label></td>
  </tr>
  <tr>
    <td colspan="2" bgcolor="#00FF66"><div align="center">Наличие подушечек</div></td>
  </tr>
  <tr>
    <td>3</td>
    <td><label>
      <input type="checkbox" name="3" id="checkbox3" checked />
    Есть</label></td>
  </tr><tr>
    <td>4</td>
    <td><label>
      <input type="checkbox" name="4" id="checkbox4" checked />
    Нет</label></td>
  </tr>
  <tr>
    <td colspan="2"><div align="center"><strong>ЛИСТЬЯ</strong></div></td>
  </tr>
  <tr>
    <td colspan="2" bgcolor="#00FF66"><div align="center">Расположение</div></td>
  </tr>
  <tr>
    <td>5</td>
    <td><label>
      <input type="checkbox" name="5" id="checkbox5" checked />
    На брахибл. в пучках, на ауксибл. спирально по  одному</label></td>
  </tr>
  <tr>
    <td colspan="2" align="center"><input type="submit" value="Показать" onClick="main(false)"/></td>
  </tr>
</table>
</form>
<!-- form end ------------------------------------------------------------- -->
<div id="output_block" style="border:1px solid #ff0000">&nbsp;</div>
<script>var out_el = document.getElementById('output_block');</script>
<script>
// 1. делаем запрос к БД, т.е. загружаем xml
//  !!! работает в mozilla, в ie не будет !!!
var oXML = new XMLHttpRequest();
oXML.open('get', 'db.xml', false);
oXML.send(null);
var root = oXML.responseXML;
// проверка
out_el.innerHTML = root.getElementsByTagName('Row').length; // "8"
// 2. парсим тело полученного документа в массив
var Arr = new Array();
var xml_tr = root.getElementsByTagName('Row');
var xml_td;
for(i=0; i<xml_tr.length; i++){
    xml_td = xml_tr[i].getElementsByTagName('Col');
    Arr[i] = new Array();
    for(j=0; j<xml_td.length; j++){
        Arr[i][j] = xml_td[j].firstChild.data;
    }
}
// проверка
out_el.innerHTML = Arr[1][8]; // "Форма верхушки"
var el_table;
function main(fstStart){
    if(!fstStart) {document.body.removeChild(el_table); el_table = null;}
    // 3. отфильтровываем по параметрам
    // 3.1 набираем массив выбранных параметров
    var was_checked = new Array();
    var checkboxes = document.getElementsByTagName('input');
    for(i=0; i<checkboxes.length; i++)
        if(checkboxes[i].checked) was_checked[i] = checkboxes[i].name;
    // проверка
    var str = ""; for(i=0; i<was_checked.length; i++) str = str + was_checked[i] + ", ";
    out_el.innerHTML = str; // "1, 2, 3, 4, 5, "
    // 3.2 фильтруем по параметрам
    var result_rows = new Array();
    var totalCounter = 0; var chk = true;
    for(i=0; i<was_checked.length; i++){ // берем каждый выбранный параметр
        for(j=0; j<Arr.length; j++){     // и сравниваем с каждым из параметров массива БД
            for(k=2; k<Arr[j].length; k++){ // (которые располагаются в нескольких столбцах)
                if(was_checked[i]==Arr[j][k]){    // составляем массив, значения которого -
                                                  // ячейки, кот. необходимо отобразить
                    for(n=0; n<result_rows.length; n++){ // проверка на повторяемость
                        if(result_rows[n]==j) chk = false;
                    }
                    if(chk){
                        result_rows[totalCounter] = j;
                        totalCounter++; chk = true;
                    }
                }
            }
        }
    }
    // проверка
    out_el.innerHTML = result_rows.length; // "2"
    // 4. выводим таблицу
    var el_tr, el_td1, el_td2, el_td3;
    el_table = document.createElement('table');
    el_table.border = "1";
    // проход по всем строкам сформированного массива result_rows
    for (i=0; i<result_rows.length; i++){
        n = parseInt(result_rows[i]);
        add_row(Arr[n][0], Arr[n][1], "&nbsp;&nbsp;");
    }
    // добавляем таблицу в тело документа
    document.body.appendChild(el_table);
}
main(true);
// 4.1 функция, которая формирует строку таблицы результатов
function add_row(item1, item2, item3){
    el_tr = document.createElement('tr');
    el_td1 = document.createElement('td');
    el_td2 = document.createElement('td');
    el_td3 = document.createElement('td');
    el_tr.appendChild(el_td1);
    el_tr.appendChild(el_td2);
    el_tr.appendChild(el_td3);
    el_table.appendChild(el_tr);
    el_td1.innerHTML = item1;
    el_td2.innerHTML = item2;
    el_td3.innerHTML = item3;
}
</script>
</body>
</html>

Необходимо исправить фильтр по параметрам. Дальнейшие разъяснения напишу после ваших ответов.

Заранее благодарен, Александр.
Ответить с цитированием