loadXml($guiXmlString); $convertGuiXsl = new DOMDocument(); $convertGuiXsl->loadXml($convertGuiXslString); $proc = new XSLTProcessor(); $proc->importStylesheet($convertGuiXsl); return $proc->transformToXML($requestXml); } $guiXmlString = file_get_contents('default_db/test_perms.gui.xml'); $convertGuiXslString = file_get_contents('convertGuiXmlToFiltersXML.xsl'); $convertedGuiXml = convertGuiXmlToCmdList($guiXmlString, $convertGuiXslString); /* */ echo "L." . __LINE__ . ": convertedGuiXml:\n{$convertedGuiXml}\n----------------------------------------\n"; $DBG = true; $tags = array(); $parserXml = xml_parser_create(); xml_parser_set_option($parserXml, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parserXml, XML_OPTION_SKIP_WHITE, 1); if (0 == xml_parse_into_struct($parserXml, $convertedGuiXml, $tags)) { throw new Exception("Parse Request xml error #" . __LINE__ . ": parse converted transaction failed"); } xml_parser_free($parserXml); if (empty($tags)) { throw new Exception("Parse Request xml error #" . __LINE__ . ": parse converted transaction returns empty structure"); } // [{"tag":"ui_filter","type":"open","level":1,"attributes":{"name":"sf_Status","label":"Status","icon":"question-sign"}} // ,{"tag":"ui_filter_button","type":"open","level":2,"attributes":{"value":"WAITING","label":"OCZEKUJACY"}} // ,{"tag":"sql_filter_comparisonFieldToValue","type":"complete","level":3,"attributes":{"fieldName":"A_STATUS","comparisonSign":"=","value":"WAITING"}} // ,{"tag":"ui_filter_button","type":"close","level":2} // ,{"tag":"ui_filter_button","type":"open","level":2,"attributes":{"value":"AKTYWNI","label":"AKTYWNI"}} // ,{"tag":"sql_filter_openBlock","type":"complete","level":3,"attributes":{"type":"or"}} // ,{"tag":"sql_filter_comparisonFieldToValue","type":"complete","level":3,"attributes":{"fieldName":"A_STATUS","comparisonSign":"=","value":"NORMAL"}} // ,{"tag":"sql_filter_comparisonFieldToValue","type":"complete","level":3,"attributes":{"fieldName":"A_STATUS","comparisonSign":"=","value":"WARNING"}} // ,{"tag":"sql_filter_closeBlock","type":"complete","level":3,"attributes":{"type":"or"}} // ,{"tag":"ui_filter_button","type":"close","level":2} // ,{"tag":"ui_filter","type":"close","level":1}] if($DBG){echo "L." . __LINE__ . ": tags\n" . json_encode($tags) . "\n";} $filters = array(); $filter = null; $filterButton = null; foreach ($tags as $tag) { switch ($tag['tag']) { case 'ui_filter': { if ('open' == $tag['type']) { $filter = new stdClass(); $filter->name = V::get('name', '', $tag['attributes']); $filter->label = V::get('label', '', $tag['attributes']); $filter->icon = V::get('icon', '', $tag['attributes']); $filter->buttons = array(); if (empty($filter->name)) throw new Exception("Empty root tag name #" . __LINE__); } else if ('close' == $tag['type']) { $filters[$filter->name] = $filter; } else throw new Exception("Wrong ui_filter tag type"); } break; case 'ui_filter_button': { if ('open' == $tag['type']) { $filterButton = new stdClass(); $filterButton->name = V::get('value', '', $tag['attributes']); $filterButton->label = V::get('label', '', $tag['attributes']); $filterButton->queryWhere = new SqlQueryWhereBuilder(); if (empty($filterButton->name)) throw new Exception("Empty root tag name #" . __LINE__); } else if ('close' == $tag['type']) { //$filterButton->rawQueryWhere = $filterButton->queryWhere->getQueryWhere(); $filter->buttons[$filterButton->name] = $filterButton; } else throw new Exception("Wrong ui_filter tag typ"); } break; case 'sql_filter_comparisonFieldToValue': { $fieldName = V::get('fieldName', '', $tag['attributes']); $comparisonSign = V::get('comparisonSign', '', $tag['attributes']); $value = V::get('value', '', $tag['attributes']); $filterButton->queryWhere->addComparisonFieldToValue($fieldName, $comparisonSign, $value); } break; case 'sql_filter_openBlock': { $blockType = V::get('type', '', $tag['attributes']); echo "L." . __LINE__ . ": sql_filter_openBlock block Type {$blockType} attrs = " . json_encode($tag) . "\n"; $filterButton->queryWhere->openBlock($blockType); } break; case 'sql_filter_closeBlock': { $blockType = V::get('type', '', $tag['attributes']); $filterButton->queryWhere->closeBlock($blockType); } break; default: { echo "L." . __LINE__ . ": filter = "; print_r($filter); echo "L." . __LINE__ . ": filterButton = "; print_r($filterButton); echo "L." . __LINE__ . ": filters = "; print_r($filters); throw new Exception("TODO: tag {$tag['tag']}"); } } } foreach ($filters as $filter) { foreach ($filter->buttons as $filterButton) { $filterButton->queryWhere->parseQueryWhere(); echo "L." . __LINE__ . ": Filter({$filter->name}) Button({$filterButton->name}) Used Fields: [" . implode(",", $filterButton->queryWhere->getUsedFields()) . "]\n"; } } echo "L." . __LINE__ . ": filters = "; print_r($filters);