setAttribute не сохраняет обратно на страницу XML - PullRequest
0 голосов
/ 21 июня 2019

Я извлекаю данные с XML-страницы и пытаюсь написать обратно с помощью некоторого PHP-кода. Я успешно сделал это, потянув отдельные узлы с пунктами (0) и getAttributeNode, затем сохранив обратно в nodeValue вместо setAttribute. Моя цель, однако, состоит в том, чтобы заставить код работать с оператором foreach, чтобы мне не приходилось возвращаться и редактировать его, если трейлы добавляются и удаляются.

Если я попытаюсь изменить его с помощью setAttribute, это не сработает ни в одном из сценариев (вытягивая их по отдельности или с помощью оператора foreach), и я не могу понять, как сделать getAttributeNode и nodeValue работа с оператором foreach. Я думаю, что мне может понадобиться массив, но ничего из того, что я пробовал, до сих пор не работало. Я могу загрузить страницу без ошибок, но при нажатии кнопки «Отправить» ничего не происходит.

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<?php
$xml = new DOMDocument('1.0', 'utf-8');
$xml->formatOutput = true; 
$xml->preserveWhiteSpace = false;
$xml->load('example.xml');

$xpath = new DOMXpath($xml);

$childForm = '';
foreach ( $xpath->query("//trails/trail") as $trail )   {
  $childForm .= "<form action=''>
  <span class=\"title\">".$trail->getAttribute("name")."</span> <span class=\"title\">Status</span>
  <select name=\"asstatusform\" >
  <option selected value=".$trail->getAttribute("status").">".$trail->getAttribute("status")."</option>
  <option value=\"OPEN\">OPEN</option>
  <option value=\"CLOSED\">CLOSED</option>
  <option value=\"RACING CLOSURE\">RACING CLOSURE</option>
  </select></span>
  <br>
  </form>";
}

?>

<form action="" method="POST">
    <?php echo $childForm; ?>
    <input name="submit" type="submit" value="Save" />
</form>

<?php
if (isset($_POST['submit']))
{
  $trail->setAttribute('status', $_POST['asstatusform']);
  htmlentities($xml->save('example.xml'));
}

?>

1 Ответ

1 голос
/ 25 июня 2019

Вы говорите, что хотите редактировать этот атрибут "с помощью оператора foreach", но ваш вызов setAttribute находится вне цикла, поэтому вы изменяете только последний элемент.Вы также вкладываете формы друг в друга, что не работает.

Если я правильно понимаю, вы хотите индивидуально обновить каждое из состояний трасс, основываясь на отправке формы.Для этого вам нужно отправить массив обратно в форму, а затем перебрать его.Потенциально сложная часть заключается в сопоставлении массива с содержимым XML.В идеале у вас есть какой-то уникальный идентификатор, но в этом коде я просто предполагаю, что порядок элементов XML не будет меняться между отображением и обработкой.Итак, первая запись POST - это первый элемент XML и т. Д.

<?php
$xml    = new DOMDocument;
$xml    ->load('example.xml');
$xpath  = new DOMXpath($xml);
$trails = $xpath->query("//trails/trail");

if (isset($_POST["submit"])) {
    foreach ($_POST["asstatusform"] as $k=>$state) {
        $trails->item($k)->setAttribute("status", $state);
    }
    $xml->save('example.xml');
}
?>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<form action="" method="POST">
<?php foreach ($trails as $trail): ?>
    <span class="title"><?= htmlspecialchars($trail->getAttribute("name")) ?></span>
    <span class="title">Status</span>
        <select name="asstatusform[]">
            <option selected value="<?= htmlspecialchars($trail->getAttribute("status")) ?>">
                <?= htmlspecialchars($trail->getAttribute("status")) ?>
            </option>
            <option value="OPEN">OPEN</option>
            <option value="CLOSED">CLOSED</option>
            <option value="RACING CLOSURE">RACING CLOSURE</option>
        </select>
    </span>
    <br/>
<?php endforeach; ?>
    <input name="submit" type="submit" value="Save" />
</form>

Ваш встроенный HTML доставлял мне головную боль, я могу представить, что вы чувствовали то же самое, набирая его.Просто вырваться из PHP для длинных блоков HTML.Я использовал альтернативный синтаксис для цикла foreach и короткие эхо-теги для вывода.Не забывайте всегда использовать htmlspecialchars() для экранирования вывода на HTML-страницы.

...