1

それで、私は今週初めにこの質問をし、 @newfurnitureyが私を助けてくれましたが、今は新しい問題があります: デバイスをそのスパンに複数の U (したがって、usize 列devices db table) - 一部のデバイスは、キャビネットの半分を占める場合があります。また、デバイスがキャビネットの前面または背面にあることをマークできるようにしたいのですが、それは簡単に理解できるはずです。

1U デバイスのみの作業コード (db セットアップの古い質問を参照) は次のとおりです。

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
<!--
    function clickHandler(e)
    {
        var targetId, srcElement, targetElement;
        if (window.event) e = window.event; 
        srcElement = e.srcElement? e.srcElement: e.target;
        if (srcElement.className == "Outline")
        {
                targetId = srcElement.id + "d";
                targetElement = document.getElementById(targetId);

            if (targetElement.style.display == "none")
                {
                        targetElement.style.display = "";
                        srcElement.src = "images/minus.gif";
                    } 
            else
                {
                    targetElement.style.display = "none";
                    srcElement.src = "images/plus.gif";
                }
        }
    }
    document.onclick = clickHandler;
-->
</SCRIPT>
<noscript>You need Javascript enabled for this page to work correctly</noscript>
<?
function sql_conn()
{
    $username="root";
    $password="root";
    $database="racks";
    $server="localhost";

    @mysql_connect($server,$username,$password) or die("<h2 align=\"center\" class=\"red\">[<img src=\"images/critical.gif\" border=\"0\">] Unable to connect to $server [<img src=\"images/critical.gif\" border=\"0\">]</h2>");
    @mysql_select_db($database) or die("<h2 align=\"center\" class=\"red\">[<img src=\"images/critical.gif\" border=\"0\">] Unable to select $database as a database [<img src=\"images/critical.gif\" border=\"0\">]</h2>");
}

sql_conn();
$sql_datacenters="SELECT * FROM `datacenters`";
$result_datacenters=mysql_query($sql_datacenters);
$j=0;
echo "<table border='1' style='float:left;'>";
while ($datacenters_sqlrow=mysql_fetch_array($result_datacenters))
{
    echo "<tr><td>";
    echo "<h2 class='black' align='left'>";
    echo "<IMG SRC='images/plus.gif' ID='Out" . $j . "' CLASS='Outline' STYLE='cursor:hand;cursor:pointer'>"; // fancy icon for expanding-collapsing section
    echo " " . $datacenters_sqlrow['rack'] . ": " . $datacenters_sqlrow['cagenum'] . "</h2>"; // datacenter name and cage number
    echo "<div id=\"Out" . $j . "d\" style=\"display:none\">"; // opening of div box for section that is to be expanded-collapsed
    echo $datacenters_sqlrow['notes'] . "<br /><br />"; // datacenter notes
    $sql_cabinets="SELECT * FROM `cabinets` WHERE `datacenter` = '$datacenters_sqlrow[0]' ORDER BY `cabinetnumber` ASC";
    $result_cabinets=mysql_query($sql_cabinets);
    while ($cabinets_sqlrow=mysql_fetch_array($result_cabinets))
    {
        $sql_devices="SELECT * FROM `devices` WHERE `datacenter` = '$datacenters_sqlrow[0]' AND `cabinet` = '$cabinets_sqlrow[1]' ORDER BY `ustartlocation` ASC";
        $result_devices=mysql_query($sql_devices);
        echo "<table border='1' style='float:left;'>"; // opening of table for all cabinets in datacenter
        echo "<tr><td colspan='2' align='middle'>" . $cabinets_sqlrow[1] . "</td></tr>"; // cabinet number, spans U column and device name column
        $devices = array();
        while($row = mysql_fetch_array($result_devices)) {
            $devices[$row['ustartlocation']] = $row['devicename'];
        }
        for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) // iterates through number of U in cabinet     
        {   
            $u = $cabinets_sqlrow[2] - $i; // subtracts current $i value from number of U in cabinet since cabinets start their numbers from the bottom up
            echo "<tr>";
            echo "<td width='15px' align='right'>$u</td>"; // U number
            echo (isset($devices[$u]) ? "<td width='150px' align='middle'>$devices[$u]</td>" : "<td width='150px' align='middle'>empty</td>");
            echo "</tr>";
        }
        echo "</table>"; // closes table opened earlier
    }
    echo "</td></tr>";
    echo "</div>"; // close for div box that needs expanding-collapsing by fancy java
    $j++; // iteration for the fancy java expand-collapse
}
echo "</table>";
mysql_close();
?>
4

2 に答える 2

1

前の質問に基づいて、それぞれが一意です (したがって、配列ustartlocation内のインデックスとして使用できる理由)。$devicesこれと同じ概念を使用して、$devices配列を " から "ustartlocationに設定できます(ustartlocation + (usize - 1))

$devices = array();
while($row = mysql_fetch_array($result_devices)) {
    $endLocation = ($row['ustartlocation'] + ($row['usize'] - 1));
    for ($location = $row['ustartlocation']; $location <= $endLocation; $location++) {
        $devices[$location] = $row['devicename'];
    }
}

表示ループは既にそれぞれUを反復処理して割り当てられたデバイスを表示するため、他の部分を変更する必要はありません。ただし、これに対する注意点は、デバイス名がスパンするのではなく、すべてに対して繰り返されることです。それを広げるには、もう少し作業を行う必要があります。U

まず、個々の位置を埋める代わりに、単に配列にusize格納することができます。$devicesまた、後で多くの余分な作業/計算を避けるために、追加の位置ごとに「プレースホルダー」デバイスも保存します。

while($row = mysql_fetch_array($result_devices)) {
    // get the "top" location for the current device
    $topLocation = ($row['ustartlocation'] + $row['usize'] - 1);

    // populate the real position
    $devices[$topLocation] = $row;

    // generate a list of "placeholder" positions
    for ($location = ($topLocation - 1); $location >= $row['ustartlocation']; $location--) {
        $devices[$location] = 'placeholder';
    }
}

次に、表示ループで、現在の位置がプレースホルダーであるかどうかを確認します (そうであれば、単に を表示しU、デバイスに対して何もしません。そうでない場合は、デバイスを表示するか、「空」)。各デバイスの「スパン」効果を実現するために、セルをrowspanデバイスの と等しくなるように設定しますusize。の場合1は、単一のセルになります。2、2行にまたがります(これが、プレースホルダー行のデバイスに対して「何もしない」ことが機能する理由です):

for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {   
    $u = $cabinets_sqlrow[2] - $i;
    echo "<tr>";
    echo '<td width="15px" align="right">' . $u . '</td>';
    if (isset($devices[$u])) {
        // we have a "device" here; if it's a "placeholder", do nothing!
        if ($devices[$u] != 'placeholder') {
            echo '<td width="150px" align="middle" rowspan="' . $devices[$u]['usize'] . '">' . $devices[$u]['devicename'] . '</td>';
        }
    } else {
        echo '<td width="150px" align="middle">empty</td>';
    }
    echo "</tr>";
}

したがって、ご覧のとおり、デバイスがまたがるたびに単純にデバイスを繰り返す上記の最初の方法は、はるかに簡単です。Uただし、2 番目の方法は、よりユーザーフレンドリーな表示を提供します。どちらの方法を使用したいか、また将来どの方法をより保守しやすいと思うかは、あなたの好みです。

更新(コード修正 & 多方向スパニング)
テーブルが降順で構築されていることに気づかなかったので、ustartlocation行/セルの誤ったシフトを引き起こした「最上位の場所」を持っていました。上記のコードを修正して、その問題を修正するデバイスごとにustartlocation、に基づいて「最上位の場所」を適切に設定しました。usize

または、方向が重要であるかどうかに関係なく、指定したフラグに完全に依存して、上向きまたは下向き$devices行スパンの作成をサポートするように -populating ループ (以下) をカスタマイズしました。変更する必要がある唯一のコード (上記のカスタマイズされた表示ループが既にある場合) は、次のデータを入力するループです。while$devices

$spanDevicesUpwards = true;
while($row = mysql_fetch_array($result_devices)) {
    if ($row['usize'] == 1) {
        $devices[$row['ustartlocation']] = $row;
    } else {
        $topLocation = ($spanDevicesUpwards ? ($row['ustartlocation'] + $row['usize'] - 1) : $row['ustartlocation']);
        $bottomLocation = ($spanDevicesUpwards ? $row['ustartlocation'] : ($row['ustartlocation'] - $row['usize'] + 1));

        $devices[$topLocation] = $row;
        for ($location = ($topLocation - 1); $location >= $bottomLocation; $location--) {
            $devices[$location] = 'placeholder';
        }
    }
}

この新しいコード ブロックは、usizeスパンが 1 を超える場合、現在のデバイスの「トップ セル」と「ボトム セル」を決定します。上向きにスパンしている場合、トップセルはustartlocation + usize - 1; 下向きにスパンしている場合、それは単純ustartlocationです。ボトム位置もこの方法で決定される。

于 2012-11-04T16:10:17.223 に答える
0

これがうまくいくことを願っています....フロント/リアの場合、デバイスにSERVER3/frontまたはSERVER3/rearの名前を付けることができます:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
    <!--
        function clickHandler(e)
        {
            var targetId, srcElement, targetElement;
            if (window.event) e = window.event; 
            srcElement = e.srcElement? e.srcElement: e.target;
            if (srcElement.className == "Outline")
            {
                    targetId = srcElement.id + "d";
                    targetElement = document.getElementById(targetId);

                if (targetElement.style.display == "none")
                    {
                            targetElement.style.display = "";
                            srcElement.src = "images/minus.gif";
                        } 
                else
                    {
                        targetElement.style.display = "none";
                        srcElement.src = "images/plus.gif";
                    }
            }
        }
        document.onclick = clickHandler;
    -->
    </SCRIPT>
    <noscript>You need Javascript enabled for this page to work correctly</noscript>
    <?
    function sql_conn()
    {
        $username="root";
        $password="root";
        $database="racks";
        $server="localhost";

        @mysql_connect($server,$username,$password) or die("<h2 align=\"center\" class=\"red\">[<img src=\"images/critical.gif\" border=\"0\">] Unable to connect to $server [<img src=\"images/critical.gif\" border=\"0\">]</h2>");
        @mysql_select_db($database) or die("<h2 align=\"center\" class=\"red\">[<img src=\"images/critical.gif\" border=\"0\">] Unable to select $database as a database [<img src=\"images/critical.gif\" border=\"0\">]</h2>");
    }

    sql_conn();
    $sql_datacenters="SELECT * FROM `datacenters`";
    $result_datacenters=mysql_query($sql_datacenters);
    $j=0;
    echo "<table border='1' style='float:left;'>";
    while ($datacenters_sqlrow=mysql_fetch_array($result_datacenters))
    {
        echo "<tr><td>";
        echo "<h2 class='black' align='left'>";
        echo "<IMG SRC='images/plus.gif' ID='Out" . $j . "' CLASS='Outline' STYLE='cursor:hand;cursor:pointer'>"; // fancy icon for expanding-collapsing section
        echo " " . $datacenters_sqlrow['rack'] . ": " . $datacenters_sqlrow['cagenum'] . "</h2>"; // datacenter name and cage number
        echo "<div id=\"Out" . $j . "d\" style=\"display:none\">"; // opening of div box for section that is to be expanded-collapsed
        echo $datacenters_sqlrow['notes'] . "<br /><br />"; // datacenter notes
        $sql_cabinets="SELECT * FROM `cabinets` WHERE `datacenter` = '$datacenters_sqlrow[0]' ORDER BY `cabinetnumber` ASC";
        $result_cabinets=mysql_query($sql_cabinets);
        while ($cabinets_sqlrow=mysql_fetch_array($result_cabinets))
        {
            $sql_devices="SELECT * FROM `devices` WHERE `datacenter` = '$datacenters_sqlrow[0]' AND `cabinet` = '$cabinets_sqlrow[1]' ORDER BY `ustartlocation` ASC";
            $result_devices=mysql_query($sql_devices);
            echo "<table border='1' style='float:left;'>"; // opening of table for all cabinets in datacenter
            echo "<tr><td colspan='2' align='middle'>" . $cabinets_sqlrow[1] . "</td></tr>"; // cabinet number, spans U column and device name column
            $devices = array();
            $devices_size=array();
            while($row = mysql_fetch_array($result_devices)) {
                $devices[$row['ustartlocation']] = $row['devicename'];
                //$devices_size[$row['ustartlocation']+$row['usize']-1] = $row['usize'];
                  $devices_size[$row['ustartlocation']] = $row['usize']; 
            }
            $start="";
            $new="";
            for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) // iterates through number of U in cabinet     
            {   
                $u = $cabinets_sqlrow[2] - $i; // subtracts current $i value from number of U in cabinet since cabinets start their numbers from the bottom up


                echo "<tr>";
                echo "<td width='15px' align='right'>$u</td>"; // U number

                $rowspan=$devices_size[$u];

                //$rowspan1=$
                if($rowspan>1)
                {
                      $start=$u;   
                      $new=$u-$rowspan+1;
                echo (isset($devices[$u]) ? "<td width='150px' align='middle' rowspan='".$rowspan."'>$devices[$u]</td>" : "<td width='150px' align='middle' rowspan='".$rowspan."'>$devices[$new]</td>");


                }
                else{
                   if($u<=$start && $u>=$new)
                   {

                   }
                   else
                   {

                echo (isset($devices[$u]) ? "<td width='150px' align='middle' >$devices[$u]</td>" : "<td width='150px' align='middle'>empty".$row."".$u."</td>");
                }

                }


                echo "</tr>";
            }
            echo "</table>"; // closes table opened earlier
        }
        echo "</td></tr>";
        echo "</div>"; // close for div box that needs expanding-collapsing by fancy java
        $j++; // iteration for the fancy java expand-collapse
    }
    echo "</table>";
    mysql_close();
    ?>
于 2012-11-04T17:06:16.890 に答える