Avatar billede idipot Nybegynder
03. februar 2012 - 21:09 Der er 18 kommentarer og
1 løsning

Hjælp til at lave formular kategorier

Hej alle!

Jeg ved ikke helt hvordan jeg skal forklare dette. Jeg har ikke været i stand til at søge på noget der rammer det, da jeg ikke ved hvordan jeg skal beskrive det i et ord.
Jeg har hårdt brug hjælp til at lave en formular, der ligesom her på siden når der oprettes spørgsmål "skal vælges en kategori, før næste dropdown vælges".
Eksempel:
Når der skal oprettes spørgsmål her på siden, skal man først vælge en overkategori, før næste og sidste kategori skal vælges.
Jeg går ud fra, at man kan bruge JavaScript til at løse dette problem.
Avatar billede olebole Juniormester
03. februar 2012 - 21:18 #1
<ole>

Hvor kommer indholdet fra - og hvad er det helt præcist?

/mvh
</bole>
Avatar billede idipot Nybegynder
04. februar 2012 - 13:47 #2
Jeg skal bare have et par dropdown-boxe. Ligesom her på siden, hvor man først vælger kategori og derefter underkategori. Som fx herinde når man opretter et spørgsmål.

Først vælger man programmering, så kan man vælge scripting og så derefter vælge PHP.
Avatar billede olebole Juniormester
04. februar 2012 - 16:45 #3
Hvor skal indholdet i de dropdowns komme fra? Et databasetræk eller?
Avatar billede idipot Nybegynder
04. februar 2012 - 16:51 #4
Ja det vil nok være mest praktisk fra database.
Avatar billede olebole Juniormester
04. februar 2012 - 18:09 #5
Ved du helt selv, hvad det er, du vil lave? I så fald skal du nok være lidt mere informativ. Ellers skal man være clairvoyant for at hjælpe  =)
Avatar billede idipot Nybegynder
04. februar 2012 - 18:18 #6
Altså, når du opretter et spørgsmål på eksperten.dk skal du først vælge en kategori i en dropdown-box, før du kan vælge den næste subkategori, hvor du til sidst kan vælge en underkategori.
Hvis jeg fx skal oprette et spørgsmål vedrørende JavaScript, skal jeg først vælge emnet programmering, derefter scripting og derefter javascript. Så de forskellige variable skal selvfølgelig være afhængige af hinanden.
Avatar billede olsensweb.dk Ekspert
04. februar 2012 - 20:03 #7
@idipot jeg tror ikke olebole har svært ved at forstå spørgsmålet, men snarre mangler der en del oplysninger:
har du adgang til et serverside sprog ?? hvilke (PHP, ASP, .NET, JAVA,....)
anvender du en database ?? hvilke (MSSQL, MYSQL,...), hvordan er din tabel structur
hvordan er dine data organiseret ?? array (clientside / serverside) / database

hvis du anvender et serverside sprog og en database kunne du kigge på AJAX, (iøvrigt det som E bruger til deres dropdown menu)
advarsel der findes på nettet en masse tut om emnet, men alle dem jeg har set retunerer HTML data, istedet for XML / JSON encodet data, eller på anden måde bare rå data.
olebole er så hvidt jeg husker ved at skrive et tut der overholder standarterne om emnet, så den ser jeg frem til at læse.

for at få noget ud af AJAX skal du have en rimelig forståelse at JS/serverside/SQL
prøv at google
ajax tutorial
ajax select box menu
Avatar billede olebole Juniormester
04. februar 2012 - 20:09 #8
- og hvis der er tale om ret få kategorier, er Ajax klart overkill. Så er det langt mere effektivt at skrive et array i en JS-fil.

Men, som ronols skriver, fortæller du intet om den applikation, det skal virke i  =)
Avatar billede idipot Nybegynder
05. februar 2012 - 15:42 #9
Jeg har en smule erfaring med ajax og Json. Jeg aner bare ikke hvad jeg skal "kalde" mit problem, for det er jo ikke kun en dropdown-menu jeg skal lave.
Jeg tænker at et JS-array vil virke, men det vil helt klart være mere optimalt hvis det bliver trukket ud fra en MySQL-database og brugt sammen med PHP.

Jeg kan give et eksempel på, hvad det er jeg skal have lavet.

Jeg skal have lavet en dropdown-boks som består af forskellige kategorier inde for akademiske discipliner.

Social sciences
Humanities
Natural sciences
osv.

Under "social sciences" dropdown, som aktiveres når man har valgt foregående skal man så fx kunne vælge

Social studies
Economics
osv.

og under "economics" drop-down, som aktiveres når man har valgt foregående skal man så her igen kunne vælge fx

Microeconomics
Macroeconomics
Managerial economics

Det vil helt klart være fordelagtigt hvis det er databaseudtræk - det er dog ikke et must.
osv.
Avatar billede idipot Nybegynder
05. februar 2012 - 15:45 #10
NOTE: Der er ret mange kategorier og subkategorier, så AJAX vil nok være at foretrække.
Avatar billede olebole Juniormester
05. februar 2012 - 21:42 #11
Ja, så er Ajax klart løsningen. Det er ikke helt simpelt, men prøv at følge princippet i denne kode - og spørg, hvis der er noget, du er i tvivl om eller undrer dig over:

<script type="text/javascript">
function getTheRest(elmSrc, elmDestID) {
    var oXHR = new XMLHttpRequest(),
    sVal = elmSrc.value,
    sQuery = "context=getSomething&dest="+elmDestID+"&value="+encodeURIComponent(sVal);
   
    oXHR.open("post", "response.php", true);
    oXHR.setRequestHeader("Content-Type: application/x-www-form-urlencoded; charset=utf-8");
    oXHR.onreadystatechange = function() {
        if (this.readyState<4) return;
        fillSelect(this.responseText);
    }
    oXHR.send(sQuery);
}
function fillSelect(sResp) {
    var oResp = null;
    try {
        oResp = JSON.parse(sResp);
    }
    catch(e) {
        return alert("Fejl: Responsen fra serveren kunne ikke parses.");
    }
    if (oResp.error) return alert("Fejl: "+oResp.error);
   
    var oTempl, elmTemp, elmDest = document.getElementById(oResp.dest);
    while (elmDest.firstChild!==elmDest.lastChild) {
        elmDest.removeChild(elmDest.lastChild);
    }
    oTempl = elmDest.removeChild(elmDest.firstChild);
   
    for (var i=0,j=oResp.rows.length; i<j; i++) {
        elmTemp = oTempl.cloneNode(true);
        elmTemp.setAttribute("value", oResp.rows.val);
        elmTemp.firstChild.nodeValue = oResp.rows[i].txt;
        elmDest.appendChild(elmTemp);
    }
   
    elmDest.attributes.removeNamedItem("disabled");
    oResp = oTempl = null;
}
</script>

<div>
    <select id="sel_1" onchange="getTheRest(this, 'sel_2')">
        <option value="-1">Vælg ...</option>
        <option value="foo">Foo</option>
        <option value="bar">Bar</option>
        <option value="foobar">FooBar</option>
    </select>
   
    <select id="sel_2" disabled="disabled">
        <option>&nbsp;</option>
    </select>
</div>

response.php kunne så se nogenlunde sådan ud:

<?php
/* Functions for different tasks */
function getSomething($json) {
    /* Pseudo code: $res = Query DB using $_POST['value'] */
    $res = [MYSQL_QUERY];
   
    $rows = array();
    while ($row=mysql_fetch_object($res)) {
        $rows = $row;
    }
    $json->rows = $rows;
    return $json;
}
/* ------- Functions End ------- */

if (!empty($_POST)) {
    header('Content-Type: application/json; charset=utf-8');
    $json = new stdClass();
   
    if (isset($_POST['context'])) {
        switch ($_POST['context']) {
            case 'getSomething':
                $json = getSomething($json);
            break;
           
            default:
                $json->error = 'Unknown contextID: "'.$_POST['context'].'"';
        }
    }
    else $json->error = 'No contextID found.';
   
    echo json_encode($json);
}
?>

I HTML-filen skal du lægge mærke til, at den enlige option (og standarden kræver, der er mindst én option) [i]skal
indeholde tekst - mindst et &nbsp;. Ellers virker scriptet ikke (elmTemp.firstChild.nodeValue vil fejle uden).

Læg også mærke til de to værdier 'val' og 'txt', som skal svare til feltnavnene i databasen:

elmTemp.setAttribute("value", oResp.rows[i].val);
elmTemp.firstChild.nodeValue = oResp.rows[i].txt;

Læg også mærke til at jeg referer til oXHR-objektet med nøgleordet this indenfor event handleren. Det gør jeg for at undgå en cirkulær reference over en closure (= memory leak i IE før version 9).

Skulle der opstå en fejl i funktionen getTheRest i PHP-filen, kan du jo sætte den som $json->error og straks returnere $json til kaldet i switchen. Så kan den aflæses i alert'en i HTML-filen.

Koden er skrevet fra hoften uden test. Jeg har efterhånden øvelsen (nu må jeg zq snart få skrevet den guide færdig!), men ronols må meget gerne kikke med og klappe mig én i nakken, hvis der skulle være fejl  =)
Avatar billede olebole Juniormester
05. februar 2012 - 21:52 #12
Jeg glemte at sætte $json->dest i PHP-funktionen:

function getSomething($json) {
    /* Pseudo code: $res = Query DB using $_POST['value'] */
    $res = [MYSQL_QUERY];
   
    $rows = array();
    while ($row=mysql_fetch_object($res)) {
        $rows = $row;
    }
    $json->rows = $rows;
    $json->dest = $_POST['dest'];
    return $json;
}

Du kan selv føje flere funktioner til med tilhørende contextID'er i switchen, så filen kan bruges til andre forespørgsler, efterhånden som det måtte blive aktuelt.

Folk, der kender mig, ved, at jeg selv ville bruge prepared statements i MySQLI, som er langt sikrere og hurtigere ved gentagne kald end det gamle (efterhånden forældede) MySQL-API. Jeg har ikke gjort det her, så flere kan følge med  =)

Skulle du få lyst til at begynde med MySQLI (MySQL Improved), kan du kikke på denne tutorial. Det betaler sig  *o)
Avatar billede idipot Nybegynder
06. februar 2012 - 00:58 #13
Jeg har leget lidt rundt med dit script men kan ikke helt få det til at virke. Jeg har faktisk fundet præcis det jeg har brug for, se eksempel her:

http://www.plus2net.com/php_tutorial/dd3.php

og tutorial:

http://www.plus2net.com/php_tutorial/php_drop_down_list.php

Mit spørgsmål er så nu, hvordan får jeg "disabled" de to sidste dropdown-boxes så de ikke kan vælges før den første er valgt?
Avatar billede olebole Juniormester
06. februar 2012 - 01:26 #14
Et eller andet sted i PHP-koden kan du vel bare sætte/fjerne en disabled attribut på de to selects.

Koden og hele opbygningen er dog fra WWW's yngre stenalder, hvilket alene ses af DTD'en. Sådan en har jeg ikke set siden slutningen af 90'erne  :D
Avatar billede olebole Juniormester
06. februar 2012 - 01:29 #15
- men hvad er det, du ikke kan få til at virke? Hvis ikke det virker får du vel fejl. Du har da vel forhåbentlig slået fejlmeddelelser til i din browser og alle fejlmeddelelser i PHP. Ellers er der ikke mening i at forsøge at skrive webkode
Avatar billede olebole Juniormester
06. februar 2012 - 01:34 #16
Arrrhhg ...! FUCK Ekspertens total imbecilt kodede BB-kodesystem! Vi skal da for helvede kunne skrive kode ...!!! Hvorfor er det dog så umuligt at tænke sig om ...?!??!!! Ynkeligt!
Avatar billede olebole Juniormester
06. februar 2012 - 01:36 #17
Sorry idipot, men det er Ekspertens BB-kodesystem, der ikke duer - og for Gud ved hvilken gang har smadret et langt indlæg! Jeg gider ikke skrive det en gang til! Jeg er ude af tråden
Avatar billede olsensweb.dk Ekspert
06. februar 2012 - 19:08 #18
prøv at google
js chained select box
php ajax chained select box

jeg har i tidernes morgen skrevet denne menu, men mangler at lave en beskrivelse, samt noget optimering
demo komplet source
Avatar billede idipot Nybegynder
18. april 2012 - 07:59 #19
...
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