rendered paste bodyfilter.xml
==========
<filters>
<topfilters name="Logic">
<middlefilters>
<filter>=</filter>
<filter>!=</filter>
</middlefilters>
<lowfilters>
<filter>QF_IDL</filter>
<filter>QF_UFBV</filter>
<filter>QF_IDL</filter>
<filter>QF_LRA</filter>
<filter>QF_AULIA</filter>
<filter>QF_LIA</filter>
</lowfilters>
</topfilters>
<topfilters name="Update">
<middlefilters>
<filter>=</filter>
<filter><=</filter>
<filter>>=</filter>
</middlefilters>
</topfilters>
<topfilters name="Status">
<middlefilters>
<filter>=</filter>
<filter>!=</filter>
</middlefilters>
<lowfilters>
<filter>sat</filter>
<filter>unsat</filter>
</lowfilters>
</topfilters>
</filters>
test.php
============
<?php
function is_selected ( $to_compare, $from_compare )
{
if ( $to_compare == $from_compare )
echo 'selected';
}
function output_form ( $top_level_value=NULL, $middle_level_value=NULL, $low_level_value=NULL )
{
echo '<select name = "top_filter[]" onchange="this.form.submit()">';
$doc = new DOMDocument;
$doc->load('filter.xml');
$doc->preserveWhiteSpace = false;
$entries = $doc->getElementsByTagName('topfilters'); #$xpath->query($query);
foreach ( $entries as $entry )
{
echo '<option value="' . $entry->getAttribute ( 'name' );
echo '" ';
echo is_selected ( $top_level_value, $entry->getAttribute ( 'name' ) );
echo '>';
echo $entry->getAttribute ( 'name' ) . '</option>';
}
echo '</select>';
if ( $top_level_value != NULL )
{
$middle_filter = '/filters/topfilters[@name="' . $top_level_value . '"]/middlefilters/filter';
$low_filter = '/filters/topfilters[@name="' . $top_level_value . '"]/lowfilters/filter';
$xpath = new DOMXPath($doc);
/* out put for middle and low filters and select appropriate default values if possible */
$entries = $xpath->query ( $middle_filter );
echo '<select name="middle_filter[]">';
foreach ( $entries as $entry )
{
echo '<option value="';
echo $entry->nodeValue;
echo '" ';
echo is_selected ( $entry->nodeValue, $middle_level_value );
echo ' >' . $entry->nodeValue . '</option>';
}
echo '</select>';
/* for the low filter i have to keep a count coz if there is no filter, that means we have to put a text box */
$count = 0;
$entries = $xpath->query ( $low_filter );
/* first get the count */
foreach ( $entries as $entry )
$count++;
if ( $count != 0 )
{
echo '<select name="low_filter[]">';
foreach ( $entries as $entry )
{
echo '<option value="';
echo $entry->nodeValue;
echo '" ';
echo is_selected ( $entry->nodeValue, $low_level_value);
echo ' >' . $entry->nodeValue . '</option>';
}
echo '</select>';
}
else
{
echo '<input type="text" size=25 value="' . $low_level_value . '" />';
}
}
echo '<br>';
}
?>
<html>
<head><title>Search SMT Libs</title>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf8">
<script type="text/javascript">
function updateandsubmit()
{
this.document.forms['filter']['isquery'].value = '1';
this.document.forms['filter'].submit();
return true;
}
function setVisible()
{
var toshow = this.document.forms['filter']['formstoshow'].value;
for ( i=0; i<toshow; i++ )
{
document.write ( "came" );
this.document.forms['filter']['middle_filter'][i].visible = true;
document.write(i + "<br>" );
}
}
</script>
</head>
<body>
<form name="filter" method="post" action="sedna.php">
<input type="hidden" name="isquery" value="0" />
<input type="hidden" name="formstoshow" value="1" />
<?php
/* we output one extra always */
if ( isset ( $_POST['isquery'] ) && $_POST['isquery'] == 1 )
{
/* do a search and show the result */
}
else
{
if ( isset ( $_POST['formstoshow'] ) )
$toshow = $_POST['formstoshow'];
else
$toshow = 1;
/* initialize the form depending upon the last form value */
/* change 4 if you want to increase the number of selection in the first step */
for ( $i=0; $i < $toshow; $i++ )
{
/* sanity check when we are coming for the first time .. we will require count too */
if ( isset ( $_POST['top_filter'] ) )
{
#echo $i;
if ( array_key_exists ( $i, $_POST['top_filter'] ) )
{
#echo 'reaced 1';
output_form( $_POST['top_filter'][$i], $_POST['middle_filter'][$i], $_POST['low_filter'][$i] );
}
else
{
#echo 'reaached 2';
output_form ( 'Logic' );
}
}
else
{
output_form ( 'Logic' );
}
}
}
?>
<p>
<input type='submit' value='Search' onClick="updateandsubmit();" />
</form>
</body>
</html>