Использование foreach, чтобы избежать избыточного кода обработки форм XPath - PullRequest
0 голосов
/ 12 июня 2019

Отвечено @ setAttribute не сохраняется обратно на страницу XML

Мой XML выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<facilities>
    <areas>
        <area name="Rocket">
            <trails>
                <trail name="Trail 1" status="CLOSED" />
                <trail name="Trail 2" status="CLOSED" />
                <trail name="Trail 2" status="CLOSED" />
            </trails>
        </area>
    </areas>
</facilities>

Я успешно могу редактировать атрибуты, используя следующиеcode:

<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);

 $asstatus = $xpath->query("//facilities/areas/area[@name='Rocket']/trails/trail[@name='Trail 1']/@status")->item(0);

$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'));
 }

 ?>

Интересно, есть ли простой способ изменить его на использование foreach, чтобы мне не нужно было создавать новый запрос и форму для каждого отдельного имени трейла?Пока что я попробовал несколько вариантов, но без особого успеха.

1 Ответ

0 голосов
/ 12 июня 2019

Простая комбинация использования XPath для извлечения списка трейлов, а затем для каждого трейла, извлекающего атрибуты для отображения.

foreach ( $xpath->query("//trails/trail") as $trail )   {
    echo $trail->getAttribute("name")."/".
          $trail->getAttribute("status").PHP_EOL;
}

Вы можете выбрать способ отображения этих данных - отдельные формы/ таблица и т. д.

Вывод в вашем коде переключается с отображения данных в HTML с использованием встроенного PHP.Вы должны быть последовательными и убедиться, что вы также правильно вложите свои цитаты.Следующее должно работать в цикле ...

    echo "<form method=\"POST\" 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>
  <input name=\"submit\" type=\"submit\" value=\"Save\" />
  </form>";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...