Avatar billede ditlev Juniormester
19. september 2011 - 22:49 Der er 26 kommentarer og
1 løsning

Tabellers placering i PHP/HTML

Dette spørgsmål er en fortsættelse fra tidligere.
Jeg har en kode der skal placere nogle felter lavet som tabeller ved siden af hinanden. Koden virker når den afvikles således:

<table align=center>
    <tr>
        <td><?php opgavefelt(1); ?></td><td><?php svarfelt(); ?></td><td><?php opgavefelt(2); ?></td><td><?php opgavefelt(3); ?></td><td><?php opgavefelt(4); ?></td>
    </tr>
</table>

Den skal dog afvikles dynamisk, hvor antallet af elementer i et array bestemmer om der er f.eks. tre eller fem felter. Min kode ser således ud, men den sætter felterne oven på hinanden, hvilket er mit store problem:

    // opgavedata i array hentes via PHP
    $opgave = array("Y2","G2","B2","svar","C2","k2","5"); //eksempel
    $antalElementer = count($opgave);
    $antalFelter = $antalElementer - 2;
    $tid = $antalFelter + 1;
    $rigtigtSvar = $opgave[0];
        for ($i=1; $i<$antalFelter + 1; $i++) {
            if ($opgave[$i] !== "svar") {
                opgavefelt($i);                // * Her skal felterne placere sig VED SIDEN af hinanden og ikke undedr hinanden *
            } else {
                svarfelt();                    // * Her skal felterne placere sig VED SIDEN af hinanden og ikke undedr hinanden *
            }
        }

Hele koden til siden kommer herefter:

<html>
<head>
    <title>Tegnesjov</title>
<script>

baggrund = "White";
aktuelle = "Black";
function SetBg(id,farve) {
    bgcol = document.getElementById(id).style.backgroundColor;
    if(bgcol!=baggrund){
        document.getElementById(id).style.backgroundColor=baggrund;
    }else{
        document.getElementById(id).style.backgroundColor=aktuelle;
    }
}
function SetBgPalette(id) {
    bgcol = document.getElementById(id).style.backgroundColor;
    aktuelle = bgcol;
    document.getElementById('felt_5').style.backgroundColor=bgcol;
}

</script>
</head>

<body style="background-color: #558820;">

<H1><center>Tegn med farver i feltet</center></h1>
<?php

    // opgavedata i array hentes via PHP
    $opgave = array("Y2","G2","B2","svar","C2","k2","5"); //eksempel
    $antalElementer = count($opgave);
    $antalFelter = $antalElementer - 2;
    $tid = $antalFelter + 1;
    $rigtigtSvar = $opgave[0];
        for ($i=1; $i<$antalFelter + 1; $i++) {
            if ($opgave[$i] !== "svar") {
                opgavefelt($i);                // * Her skal felterne placere sig VED SIDEN af hinanden og ikke undedr hinanden *
            } else {
                svarfelt();                    // * Her skal felterne placere sig VED SIDEN af hinanden og ikke undedr hinanden *
            }
        }
   
    // Tegne svarfeltet
    function svarfelt(){
        $vandret = 7;
        $lodret = 7;

        echo '<table cellspacing="1" cellpadding="1" border="5" bordercolor="Black" align=center>';
            for ($i=0; $i<$lodret; $i++) {
                echo '<tr>';
                    for ($n=0; $n<$vandret; $n++) {
                        // dit felt
                        echo "<td id=\"svar_".$i."_".$n."\" onClick=\"SetBg(this.id);\" width=\"15\" height=\"15\" style=\"background-color: White;\"></td>";
                    }
            }
        echo '</table>';
    }
    // Tegne opgavefelter
    function opgavefelt($nr){
        $nummer = $nr;
        $vandret = 7;
        $lodret = 7;

        echo '<table id="opgFelt_ .$nummer."\" cellspacing="1" cellpadding="1" border="3" align=center>';
            for ($i=0; $i<$lodret; $i++) {
                echo '<tr>';
                    for ($n=0; $n<$vandret; $n++) {
                        // dit felt
                        echo "<td id=\"felt_".$nummer."_".$i."_".$n."\" width=\"15\" height=\"15\" style=\"background-color: White;\"></td>";
                    }
            }
        echo '</table>';
    }
   
   
?>
<table align=center>
    <tr>
        <td><?php opgavefelt(1); ?></td><td><?php svarfelt(); ?></td><td><?php opgavefelt(2); ?></td><td><?php opgavefelt(3); ?></td><td><?php opgavefelt(4); ?></td>
    </tr>
</table>
   
<! Plot felter med data fra array>
<script>
    document.getElementById('felt_1_1_1').style.backgroundColor="black"; //Eksempel...
</script>

<! Panel farvemuligheder>
    <br><center>Skift farve</center>
    <table cellspacing="1" cellpadding="1" border="3" align=center>
    <td id="felt_1" onClick="SetBgPalette(this.id);" width="20" height="20" style="background-color: Black;"></td>
    <td id="felt_2" onClick="SetBgPalette(this.id);" width="20" height="20" style="background-color: Red;"></td>
    <td id="felt_3" onClick="SetBgPalette(this.id);" width="20" height="20" style="background-color: Blue;"></td>
    <td id="felt_4" onClick="SetBgPalette(this.id);" width="20" height="20" style="background-color: Yellow;"></td>
    </table>
   
<! Panel valgt farve>   
    <br><center>Aktuelle farve</center>
    <table cellspacing="1" cellpadding="1" border="3" align=center>
    <td id="felt_5" width="30" height="30" style="background-color: Black;"></td>
    </table>

</body>
</html>

Håber på en løsning :)
/Ditlev
Avatar billede ditlev Juniormester
19. september 2011 - 22:59 #1
NB. Ovenstående kode afvikler begge scripts, hvorfor man ser først fem felter oven på hinanden efterfulgt af fem felter ved siden af hinanden.
Avatar billede Slettet bruger
19. september 2011 - 23:18 #2
Jeg tror du mangler nogle <tr> rundt om det du vil have på hver sin linie.
Avatar billede ditlev Juniormester
19. september 2011 - 23:25 #3
Hej Tolamaps
Men det er jo netop ikke det jeg vil, jeg vil have det på én linje!!!
Altså nogle felter ved siden af hinanden: [][][][][]
Avatar billede Slettet bruger
20. september 2011 - 00:19 #4
I din kode mangler du at afslutte din <tr> et par steder, og i andre tabeller bruger du slet ikke <tr>. Jeg ved ikke om det er det der er problemet.
Du mangler f.eks. at afslutte din <tr> her:

        echo '<table cellspacing="1" cellpadding="1" border="5" bordercolor="Black" align=center>';
            for ($i=0; $i<$lodret; $i++) {
                echo '<tr>';
                    for ($n=0; $n<$vandret; $n++) {
                        // dit felt
                        echo "<td id=\"svar_".$i."_".$n."\" onClick=\"SetBg(this.id);\" width=\"15\" height=\"15\" style=\"background-color: White;\"></td>";
                    }
            }
        echo '</table>';
Avatar billede Slettet bruger
20. september 2011 - 00:23 #5
Hvis du kan vise et eksempel med dit output et sted, så vil det være nemmere at forstå problemet.
Avatar billede ditlev Juniormester
20. september 2011 - 00:28 #6
Jeg kører det på en localhost pt
Har desværre ikke mulighed lige nu for at lægge det ud på serveren.
Avatar billede ditlev Juniormester
20. september 2011 - 00:31 #7
Det er ikke de manglende <tr> der giver problemet.
Avatar billede majbom Novice
20. september 2011 - 07:34 #8
prøv at kopier resultatet af "vis kilde" ind på pastebin.com og smid et link her
Avatar billede ditlev Juniormester
20. september 2011 - 09:41 #9
Hej igen
Jeg kendte ikke pastebin.com, så jeg håber at jeg har gjort det rigtigt..
Her er linket: http://pastebin.com/abJLaQ1g
Avatar billede majbom Novice
20. september 2011 - 10:04 #10
damn, der er jo mange :)

kan du ikke smide en limit på din query?
Avatar billede ditlev Juniormester
20. september 2011 - 10:40 #11
Nu har jeg lavet en mindre udgave, der dog illustrerer problemet.
Der laves 2 2x2 felter, og de skal stå ved siden af hinanden.
De står dog ved dette script oven på hinanden. Det er vigtigt at jeg senere vil kunne arbejde med felterne dynamisk således at antallet af felter vil kunne varieres, hvorfor jeg helst vil have det til at fungere i PHP.

<?php
    // Tegne opgavefelter
    function opgavefelt($nr){
        $nummer = $nr;
        echo '<table id="opgFelt_ .$nummer."\" cellspacing="1" cellpadding="1" border="3" align=center>';
            for ($i=0; $i<2; $i++) {
                echo '<tr>';
                    for ($n=0; $n<2; $n++) {
                        echo "<td id=\"felt_".$nummer."_".$i."_".$n."\" width=\"15\" height=\"15\" style=\"background-color: Black;\"></td>";
                    }
            }
        echo '</table>';
    }

    // Plotte felter ved siden af hinanden
        for ($i=1; $i<3; $i++) {
                opgavefelt($i);                // * Her skal felterne placere sig VED SIDEN af hinanden og ikke under hinanden *
        }
?>

Hvis det kan komme til at virke med dette eksempel burde det også virke i det egentlige script.
/Ditlev
Avatar billede majbom Novice
20. september 2011 - 10:58 #12
det er som jeg skrev til dig i et tidligere spørgsmål, fordi du laver flere tabeller og disse er som udgangspunkt blok-elementer og vil derfor positionere sig under hinanden.

du kan placere dem i en anden tabel, eller i divs som du placerer ved siden af hinanden med float-property'en
Avatar billede ditlev Juniormester
20. september 2011 - 11:24 #13
Hej splazz
Ja - jeg er fra dit tidligere svar på tidligere spørgsmål klar over problematikken med blok-elementerne.

Ad. placering i tabeller: det var det jeg forsøgte ved mit forrige spørgsmål - http://www.eksperten.dk/spm/947532#reply_7840579
men dette fejlede. Det er formodentligt noget i denne retning der vil løse problemet, men jeg har åbenbart ikke mental kapacitet til at få scriptet helt på plads, synes i hvert fald at jeg har forsøgt mig med de fleste muligheder.

Ad. divs mm. Vil man kunne bruge dette dynamisk som jeg ønsker?
Avatar billede ditlev Juniormester
20. september 2011 - 11:57 #14
Her er mit forsøg på at sætte tabellerne ind i en tabel:

    // Plotte felter ved siden af hinanden
        echo '<table align=center>';
            for ($i=1; $i<4; $i++) {
                echo "<td>" . opgavefelt($i) . "</td>";
        }
        echo '</table>';

Hvis jeg indsætter tekst i stedet for tabel kommer teksten fint ved siden af hinanden, men når tabellerne indsættes kommer der et linjeskift????
Avatar billede majbom Novice
20. september 2011 - 13:06 #15
altså hvis du smider tabeller ind i de celler dér, kommer de på hver sin linje? det giver ikke meget mening...
Avatar billede ditlev Juniormester
20. september 2011 - 14:32 #16
Nu har jeg oploaded følgende:
eksemplet herover

http://orthopaedkirurgi.dk/andre/eksempel.php


Hovedscriptet, hvor de fem felter vises vertikalt over fem felter der står horizontalt som de skal (men er lavet i HTML)

http://orthopaedkirurgi.dk/andre/svarfelt3.php
Avatar billede majbom Novice
20. september 2011 - 15:18 #17
i eksempel.php starter du med:

<table align=center><table id="opgFelt_ .$nummer."\" cell...


det dur i hvert fald ikke

og efter den første </table> har du <td></td>

der er også noget rod med en backslash der muligvis skulle escape et "

prøv selv at tage et kig i kilden og smid den over i en editor, så du kan stille den genererede kode op, så det er til at se hvad der sker og ikke sker... det er den nemmeste måde at finde ud af hvad der er galt i sådan et script på
Avatar billede ditlev Juniormester
20. september 2011 - 16:02 #18
Okay! Nu er det barberet ned til følgende:

<?php

    function opgavefelt($nr){
        $nummer = $nr;
        echo '<table>';
            for ($i=0; $i<2; $i++) {
                echo '<tr>';
                    for ($n=0; $n<2; $n++) {
                        echo "<td> A </td>";
                    }
                echo '</tr>';
            }
        echo '</table>';
    }

    echo '<table>';
        for ($i=1; $i<4; $i++) {
            echo "<td>" . opgavefelt($i) . "</td>";
        }
    echo '</table>';
?>

Og på serveren ses følgende:
http://orthopaedkirurgi.dk/andre/eksempel2.php

Jeg bruger TextWrangler som editor, og kan ikke umiddelbart finde egentlige fejl, men tabellerne står stadig oven på hinanden :(
Avatar billede majbom Novice
20. september 2011 - 19:51 #19
er du sikker på at det er den kodestump du skriver dér at du kører på den side du linker til?

for når man ser i kildekoden starter den stadig med 2 <table>-tags lige efter hinanden, og det giver ingen mening med den stump kode du viser her...

har du prøvet selv at kigge i kilden på den genererede side?
Avatar billede Slettet bruger
20. september 2011 - 21:15 #20
Det kunne godt ligne den rigtige kode. Funktionen returnerer nemlig ikke noget men echoer en tabel ud, så kodelinien med:
echo "<td>" . opgavefelt($i) . "</td>";
skriver bare <td></td> ud efter tabellen fra funktionen.
Avatar billede Slettet bruger
20. september 2011 - 21:17 #21
Prøv med disse 3 linier som erstatning:
echo "<td>";
opgavefelt($i);
echo "</td>";

Og for at være pernittengryn, ville jeg tilføje en <tr> før loopet og en </tr> efter loopet. :)
Avatar billede ditlev Juniormester
20. september 2011 - 21:29 #22
Tolamaps - det ser squ ud til at virke :O)
Det virker i hvert fald på eksempelscriptet, jeg prøver lige på hovedscriptet....
Avatar billede ditlev Juniormester
20. september 2011 - 21:39 #23
Tolamaps - det er perfekt!
Smid et svar og pointene er dine.
Også stort tak til splazz for hjælpen undervejs :)
Avatar billede Slettet bruger
20. september 2011 - 21:45 #24
Ellers tak, og det var splazz det gjorde det meste af arbejdet. Specielt den sidste kommentar var et godt hint. :)
Avatar billede Slettet bruger
20. september 2011 - 21:46 #25
Ville sige du skulle give pointene til splazz.
Avatar billede majbom Novice
20. september 2011 - 21:46 #26
ahh, havde sq ikke lige tænkt over det med echo ind i funktionen - godt set tolamaps! :)
Avatar billede majbom Novice
21. september 2011 - 07:50 #27
tfp :)

og tak tolamaps!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester