ilch Forum » Allgemein » HTML, PHP, SQL,... » Q: TABLE dynamisch mit row & colspan ?

Geschlossen
  1. #1
    User Pic
    Quapori Mitglied
    Registriert seit
    13.08.2014
    Beiträge
    8
    Beitragswertungen
    0 Beitragspunkte
    Hallo Leute,

    Ich versuche schon seid geraumer Zeit eine TABLE basierte Ausgabe in PHP.

    Ausgangslage:
    • 48 Spalten
    • 3 Zeilen


    Jede Zeile stellt ein Server dar. Die 48 Spalten sind die 30 Minuten eines Tages. Ich trage nun ein Event in die MYSQL Tabelle ein mit der Startspalte und Endspalte anhand der Zeit. Dazu dann ob das Event auf Server A und B oder Server B und C oder Server A bis C stattfindet (Niemals Server A und C).

    Wie bekomme ich es hin das alle Events eines Tages nun korrekt als TABLE mit colspan und rowspan ausgegeben werden? Bzw. das die Spalten/Zeilen die zeitlich nicht genutzt werden sich dort ergänzen.

    Ausgabe wie sie sein soll, Bsp:

    <html>
    <table class="table table-hover table-bordered" style="font-size:12px">
        <thead>
            <tr>
                <th><strong>Server</strong></th>
                <th colspan="2" class="bg-info">00</th>
                <th colspan="2">01</th>
                <th colspan="2" class="bg-info">02</th>
                <th colspan="2">03</th>
                <th colspan="2" class="bg-info">04</th>
                <th colspan="2">05</th>
                <th colspan="2" class="bg-info">06</th>
                <th colspan="2">07</th>
                <th colspan="2" class="bg-info">08</th>
                <th colspan="2">09</th>
                <th colspan="2" class="bg-info">10</th>
                <th colspan="2">11</th>
                <th colspan="2" class="bg-info">12</th>
                <th colspan="2">13</th>
                <th colspan="2" class="bg-info">14</th>
                <th colspan="2">15</th>
                <th colspan="2" class="bg-info">16</th>
                <th colspan="2">17</th>
                <th colspan="2" class="bg-info">18</th>
                <th colspan="2">19</th>
                <th colspan="2" class="bg-info">20</th>
                <th colspan="2">21</th>
                <th colspan="2" class="bg-info">22</th>
                <th colspan="2">23</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <th style="width:100px">A</th>
                <td colspan="12" class="bg-gray">#</td>
                <td colspan="6" class="bg-blue">
                    <center>Event 01</center>
                </td>
                <td colspan="2" class="bg-gray"></td>
                <td colspan="13" rowspan="2" class="bg-red">
                    <center>Event 02</center>
                </td>
                <td colspan="15" class="bg-gray">#</td>
            </tr>
            <tr>
                <th style="width:100px">B</th>
                <td colspan="20" class="bg-gray">#</td>
                <td colspan="15" class="bg-gray">#</td>
            </tr>
            <tr>
                <th style="width:100px">C</th>
                <td colspan="48" class="bg-gray">#</td>
            </tr>
        </tbody>
    </table>
    
    </html>


    hat jemand nen Denkanstoß oder einen Lösungsansatz, ich glaube mein logischdenken raucht schon ab :-P

    PS: Frohe Weihnachtszeit euch..


    verwendete ilch Version: 1.1 P
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    Nachtwolf Hall Of Fame
    Registriert seit
    10.11.2006
    Beiträge
    533
    Beitragswertungen
    16 Beitragspunkte
    Habe dir mal eine PN geschickt^^
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    ZitatZitat geschrieben von Nachtwolf
    Habe dir mal eine PN geschickt^^


    Wieso?
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Quapori Mitglied
    Registriert seit
    13.08.2014
    Beiträge
    8
    Beitragswertungen
    0 Beitragspunkte
    mir geht es lediglich nur um den reinen ansatz der umsetzung oder kleines beispiel ... da ich es eh an mein ilch anpassen muss dann. mein ilch ist so ziemlich stark umgebaut und weiterentwickelt. nur bei der obigen sache komm ich derzeit nicht voran.

    externe plugins mit javascript oder jquery wollte ich fernbleiben.....
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Lord|Schirmer Administrator
    Registriert seit
    21.03.2007
    Beiträge
    7.675
    Beitragswertungen
    1212 Beitragspunkte
    Hier mal eine Idee:

    <?php
    
    $server_ar = array (
    	1 => 'A',
    	2 => 'B',
    	3 => 'C'
    );
    
    $server_choose = array (
    	1 => 'A und B',
    	2 => 'B und C',
    	3 => 'A bis C'
    );
    
    $server_kombi = array (
    	1 => '1,2',
    	2 => '2,3',
    	3 => '1,2,3'
    );
    
    if (isset($_POST['submit']) && $_POST['server']>0) # absenden
    {	
    	echo '<table cellpadding="3" cellspacing="0" border="1" style="background-color:#999;">';
    	echo '<tr>';
    	echo '<th>Server</th>';
    	
    	for ($i=0; $i<=1440; $i=$i+30)
    	{
    		echo '<th>' . floor($i/60) . ':' . ($i%60) . '</th>';
    	}
    	
    	echo '</tr><tr>';
    	
    	foreach ($server_ar as $k => $v)
    	{
    		echo '<tr><th>' . $v . '</th>';
    
    		for ($i=0; $i<=48; $i++)
    		{
    			if(isset($_POST['check'.$i]) && preg_match("/".$k."/", $server_kombi[$_POST['server']]))
    			{
    				echo '<td style="background-color:red"></td>';
    			}
    			else
    			{
    				echo '<td style="background-color:#ccc"></td>';
    			}
    		}
    		echo '</tr>';
    	}
    	
    	echo '</table>';
    }
    else # formular
    {
    	echo '<form action="tabelle.php" method="POST">';
    	echo '<table cellpadding="3" cellspacing="0" border="1"><tr><th>Server</th>';
    
    	for ($i=0; $i<=1440; $i=$i+30)
    	{
    		echo '<th>' . floor($i/60) . ':' . ($i%60) . '</th>';
    	}
    	
    	echo '</tr><tr>';
    	
    	$choose = '<option>w&auml;hlen</option>';
    	foreach($server_choose as $k => $v)
    	{
    		$choose .= '<option value="'.$k.'">'.$v.'</option>';
    	}
    
    	echo '<tr><th><select name="server">' . $choose . '</select></th>';
    	for ($i=0; $i<=48; $i++)
    	{
    		echo '<td align="center"><input type="checkbox" name="check' . $i . '" value="0"></td>';
    	}
    	echo '</tr>';
    	
    	echo '</table><br />';
    	
    	echo '<input type="submit" name="submit" value="absenden">';
    	echo '</form>';
    }
    ?>



    Zuletzt modifiziert von Lord|Schirmer am 23.12.2015 - 01:34:21
    rules :: doku :: faq :: linkus
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    Quapori Mitglied
    Registriert seit
    13.08.2014
    Beiträge
    8
    Beitragswertungen
    0 Beitragspunkte
    Danke @Lord|Schirmer

    diesen Ansatz hatte ich auch schon.... :-D

    Hier der Aufbau meiner mysqlDB:
    COL (`ServerA`, `ServerB`, `ServerC`, `start`, `ende`, `start_col`, `ende_col`, `title`)
    VALUE (1, 1, 0, '2015-12-22 10:00:00', '2015-12-22 16:30:00', 20, 32, 'test titel');
    VALUE (0, 1, 1, '2015-12-22 17:00:00', '2015-12-22 19:30:00', 34, 38, 'test titel');


    Die Spalten "start_col" & "end_col" sind die Zellnummern

    ich habe es mir nun so ungefähr gedacht:
    • Server* TRUE werte addieren = Rowspan
    • ende_col minus start_col plus 1 = colspan


    der kleinste start_col wert aller events vom Tag sagt mir ja bis wo ich alles leer lassen kann in allen drei zeilen, der größte ende_col wert bis zum maximalen wert das gleiche am ende der "timeline".

    jetzt aber die leeren zwischen zellen herausfinden und erstellen lassen.

    vielleicht hilft es euch etwas weiter wie ich mir das ganze vorstelle :-P

    PS: der col und rowspan ist für mich so relevant da ich die events mit den eventdetails verknüpfen will...wenn ich die Zellnummern alle einzelnd farblich markieren lass dann hat nur eine zelle den link zu den details


    Zuletzt modifiziert von Quapori am 23.12.2015 - 05:46:43
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    Quapori Mitglied
    Registriert seit
    13.08.2014
    Beiträge
    8
    Beitragswertungen
    0 Beitragspunkte
    @Lord|Schirmer,

    ich habe mal meinen Code an dein Beispiel angepasst damit du sehen kannst wie meine derzeitige Denkweise ist :-P

    <?php
    	$server_ar = array(1 => 'A',2 => 'B',3 => 'C');
    	$server_choose = array(1 => 'A',2 => 'B',3 => 'C',4 => 'A und B',5 => 'B und C',6 => 'A bis C');
    	$server_kombi = array(1 => '1',2 => '2',3 => '3',4 => '1,2',5 => '2,3',6 => '1,2,3');
    	$col_event_arr = array();
    	$col_empty_arr = array();
    	if (isset($_POST['submit']) && $_POST['server'] > 0) 		# absenden
    	{
    		echo '<table cellpadding="3" cellspacing="0" border="0" style="width:100%;background-color:#999;"><tr><th rowspan="2">Server</th>';
    		for ($i = 0; $i <= 1380; $i = $i + 60)
    		{
    			echo '<th colspan="2">'.floor($i / 60).'</th>';
    		}
    		echo '</tr><tr>';
    		for ($i = 30; $i <= 1440; $i = $i + 30)
    		{
    			echo '<th>'.($i % 60).'</th>';
    		}
    		echo '</tr><tr>';
    		foreach ($server_ar as $k => $v)
    		{
    			if ($v == 'A')
    			{
    				$v = 'Server&nbsp;A';
    			}
    			else
    				if ($v == 'B')
    				{
    					$v = 'Server&nbsp;B';
    				}
    				else
    					if ($v == 'C')
    					{
    						$v = 'Server&nbsp;C';
    					}
    					echo '<tr><th>'.$v.'</th>';
    			for ($i = 1; $i <= 48; $i++)
    			{
    				if (isset($_POST['check'.$i]) && preg_match("/".$k."/",$server_kombi[$_POST['server']]))
    				{
    					$col_event_arr[] = ''.$k.'-'.$i.'';
    					echo '<td style="background-color:red">'.$k.'-'.$i.'</td>';
    				}
    				else
    				{
    					$col_empty_arr[] = ''.$k.'-'.$i.'';
    					echo '<td style="background-color:#ccc">'.$k.'-'.$i.'</td>';
    				}
    			}
    			echo '</tr>';
    		}
    		echo '</table>';
    		echo '<h3>VAR&nbsp;DUMP&nbsp;von&nbsp;$col_event_arr</h3>';
    		var_dump($col_event_arr);
    		echo '</br></br>';
    		var_dump(implode(',',$col_event_arr));
    		echo '<h3>VAR&nbsp;DUMP&nbsp;von&nbsp;$col_empty_arr</h3>';
    		var_dump($col_empty_arr);
    		echo '</br></br>';
    		var_dump(implode(',',$col_empty_arr));
    		echo '<h3>VAR&nbsp;DUMP&nbsp;von&nbsp;$server_kombi</h3>';
    		var_dump(explode(',',$server_kombi[$_POST['server']]));
    		echo '</br></br>';
    		echo '<h3>Auswertung&nbsp;des&nbsp;Events&nbsp;und&nbsp;Zusammenbau&nbsp;der&nbsp;colspan&nbsp;&&nbsp;rowspan</h3>';
    		$maxrow = count(explode(',',$server_kombi[$_POST['server']]));
    		$maxcol = count($col_event_arr) - 1;
    		$start_col = substr(''.$col_event_arr[0].'',2);
    		$end_col = substr(''.$col_event_arr[$maxcol].'',2);
    		echo 'start_col = '.substr(''.$col_event_arr[0].'',2).'</br>';
    		echo 'ende_col = '.substr(''.$col_event_arr[$maxcol].'',2).'</br>';
    		echo 'colspan="'.count($col_event_arr) / $maxrow.'"</br>';
    		echo 'rowspan="'.count(explode(',',$server_kombi[$_POST['server']])).'"</br>';
    		echo '</br></br>';
    		echo 'vor_startcol_leer = '.(($start_col) - 1).'</br>';
    		echo 'nach_startcol_leer = '.((48) - $end_col).'</br>';
    	}
    	else 	# formular
    	{
    		echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST"><table cellpadding="3" cellspacing="0" border="0"><tr><th rowspan="2">Server</th>';
    		for ($i = 0; $i <= 1380; $i = $i + 60)
    		{
    			echo '<th colspan="2">'.floor($i / 60).'</th>';
    		}
    		echo '</tr><tr>';
    		for ($i = 30; $i <= 1440; $i = $i + 30)
    		{
    			echo '<th>'.($i % 60).'</th>';
    		}
    		echo '</tr><tr>';
    		$choose = '<option>w&auml;hlen</option>';
    		foreach ($server_choose as $k => $v)
    		{
    			$choose .= '<option value="'.$k.'">'.$v.'</option>';
    		}
    		echo '<tr><th><select name="server">'.$choose.'</select></th>';
    		for ($i = 1; $i <= 48; $i++)
    		{
    			echo '<td align="center"><input type="checkbox" name="check'.$i.'" value="1"></td>';
    		}
    		echo '</tr>';
    		echo '</table><br />';
    		echo '<input type="submit" name="submit" value="absenden">';
    		echo '</form>';
    	}
    ?>


    Diese Ausgabe betrifft ja nur ein aktuelles Event.

    Meine Überlegung ist nun das ich ggf. jedes Event aus der mysqlDB auslese mir den ARRAY erstellen lass und dann aus einem ARRAY mit allen 144 Werten nach und nach aufsplitte und in ein neues ARRAY packe bis die Tabelle dann in einem ARRAY vorliegt und darüber die Ausgabe liefere.
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Lord|Schirmer Administrator
    Registriert seit
    21.03.2007
    Beiträge
    7.675
    Beitragswertungen
    1212 Beitragspunkte
    Schau ich mir später nochmal an.

    Eine Lösung für ein Event am Tag hatte ich schon, schwierig war wenn es mehrere waren.
    rules :: doku :: faq :: linkus
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    Lord|Schirmer Administrator
    Registriert seit
    21.03.2007
    Beiträge
    7.675
    Beitragswertungen
    1212 Beitragspunkte
    Hier mal die Lösung die schonmal für einen Eintrag hatte:

    <?php
    $server_ar = array(
    	1 => 'A',
    	2 => 'B',
    	3 => 'C'
    );
    $server_choose = array(
    	1 => 'A',
    	2 => 'B',
    	3 => 'C',
    	4 => 'A und B',
    	5 => 'B und C',
    	6 => 'A bis C'
    );
    $server_kombi = array(
    	1 => '1',
    	2 => '2',
    	3 => '3',
    	4 => '1,2',
    	5 => '2,3',
    	6 => '1,2,3'
    );
    $x_count = $x_count2 = 0;
    $y_count = 0;
    
    if (isset($_POST['submit']) && $_POST['server'] > 0) # absenden
    {
    	echo '<table cellpadding="3" cellspacing="0" border="1" style="width:100%;background-color:#999;"><tr><th rowspan="2">Server</th>';
    	for ($i = 0; $i <= 1380; $i = $i + 60)
    	{
    		echo '<th colspan="2">' . floor($i / 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	for ($i = 30; $i <= 1440; $i = $i + 30)
    	{
    		echo '<th>' . ($i % 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	foreach ($server_ar as $k => $v)
    	{
    		if ($v == 'A')
    		{
    			$v = 'Server&nbsp;A';
    		}
    		elseif ($v == 'B')
    		{
    			$v = 'Server&nbsp;B';
    		}
    		elseif ($v == 'C')
    		{
    			$v = 'Server&nbsp;C';
    		}
    		echo '<tr><th>' . $v . '</th>';
    		
    		for ($i = 1; $i <= 48; $i++)
    		{
    			if (isset($_POST['check' . $i]) && preg_match("/" . $k . "/", $server_kombi[$_POST['server']]) && $y_count == 0)
    			{
    				$x_count++;
    				if ($i < 48) continue;
    			}
    			
    			if (isset($_POST['check' . $i]) && preg_match("/" . $k . "/", $server_kombi[$_POST['server']]) && $y_count > 0)
    			{
    				$i = $i + $x_count2 - 1;
    				$y_count--;
    				continue;
    			}			
    			if ($x_count > 0)
    			{
    				$y_count = count(explode(',', $server_kombi[$_POST['server']]));
    				echo '<td colspan="' . $x_count . '" rowspan="' . $y_count . '" style="text-align:center; background-color:red;">EREIGNIS</td>';
    				$x_count2 = $x_count;
    				$x_count = 0;
    				$i--;
    			}
    			else
    			{
    				echo '<td style="text-align:center; background-color:#ccc">' . $i . '</td>';
    			}
    		}
    		echo '</tr>';
    	}
    	echo '</table>';
    }
    else # formular
    {
    	echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="POST"><table cellpadding="3" cellspacing="0" border="0"><tr><th rowspan="2">Server</th>';
    	for ($i = 0; $i <= 1380; $i = $i + 60)
    	{
    		echo '<th colspan="2">' . floor($i / 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	for ($i = 30; $i <= 1440; $i = $i + 30)
    	{
    		echo '<th>' . ($i % 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	$choose = '<option>w&auml;hlen</option>';
    	foreach ($server_choose as $k => $v)
    	{
    		$choose .= '<option value="' . $k . '">' . $v . '</option>';
    	}
    	echo '<tr><th><select name="server">' . $choose . '</select></th>';
    	for ($i = 1; $i <= 48; $i++)
    	{
    		echo '<td align="center"><input type="checkbox" name="check' . $i . '" value="1"></td>';
    	}
    	echo '</tr></table><br />';
    	echo '<input type="submit" name="submit" value="absenden">';
    	echo '</form>';
    }
    ?>
    rules :: doku :: faq :: linkus
    1 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    Quapori Mitglied
    Registriert seit
    13.08.2014
    Beiträge
    8
    Beitragswertungen
    0 Beitragspunkte
    danke schonmal, ich schau es mir nach den Feiertagen mal genauer an...

    ZitatZitat geschrieben von Lord|Schirmer
    Hier mal die Lösung die schonmal für einen Eintrag hatte:

    <?php
    $server_ar = array(
    	1 => 'A',
    	2 => 'B',
    	3 => 'C'
    );
    $server_choose = array(
    	1 => 'A',
    	2 => 'B',
    	3 => 'C',
    	4 => 'A und B',
    	5 => 'B und C',
    	6 => 'A bis C'
    );
    $server_kombi = array(
    	1 => '1',
    	2 => '2',
    	3 => '3',
    	4 => '1,2',
    	5 => '2,3',
    	6 => '1,2,3'
    );
    $x_count = $x_count2 = 0;
    $y_count = 0;
    
    if (isset($_POST['submit']) && $_POST['server'] > 0) # absenden
    {
    	echo '<table cellpadding="3" cellspacing="0" border="1" style="width:100%;background-color:#999;"><tr><th rowspan="2">Server</th>';
    	for ($i = 0; $i <= 1380; $i = $i + 60)
    	{
    		echo '<th colspan="2">' . floor($i / 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	for ($i = 30; $i <= 1440; $i = $i + 30)
    	{
    		echo '<th>' . ($i % 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	foreach ($server_ar as $k => $v)
    	{
    		if ($v == 'A')
    		{
    			$v = 'Server&nbsp;A';
    		}
    		elseif ($v == 'B')
    		{
    			$v = 'Server&nbsp;B';
    		}
    		elseif ($v == 'C')
    		{
    			$v = 'Server&nbsp;C';
    		}
    		echo '<tr><th>' . $v . '</th>';
    		
    		for ($i = 1; $i <= 48; $i++)
    		{
    			if (isset($_POST['check' . $i]) && preg_match("/" . $k . "/", $server_kombi[$_POST['server']]) && $y_count == 0)
    			{
    				$x_count++;
    				if ($i < 48) continue;
    			}
    			
    			if (isset($_POST['check' . $i]) && preg_match("/" . $k . "/", $server_kombi[$_POST['server']]) && $y_count > 0)
    			{
    				$i = $i + $x_count2 - 1;
    				$y_count--;
    				continue;
    			}			
    			if ($x_count > 0)
    			{
    				$y_count = count(explode(',', $server_kombi[$_POST['server']]));
    				echo '<td colspan="' . $x_count . '" rowspan="' . $y_count . '" style="text-align:center; background-color:red;">EREIGNIS</td>';
    				$x_count2 = $x_count;
    				$x_count = 0;
    				$i--;
    			}
    			else
    			{
    				echo '<td style="text-align:center; background-color:#ccc">' . $i . '</td>';
    			}
    		}
    		echo '</tr>';
    	}
    	echo '</table>';
    }
    else # formular
    {
    	echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="POST"><table cellpadding="3" cellspacing="0" border="0"><tr><th rowspan="2">Server</th>';
    	for ($i = 0; $i <= 1380; $i = $i + 60)
    	{
    		echo '<th colspan="2">' . floor($i / 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	for ($i = 30; $i <= 1440; $i = $i + 30)
    	{
    		echo '<th>' . ($i % 60) . '</th>';
    	}
    	echo '</tr><tr>';
    	$choose = '<option>w&auml;hlen</option>';
    	foreach ($server_choose as $k => $v)
    	{
    		$choose .= '<option value="' . $k . '">' . $v . '</option>';
    	}
    	echo '<tr><th><select name="server">' . $choose . '</select></th>';
    	for ($i = 1; $i <= 48; $i++)
    	{
    		echo '<td align="center"><input type="checkbox" name="check' . $i . '" value="1"></td>';
    	}
    	echo '</tr></table><br />';
    	echo '<input type="submit" name="submit" value="absenden">';
    	echo '</form>';
    }
    ?>
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten