В php я новичок, как в общем-то и в других языках, поэтому пишу здесь.
Я приобрел BillManager от ispsystem, оказалось, что для моих нужд требуется динамически изменять форму. Описание форм реализовано при помощи XML.
Для начала нужно описать обработчик при помощи того же XML:
<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
<handler name="websoft.php" type="xml">
<event after="yes">uniservice.order.param</event>
</handler>
Используем событие "after".
Далее пишем сам обработчик "websoft.php":
setXml();
function setXml()
{
$xml = getXml();
$sx = new SimpleXMLElement($xml);
$rez = $sx->xpath("//field[@name='domainlevel']")[0]->addChild("desc name='domainlevel_desc'");
echo $sx->asXml();
}
function getXml()
{
$xml = "";
$stdin = fopen("php://stdin","r");
while(!feof($stdin))
{
$buffer = fgets($stdin,1000);
$xml .= $buffer;
}
fclose($stdin);
return $xml;
}
Скрипт ловит xml поток, ищет тэг "field" с атрибутом name='domainlevel' и добавляет дочерний элемент desc name='domainlevel_desc.
Вроде бы всё хорошо, при открытии формы, всё сработало верно, НО
при нажатии кнопки далее - ошибка.
Выяснилось, что при событии event after обработчик запускается, и при открытии формы, и при закрытии, т.е. нажатии на кнопку далее.
Соответственно, при нажатии кнопки далее, нужно передать обратно неизменный XML. Отличить закрытие формы от открытия, можно по наличию тэга <sok>ok</sok> в XML потоке. Т.Е. при закрытии он есть, а при открытии - нет.
Добавляю условие в обработчик:
$xml_string = file_get_contents("php://stdin");
$doc = simplexml_load_string($xml_string);
$sok = $doc->params->sok;
if ($sok == "") {
setXml() //открытие формы
} else {
echo $doc->asXML(); //закрытие формы
}
Итог: При закрытии формы условие срабатывает верно, а при открытии setXml() не срабатывает.
Помогите, пожалуйста, разобраться.