0

次のようなファイルに一連の選択ボックスがあります。

<form method="post" action="update.php">

<table>
<tr>
    <td>Lane 1:</td>
    <td>
        <select name="lane1Status">
            <option value="closed">Closed</option>
            <option value="cue">Cue</option>
            <option value="registration">Registration</option>
            <option value="finAid" selected>Financial Aid & Scholarships</option>
            <option value="admisssions">Admissions</option>
        </select>
    </td>
</tr>

8つの別々の「レーン」があります(これは学生のラインキューイング用です)。ユーザーがこれらのボックスのいずれかで選択を変更して送信を押すと、次のようなxmlファイルの「レーン」を更新する必要があります。

<?xml version='1.0'?>
<update>
<Lane1Status>registration</Lane1Status>
<Lane2Status>registration</Lane2Status>
<Lane3Status>registration</Lane2Status>
<Lane4Status>registration</Lane2Status>
<Lane5Status>registration</Lane2Status>
<Lane6Status>registration</Lane2Status>
<Lane7Status>registration</Lane2Status>
<Lane8Status>registration</Lane2Status>
</update>

その値が設定されている場合、ユーザーがページをプルアップしたときに、その値がその特定のレーンのデフォルトの選択である必要があります。したがって、Lane1Statusが「closed」に更新された場合、ユーザーがフォームを開くたびに、そのレーンをデフォルトでclosedに設定する必要があります。

4

1 に答える 1

0

まず、データを含む 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>

これはあなたの質問に答えていますか?

于 2012-06-27T22:33:38.480 に答える