convertGuiXml.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. require_once dirname(__FILE__) . '/../../se-lib/bootstrap.php';
  3. Lib::loadClass('SqlQueryWhereBuilder');
  4. function convertGuiXmlToCmdList($guiXmlString, $convertGuiXslString) {
  5. $requestXml = new DOMDocument();
  6. $requestXml->loadXml($guiXmlString);
  7. $convertGuiXsl = new DOMDocument();
  8. $convertGuiXsl->loadXml($convertGuiXslString);
  9. $proc = new XSLTProcessor();
  10. $proc->importStylesheet($convertGuiXsl);
  11. return $proc->transformToXML($requestXml);
  12. }
  13. $guiXmlString = file_get_contents('default_db/test_perms.gui.xml');
  14. $convertGuiXslString = file_get_contents('convertGuiXmlToFiltersXML.xsl');
  15. $convertedGuiXml = convertGuiXmlToCmdList($guiXmlString, $convertGuiXslString);
  16. /*
  17. <?xml version="1.0"?>
  18. <ui_filter name="sf_Status" label="Status" icon="question-sign">
  19. <ui_filter_button value="WAITING" label="OCZEKUJACY">
  20. <sql_filter_comparisonFieldToValue fieldName="A_STATUS" comparisonSign="=" value="WAITING"/>
  21. </ui_filter_button>
  22. <ui_filter_button value="AKTYWNI" label="AKTYWNI">
  23. <sql_filter_openBlock type="or"/>
  24. <sql_filter_comparisonFieldToValue fieldName="A_STATUS" comparisonSign="=" value="NORMAL"/>
  25. <sql_filter_comparisonFieldToValue fieldName="A_STATUS" comparisonSign="=" value="WARNING"/>
  26. <sql_filter_closeBlock type="or"/>
  27. </ui_filter_button>
  28. </ui_filter>
  29. */
  30. echo "L." . __LINE__ . ": convertedGuiXml:\n{$convertedGuiXml}\n----------------------------------------\n";
  31. $DBG = true;
  32. $tags = array();
  33. $parserXml = xml_parser_create();
  34. xml_parser_set_option($parserXml, XML_OPTION_CASE_FOLDING, 0);
  35. xml_parser_set_option($parserXml, XML_OPTION_SKIP_WHITE, 1);
  36. if (0 == xml_parse_into_struct($parserXml, $convertedGuiXml, $tags)) {
  37. throw new Exception("Parse Request xml error #" . __LINE__ . ": parse converted transaction failed");
  38. }
  39. xml_parser_free($parserXml);
  40. if (empty($tags)) {
  41. throw new Exception("Parse Request xml error #" . __LINE__ . ": parse converted transaction returns empty structure");
  42. }
  43. // [{"tag":"ui_filter","type":"open","level":1,"attributes":{"name":"sf_Status","label":"Status","icon":"question-sign"}}
  44. // ,{"tag":"ui_filter_button","type":"open","level":2,"attributes":{"value":"WAITING","label":"OCZEKUJACY"}}
  45. // ,{"tag":"sql_filter_comparisonFieldToValue","type":"complete","level":3,"attributes":{"fieldName":"A_STATUS","comparisonSign":"=","value":"WAITING"}}
  46. // ,{"tag":"ui_filter_button","type":"close","level":2}
  47. // ,{"tag":"ui_filter_button","type":"open","level":2,"attributes":{"value":"AKTYWNI","label":"AKTYWNI"}}
  48. // ,{"tag":"sql_filter_openBlock","type":"complete","level":3,"attributes":{"type":"or"}}
  49. // ,{"tag":"sql_filter_comparisonFieldToValue","type":"complete","level":3,"attributes":{"fieldName":"A_STATUS","comparisonSign":"=","value":"NORMAL"}}
  50. // ,{"tag":"sql_filter_comparisonFieldToValue","type":"complete","level":3,"attributes":{"fieldName":"A_STATUS","comparisonSign":"=","value":"WARNING"}}
  51. // ,{"tag":"sql_filter_closeBlock","type":"complete","level":3,"attributes":{"type":"or"}}
  52. // ,{"tag":"ui_filter_button","type":"close","level":2}
  53. // ,{"tag":"ui_filter","type":"close","level":1}]
  54. if($DBG){echo "L." . __LINE__ . ": tags\n" . json_encode($tags) . "\n";}
  55. $filters = array();
  56. $filter = null;
  57. $filterButton = null;
  58. foreach ($tags as $tag) {
  59. switch ($tag['tag']) {
  60. case 'ui_filter': {
  61. if ('open' == $tag['type']) {
  62. $filter = new stdClass();
  63. $filter->name = V::get('name', '', $tag['attributes']);
  64. $filter->label = V::get('label', '', $tag['attributes']);
  65. $filter->icon = V::get('icon', '', $tag['attributes']);
  66. $filter->buttons = array();
  67. if (empty($filter->name)) throw new Exception("Empty root tag name #" . __LINE__);
  68. } else if ('close' == $tag['type']) {
  69. $filters[$filter->name] = $filter;
  70. } else throw new Exception("Wrong ui_filter tag type");
  71. }
  72. break;
  73. case 'ui_filter_button': {
  74. if ('open' == $tag['type']) {
  75. $filterButton = new stdClass();
  76. $filterButton->name = V::get('value', '', $tag['attributes']);
  77. $filterButton->label = V::get('label', '', $tag['attributes']);
  78. $filterButton->queryWhere = new SqlQueryWhereBuilder();
  79. if (empty($filterButton->name)) throw new Exception("Empty root tag name #" . __LINE__);
  80. } else if ('close' == $tag['type']) {
  81. //$filterButton->rawQueryWhere = $filterButton->queryWhere->getQueryWhere();
  82. $filter->buttons[$filterButton->name] = $filterButton;
  83. } else throw new Exception("Wrong ui_filter tag typ");
  84. }
  85. break;
  86. case 'sql_filter_comparisonFieldToValue': {
  87. $fieldName = V::get('fieldName', '', $tag['attributes']);
  88. $comparisonSign = V::get('comparisonSign', '', $tag['attributes']);
  89. $value = V::get('value', '', $tag['attributes']);
  90. $filterButton->queryWhere->addComparisonFieldToValue($fieldName, $comparisonSign, $value);
  91. }
  92. break;
  93. case 'sql_filter_openBlock': {
  94. $blockType = V::get('type', '', $tag['attributes']);
  95. echo "L." . __LINE__ . ": sql_filter_openBlock block Type {$blockType} attrs = " . json_encode($tag) . "\n";
  96. $filterButton->queryWhere->openBlock($blockType);
  97. }
  98. break;
  99. case 'sql_filter_closeBlock': {
  100. $blockType = V::get('type', '', $tag['attributes']);
  101. $filterButton->queryWhere->closeBlock($blockType);
  102. }
  103. break;
  104. default: {
  105. echo "L." . __LINE__ . ": filter = "; print_r($filter);
  106. echo "L." . __LINE__ . ": filterButton = "; print_r($filterButton);
  107. echo "L." . __LINE__ . ": filters = "; print_r($filters);
  108. throw new Exception("TODO: tag {$tag['tag']}");
  109. }
  110. }
  111. }
  112. foreach ($filters as $filter) {
  113. foreach ($filter->buttons as $filterButton) {
  114. $filterButton->queryWhere->parseQueryWhere();
  115. echo "L." . __LINE__ . ": Filter({$filter->name}) Button({$filterButton->name}) Used Fields: [" . implode(",", $filterButton->queryWhere->getUsedFields()) . "]\n";
  116. }
  117. }
  118. echo "L." . __LINE__ . ": filters = "; print_r($filters);