まず、データを含む XML ファイルを明確にします。これは次のようになります。
<?xml version="1.0" ?>
<lanes>
<lane>
<order>1</order>
<status>registration</status>
</lane>
<lane>
<order>2</order>
<status>registration</status>
</lane>
<lane>
<order>3</order>
<status>registration</status>
</lane>
<lane>
<order>4</order>
<status>registration</status>
</lane>
<lane>
<order>5</order>
<status>registration</status>
</lane>
</lanes>
次に、PHP を使用してこの情報をページにロードする方法を考える必要があります。したがって、この XML ファイルがどこにあるかを把握し、ファイルを移動したりファイルの名前を変更したりした場合は、PHP コードを変更する必要があることを知っておく必要があります。さらに、すべての更新を処理するために個別のページをセットアップする必要はありません。したがって、すべてを同じページで処理しましょう - myProcess.php と呼ぶファイルです。
まず、グローバルを作成し、処理する POST データがあるかどうかを確認する必要があります。
<?php
$file = "myFile.xml";
$arrXml = array();
$count = 5; // number of lanes
if (count($_POST) > 0) {
// we're returning to the page with
// form data and need to update our XML
updateXMLFile();
unset($_POST);
}
// regardless we want to load the XML
readXMLFile();
?>
次に、関数をセットアップする必要があります。
function readXMLFile() {
global $file;
global $arrXml;
global $count;
$xmlStr = file_get_contents($file);
$arrXml = xml2array($xmlStr);
}
function updateXMLFile() {
global $file;
global $arrXml;
global $count;
$string = '<?xml version="1.0" ?><lanes>';
for ($i = 1; $i <= $count;$i++)
{
$string .= "<lane><order>$i</order>";
$string .= "<status>".$_POST['lane'.$i.'status']."</status></lane>";
}
$string .= "</lanes>";
$string = utf8_encode($string);
file_put_contents($file, $string);
}
PHP ドキュメントのコメントにある優れた XML -> 配列関数を次に示します。
function xml2array($xml){
$opened = array();
$opened[1] = 0;
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $xml, $xmlarray);
$array = array_shift($xmlarray);
unset($array["level"]);
unset($array["type"]);
$arrsize = sizeof($xmlarray);
for($j=0;$j<$arrsize;$j++){
$val = $xmlarray[$j];
switch($val["type"]){
case "open":
$opened[$val["level"]]=0;
case "complete":
$index = "";
for($i = 1; $i < ($val["level"]); $i++)
$index .= "[" . $opened[$i] . "]";
$path = explode('][', substr($index, 1, -1));
$value = &$array;
foreach($path as $segment)
$value = &$value[$segment];
$value = $val;
unset($value["level"]);
unset($value["type"]);
if($val["type"] == "complete")
$opened[$val["level"]-1]++;
break;
case "close":
$opened[$val["level"]-1]++;
unset($opened[$val["level"]]);
break;
}
}
return $array;
}
これで、フォームを作成するためのすべての設定が完了しました。HTML ページの作成方法はご存知だと思いますので、フォーム部分に焦点を当てます。
<form name="myForm" method="POST" action"myProcess.php">
<?php
for($i = 1;$i <= $count;$i++)
{
echo '<label for="lane'.$i.'status">Lane '.$i.': </label>';
echo '<select name="lane'.$i.'status">';
if ($arrXml[$i-1][1]['value'] == "closed")
echo '<option value="closed" selected="selected">Closed</option>';
else
echo '<option value="closed">Closed</option>';
if ($arrXml[$i-1][1]['value'] == "cue")
echo '<option value="cue" selected="selected">Cue</option>';
else
echo '<option value="cue">Cue</option>';
if ($arrXml[$i-1][1]['value'] == "registration")
echo '<option value="registration" selected="selected">Registration</option>';
else
echo '<option value="registration">Registration</option>';
if ($arrXml[$i-1][1]['value'] == "finAid")
echo '<option value="finAid" selected="selected">Financial Aid & Scholarships</option>';
else
echo '<option value="finAid">Financial Aid & Scholarships</option>';
if ($arrXml[$i-1][1]['value'] == "admissions")
echo '<option value="admissions" selected="selected">Admissions</option>';
else
echo '<option value="admissions">Admissions</option>';
echo '</select>';
}
?>
<input type="submit" value="Submit" />
</form>
これらをすべてまとめると、myProcess.php は次のようになります。
<?php
$file = "myFile.xml";
$arrXml = array();
$count = 5; // number of lanes
if (count($_POST) > 0) {
// we're returning to the page with
// form data and need to update our XML
updateXMLFile();
unset($_POST);
}
// regardless we want to load the XML
readXMLFile();
function readXMLFile() {
global $file;
global $arrXml;
global $count;
$xmlStr = file_get_contents($file);
$arrXml = xml2array($xmlStr);
}
function updateXMLFile() {
global $file;
global $arrXml;
global $count;
$string = '<?xml version="1.0" ?><lanes>';
for ($i = 1; $i <= $count;$i++)
{
$string .= "<lane><order>$i</order>";
$string .= "<status>".$_POST['lane'.$i.'status']."</status></lane>";
}
$string .= "</lanes>";
$string = utf8_encode($string);
file_put_contents($file, $string);
}
function xml2array($xml){
$opened = array();
$opened[1] = 0;
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $xml, $xmlarray);
$array = array_shift($xmlarray);
unset($array["level"]);
unset($array["type"]);
$arrsize = sizeof($xmlarray);
for($j=0;$j<$arrsize;$j++){
$val = $xmlarray[$j];
switch($val["type"]){
case "open":
$opened[$val["level"]]=0;
case "complete":
$index = "";
for($i = 1; $i < ($val["level"]); $i++)
$index .= "[" . $opened[$i] . "]";
$path = explode('][', substr($index, 1, -1));
$value = &$array;
foreach($path as $segment)
$value = &$value[$segment];
$value = $val;
unset($value["level"]);
unset($value["type"]);
if($val["type"] == "complete")
$opened[$val["level"]-1]++;
break;
case "close":
$opened[$val["level"]-1]++;
unset($opened[$val["level"]]);
break;
}
}
return $array;
}
?>
<html>
<head></head>
<body>
<form name="myForm" method="POST" action"myProcess.php">
<?php
for($i = 1;$i <= $count;$i++)
{
echo '<label for="lane'.$i.'status">Lane '.$i.': </label>';
echo '<select name="lane'.$i.'status">';
if ($arrXml[$i-1][1]['value'] == "closed")
echo '<option value="closed" selected="selected">Closed</option>';
else
echo '<option value="closed">Closed</option>';
if ($arrXml[$i-1][1]['value'] == "cue")
echo '<option value="cue" selected="selected">Cue</option>';
else
echo '<option value="cue">Cue</option>';
if ($arrXml[$i-1][1]['value'] == "registration")
echo '<option value="registration" selected="selected">Registration</option>';
else
echo '<option value="registration">Registration</option>';
if ($arrXml[$i-1][1]['value'] == "finAid")
echo '<option value="finAid" selected="selected">Financial Aid & Scholarships</option>';
else
echo '<option value="finAid">Financial Aid & Scholarships</option>';
if ($arrXml[$i-1][1]['value'] == "admissions")
echo '<option value="admissions" selected="selected">Admissions</option>';
else
echo '<option value="admissions">Admissions</option>';
echo '</select>';
}
?>
<input type="submit" value="Submit" />
</form>
</body>
</html>
これはあなたの質問に答えていますか?