Avatar billede lsskaarup Nybegynder
23. august 2010 - 10:18 Der er 21 kommentarer og
1 løsning

Dynamisk "menu"-struktur baseret på PHP/MySQL

Ja, jeg kunne ikke lige komme på en bedre beskrivelse i titlen, og forklaringen bliver sikkert ikke bedre, men here I go...

Men jeg skal bruge til hjælpe til at lave noget lignede en dynamisk menustruktur, bare ikke som menu.

Jeg har et intranet, hvor en siden skal vise et teoretisk antal kolonner og rækker.

Jeg har nogle over- og mellemniveau, som kan fanges i PHP via nogle arrays kaldet for hovedakt og underakt. Disse symbolisere den overordede struktur, hvor jeg gerne vil have at de kan foldes ud og ind, ligesom en menu. Under hvert underakt skal der så være en uendeligt antal rækker, som brugeren har mulighed for at skrive i.

Jeg prøver lige at illustere det.

I sammenfoldet stand:
+ Hovedakt_1 (navnebeskrivelse)  |  Pris (en samlet pris, for alle underakter)
+ Hovedakt_2
+ Hovedakt_3
.
.
.

I halvt udfoldet stand:
- Hovedakt_1  |  Pris
    + Underakt_1    |  Pris (En samlet pris, for den enkelte underakt)
    + Underakt_2    |  Pris
    .
    .
    .
+ Hovedakt_2  |  Pris
+ Hovedakt_3  |  Pris
.
.
.

I helt udfoldet stand:
- Hovedakt_1  |  Pris
    - Underakt_1    |  Pris
          Felt til beskrivelse      |  Felt til prisen
          Felt til beskrivelse      |  Felt til prisen
          Felt til beskrivelse      |  Felt til prisen
          .
          .
          .
    + Underakt_2    |  Pris
    .
    .
    .
+ Hovedakt_2  |  Pris
+ Hovedakt_3  |  Pris
.
.
.


Meningen er så, at der fra start af kun skal være en tom række under hvert underakt, men i takt med at de bliver udfyldt, skal der altid være mulighed for at tilføje en mere. På samme måde skal kolonnerne med priser fungere. Her skal prisen bare låses før der kommer en ny kolonne.

Men for at gøre en lang historie kort, så er det jeg i første omgang skal have hjælpe til, at skabe den dynamik, der er i kunne folde Hovedakt og underakt ud og ind, samtidig med at der vises felter for de aktuelle niveauer.

Håber at det blev bare nogenlunde til at forstå...
Avatar billede majbom Novice
23. august 2010 - 10:28 #1
hvis jeg forstår dig ret skal du bare have noget kode der folder ind og ud og tilføjer nye punkter i takt med at de andre bliver udfyldt?
Avatar billede lsskaarup Nybegynder
23. august 2010 - 10:46 #2
Ja, data til "menu" skal så bare trækkes fra henholdsvis en MySQL DB og en php siden, hvor arrayet til hovedakt og underakt ligger i.

Jeg har søgt lidt på nettet for at finde et eksempel, men dem jeg har fundet, er dynamsike på den måde, at undermenuerne vises når musen er over og forsvinder når de er væk. Her skal det være fast, ligesom Stifinderens mappevisning.
Avatar billede majbom Novice
23. august 2010 - 10:56 #3
dem du finder virker så ved onMOUSEOVER, det kan ændre til onCLICK, så det sker når du trykker i stedet for hover...
Avatar billede lsskaarup Nybegynder
23. august 2010 - 11:30 #4
Ja, det kan jeg selvfølgelig, jeg har også fundet en lavet i php/javascript nu. Den roder jeg lige lidt videre med, for den ser rimelig lovede nu.

Men du eller andre skal da være yderste velkomne til at komme med andre forslag.
Avatar billede lsskaarup Nybegynder
23. august 2010 - 15:08 #5
Hmm, okay det kom jeg så ikke så kangt med. Jeg kan godt få lagt mine egen hoved- og underakter ind, men jeg kan ikke lige gennemskue, hvordan jeg så igen, skal få underaktene til at udfolde sig, og deri have x-antal input felter.
Avatar billede lsskaarup Nybegynder
23. august 2010 - 15:36 #6
Mit største problem, er at jeg ikke kan se, hvordan ejg skal få den til at lave input felter under sidste niveau.

Den jeg sidder ogroder med er følgende: http://www.dhtmlgoodies.com/index.html?whichScript=folder_tree

Hvordan får jeg tilføjet inputer på nederste niveau enten i ovenstående eller i et andet eksempel. Det må gerne være simpelt ved et event. andet eksempel.
Avatar billede majbom Novice
23. august 2010 - 19:02 #7
umiddelbart vil jeg tro at det er "nemmere" at lave det fra bunden, du kan jo starte med at lave en alm liste med <ul> og <li> som du kan skjule/vise når der klikkes.

når det spiller kan du tilføje koden der opretter nye punkter
Avatar billede lsskaarup Nybegynder
24. august 2010 - 12:16 #8
Måske, men hvordan gør jeg så det?
Avatar billede majbom Novice
24. august 2010 - 19:01 #9
kan du lave en liste med ul og li? (http://www.html.dk/dokumentation/html4/tags/ul/)

så laver du en onclick på de punkter der skal kunne klikkes på som aktiverer en funktion der viser/skjuler underpunkterne (http://www.tjkdesign.com/articles/toggle_elements.asp)

tilføjelse af input-felter gør du ved brug af DOM (http://www.codingforums.com/archive/index.php/t-61293.html)
Avatar billede lsskaarup Nybegynder
25. august 2010 - 16:36 #10
Det med at vise/skjule underpunkterne kan jeg simpelthen ikke få til at virke i min kode, den melder hele tiden forskellige fejl i selve koden...

Men indtil videre har jeg fået lavet følgende liste

<ul>

<?php
    for ($i=1;$i<=count($UNDERAKT);$i++) {
        $underakt_nr = $UNDERAKT[$i]['nr'];
        $underakt_be = $UNDERAKT[$i]['beskrivelse'];
        $akr = substr($underakt_nr,0,1)."0";
        //print_r($HOVEDAKT);
        for($j=1;$j<=count($HOVEDAKT);$j++) {
            if (in_array($akr, $HOVEDAKT[$j])) {
                //echo $akr;
            }
        }
       
        ?>

<?        $query = "SELECT * FROM kalkulation WHERE ordre_id = '".addslashes($_GET['id'])."' AND underakt = $underakt_nr";   
        $sql = mysql_query($query) or die(mysql_error);
        $tæller = 0;
        if (!mysql_num_rows($sql) || !isset($sql)) { ?>
            <li>
            <?php echo $underakt_nr;?>
                <ul>
                        <input type="text" class="inputextrasmall" name="navn[]">
                        <input type="text" class="inputextrasmall" name="beskrivelse[]"/>
                        <!--<input type="text" class="inputextrasmall" name="kostpris[]">-->
                </ul>
        <? } else {?>
            <li>
            <?php echo $underakt_nr;
            while ($foo = mysql_fetch_assoc($sql)) {?>
                <ul>
                        <input type="text" name="underakt_id[]" value="<?php echo $foo['id']; ?>" />
                        <input type="text" class="inputextrasmall" name="navn[]" value="<?php echo $foo['navn']; ?>" />
                        <input type="text" class="inputextrasmall" name="beskrivelse[]" value="<?php echo $foo['beskrivelse']; ?>" />
                </ul>
            <? }
        } ?>
        </li>
    <? }?>
</ul>

Den er dog ikke helt færdig, for jeg skal have et niveau mere på eller øverst, men da indholdet til dette niveau også kommer fra et array, skal jeg lige have kringlet hvordan jeg får den inden, uden at ødelægge det nuværende.

Men jeg er kommet dertil, hvor jeg skal have bare én vis/skjul til at virke på et punkt. Det har jeg dog endnu ikke fundet af hvordan det skal gøres.
Avatar billede majbom Novice
25. august 2010 - 19:15 #11
måden at skjule dem på er at sætte en style på dem:

style="display:none;"


og når de skal vises, sætte du display til 'block'
Avatar billede lsskaarup Nybegynder
25. august 2010 - 20:37 #12
Ja, det fandt jeg også lige ud af. Jeg fandt et meget simpelt script, der virkede på <div>, så jeg tror det ender med at jeg smide <div> rundt om de aktuelle elementer, og så kalde funtionen.

<script language="javascript">
<!--
var state = 'none';

function showhide(layer_ref) {

    if (state == 'block') {
        state = 'none';
    } else {
        state = 'block';
    }

    if (document.all) { //IS IE 4 or 5 (or 6 beta)
        eval( "document.all." + layer_ref + ".style.display = state");
    }
   
    if (document.layers) { //IS NETSCAPE 4 or below
        document.layers[layer_ref].display = state;
    }
   
    if (document.getElementById &&!document.all) {
        hza = document.getElementById(layer_ref);
        hza.style.display = state;
    }
}

//-->
</script>

<offtopic>
Hvordan laver du egentlig de der rammer om koden?
</offtopic>
Avatar billede majbom Novice
25. august 2010 - 21:02 #13
hvorfor vil du have en div rundt om? du kan jo bruge display:'none' og display:'block' på dine li-tags...
Avatar billede majbom Novice
25. august 2010 - 21:03 #14
og til dit spørgsmål om rammer: http://www.eksperten.dk/guide/1325 :)
Avatar billede lsskaarup Nybegynder
26. august 2010 - 10:01 #15
Den eneste grund til div, var at kildeforfatteren skrev den var lavet til div, så det startede jeg med at prøve. Jeg har ikke nåete at prøve om den kan virke direkte på li-tags, men det vil jeg da lige.

p.s. Fedt med de tags, vidst slet ikke der var så mange, omend jeg kun vil bruge et fåtal af dem.
Avatar billede lsskaarup Nybegynder
26. august 2010 - 10:18 #16
Hmm, jeg kunne ikke lige få koden til at virke på <li>, så melder den at det ikke er at objekt.

Samtidig har jeg opdaget en lille uhensigtsmæssighed. Nu har jeg jo 3 niveauer i listen, hvor man skal kunne klikke på de 2 øverste. Jeg starter med at de alle skjult, så man kun kan se øverste niveau, men når jeg klikker og folder det ud, og herefter klikke på niveau 2, så sker der ikke noget, før jeg klikker igen. Det samme sker den anden vej.

Det er som om, at den ikke fatter det første klik, når man klikker på en andet niveau, men klikket lige før.

Har du en logisk forklaring på det?
Avatar billede lsskaarup Nybegynder
26. august 2010 - 13:26 #17
Smid forresten lige et svar, så du kan få point
Avatar billede majbom Novice
26. august 2010 - 18:16 #18
forstår ikke at det ikke virker på li, det mener jeg det burde...

fik du løst det hele?
Avatar billede lsskaarup Nybegynder
27. august 2010 - 08:59 #19
Det er sikkert fordi der lige skal tilpasses et eller andet i scriptet, men det har jeg ikke lige tid til at kigge nærmere på.

Men det ser ud til at virke, bort set fra det problem, med at det er som om den ikke alt fatter at man klikker, når man skifter imellem niveauerne.

Jeg kan ikke rigtigt se hvorfor, men tror måske det kan have noget at gøre med at jeg pt. bare bruger tekst som link, og selvom at jeg får "klik-hånd" ikoner frem, så rammer jeg måske lige netop uden for teksten.

Senere skal jeg have lagt pænere styles på dem, så kan jeg teste der om der har noget at sige.
Avatar billede majbom Novice
27. august 2010 - 09:10 #20
super, tak for point
Avatar billede lsskaarup Nybegynder
27. august 2010 - 13:44 #21
Velbekomme, og tak for hjælpen
Avatar billede majbom Novice
27. august 2010 - 19:09 #22
selv :)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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