Avatar billede lsskaarup Nybegynder
17. maj 2005 - 08:40 Der er 40 kommentarer og
1 løsning

Fange felt som har fået navn som et array

Ja, det er nok rimeligt simpelt, men jeg kan ikke lige nu se hvordan det skal gøres, og kunne ikke lige finde et spørgsmål herom på E!, selvom det sikkert er der.

Jeg har en række felter, som jeg skal have hevet værdien ud af , så jeg kan beregne noget med den. Problemet er at felternes navne (name) er kost1[1][1], kost1[1][2], kost1[2][1] osv. osv. indtil arrayet er tomt. Altså er det placeringerne i arrayet som ændre sig, alt efter hvor mange kostpriser til hver norm, som kost1[][] dækker over, brugeren indtaster.

Min form hedder ds, men når jeg prøver at hente ds.kost1[1][1].value, så tror den at den skal finde ds.kost1.1.1 og den finde jo logisk nok ikke.

Hvordan får jeg fat i arrayet?
Avatar billede busschou Praktikant
17. maj 2005 - 08:57 #1
hvordan gør du? sådan her?
document.getElementsByName('kost[1][1]') ?
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:00 #2
Nej, bare på formen og så feltets navn, altså ds.kost1[1][1], men jeg har også prøvet det andet og det virkede heller ikke.
Avatar billede busschou Praktikant
17. maj 2005 - 09:00 #3
er i tvivl om du kan gøre sådan her også
document.forms.ds.elements('kost[1][1]')
Avatar billede busschou Praktikant
17. maj 2005 - 09:05 #4
hmm måske ds('kost1[1][1]') ?
problemet må jo være at fordi det ikke er som en tekst streng at så opfatter den det anderledes
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:16 #5
Nej, det virker ikke rigtigt, og nok som du siger fordi navnet ikke er en "rigtig" streg.

document.forms.ds.elements('kost[1][1]') giver NULL og ds('kost1[1][1]') en fejl.
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:17 #6
Næ rettelse den sidste giver også NULL, men det er jo ikke meget bedre
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:19 #7
Hov, det virker med document.forms.de.elements(), jeg havde bare kopieret koden herfra, og lagde ikke lige mærke til at du kaldet feltet for kost istedet for kost1.
Avatar billede busschou Praktikant
17. maj 2005 - 09:20 #8
ahh hehe smutter ;o)
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:24 #9
Nu skal jeg bare have funktionen lavet så den dynamisk kan løbe alle felterne igennem. De løber fra kost1 - kost2, første parameter bliver dynamisk senere med er pt. fast, så den kan løbe fra kost1[1] til kost1[8], og den sidste er dynamisk, men løber dog nu fra kost1[][1] til kost1[][18].
Avatar billede busschou Praktikant
17. maj 2005 - 09:32 #10
den var værre for det er jo nemt nok nu når de er faste. Men hvordan skal man lure den dynamiske størrelse?
Du kunne vælge at give dem deres nuværende navn som id, det er jo unikt så det må være acceptabelt. Som name kunne du så give dem name="kost1" og name="kost2"
document.getElementsByName('kost1').length vil så være antallet af kost1
Problemet er så - hvor mange af dem er første parameter og hvor mange anden parameter...hmm svær
Avatar billede busschou Praktikant
17. maj 2005 - 09:38 #11
Med mindre du skal gøre det samme med hvert felt??
For så hvis jeg var dig så ville jeg give dem id="kost1[1][3]" osv og alle sammen name="kost", så kan du loope dem igennem sådan her
--
var elms = document.getElementsByName('kost')
for (i=0;i<elms.length;i++){
  //og så din kode her fx
  if(elms.value = 3){alert('du har tastet 3 men det er for meget'}
}
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:41 #12
name værdien vil jeg helst ikke ændre, da denne bruges via php til at gemme værdierne i felterne, og der lidt for meget der skal ændres hvis det skal laves om.
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:45 #13
For at gøre det mere synligt, kan jeg sige at opbygningenmæssigt kan du sammenligne det med en tabel. Dem har jeg 4 af, deraf kost1 til kost4. Rækkerne i hver tabel er så den første parameter, altså kost1[1]. Den er pt. max. 8, men bliver altså nok dynamisk i fremtiden. Kolonnerne er så den sidste parameter, altså kost1[][1]. Den er på 16 pt, men er dynamisk.
Avatar billede busschou Praktikant
17. maj 2005 - 09:45 #14
Ok .. men hvis du i php laver siden, så vil du jo også i php vide hvor mange du genererer...du vil også i php udskrive den js funktion som skal loope elementerne igennem :o)
dvs du i php kan finde størrelserne på array´ne og i <scipt> uden for din funktion kan erklære størrelsen
Avatar billede busschou Praktikant
17. maj 2005 - 09:47 #15
Det kan jeg såmen sagtens følge dig i :o)
Problemet er jo bare at de ikke er arrays i js, kun i php
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 09:52 #16
Til din kommentar: 17/05-2005 09:45:59

Så du mener jeg måske skulle lave nogle hidden felter, som indeholder størrelserne på arrays? Det er en tænke jeg slet ikke er set på.
Avatar billede busschou Praktikant
17. maj 2005 - 09:55 #17
ja det er bestemt en mulighed med hidden fields, et til hver størrelse
<input type="hidden" id="kost1_1" value="8">
<input type="hidden" id="kost1_2" value="18">
<input type="hidden" id="kost2_1" value="5">
<input type="hidden" id="kost2_2" value="22">
sådan noget lignende
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 10:12 #18
Okay, jeg har nu lavet hidden felterne og fanger dem også, men hvordan får værdien lagt i document.forms.ds.elements('kost1[rakke][1]').

rakke er js-værdien som kommer fra php.
Avatar billede busschou Praktikant
17. maj 2005 - 10:17 #19
hvis rakke er en js værdi så
document.forms.ds.elements('kost1['+rakke+'][1]')
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 10:30 #20
Hold kæft hvor kan man være dum, jeg tror sgu ikke helt min hjerne er komemt fra "ferie" endnu. Der skulle selvfølgelig ikke stå rakke med i, som er variablen fra forløkken, men anyway, det gør jo ikke det store forskel.

Det ser ud til at virke, jeg får i hvertfald de rigtigt værdier printet ud. Nu skal jeg bare lige have løbet alle felter igennem, beregnet noget derpå og lagt den ny værdi i de gamle felter.

Som Garfield sagde til Futte, da han så 3 pakker lasagne. "Cover me, I'm going in." ;-)

Jeg lader lige spg. stå åbent indtil det hele virker, det kunne jo være jeg løb i andre problemer, ok?
Avatar billede busschou Praktikant
17. maj 2005 - 10:35 #21
hehe helt oki
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 14:18 #22
Okay, så er jeg har igen, men er næsten færdig nu. ;-)

Jeg har bare et problem. Jeg skal have fat i et nyt array, som bliver lavet i en php-siden for sig selv, denne bliver som included i php-siden jeg nu arbejder på.

Arrayet hedder $TILLAEGOVERFLADE, men jeg synes ikke rigtigt jeg kan få fat i arrayet, hvor jeg skal bruge de forskellige værdi til udregningen.
Avatar billede busschou Praktikant
17. maj 2005 - 14:23 #23
Nu er jeg ikke super haj til php
Men jeg vil mene at hvis du i en fil includer en anden så bør du derefter kunne referere til dine variable i den includerede fil. Men selvfølgelig ikke før
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 14:39 #24
Selvom php-koden hvor jeg includer siden med $TILLAEGOVERFLADE ligger aller først og javascript delen først kommer derefter, så er det som om det ikke findes. Her det noget at sige, at beregningen først skal udføres når jeg trykker på en knap?
Avatar billede busschou Praktikant
17. maj 2005 - 14:52 #25
Nu er jeg ikke med.. snakker vi php variable eller js variable?
Prøv lige at poste din kode - så er det måske mere overskueligt :o)
Avatar billede roenving Novice
17. maj 2005 - 15:01 #26
-- og det hører jo så også med, at elements er en collection, og derfor skal adresseres med array-notation (selvom jeg også godt ved, at IE er ligeglad !-)

ds.elements['kost1[' + firstRow + '][' + secondRow + ']'].value
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:19 #27
Du får bare lige starten.

<?php
    include('../static/afsnit9.php');
    include('../static/afsnit3.php');
?>

<script language="javascript">
<?php echo $TILLAEGOVERFLADE[$mld];?>;
    function validate(){
        var rakke = document.forms.ds.elements('rakke').value;
        var kolonne = document.forms.ds.elements('kolonne').value;
        var antaltyper = document.forms.ds.elements('antaltyper').value;
        var tillag = document.forms.ds.elements('tillag').value;


        if (rakke == "" || kolonne == ""){
            alert("Grundet en fejl i antallet af produktionsmetoder, korrosionklasser samt spændvidder/vægtklasser, kan værdierne ikke udregnes. Opdatere siden og prøv igen. Se du denne fejl igen, så kontakt systemudvikleren.");
        } else {






            for (i=1; i<=rakke; i++){
            <?php $mld = 1;?>;
                for (j=1; j<=kolonne; j++) {

               

                    modulus = j % antaltyper;
                    if (modulus==0){
                        modulus=antaltyper;
                    }
//            alert(modulus);
                    if(j>antaltyper) {
                        var originale = document.forms.ds.elements('kost1['+i+']['+modulus+']').value;
                        //tillag = <?php echo $TILLAEGOVERFLADE[$mld];?>;
                        //var tillag = document.forms.ds.elements('TILLAEGOVERFLADE['+mld+']').value;
                        //var tmp = originale + tillag;
                        alert(tillag);
                        var ib = Math.round((originale)*100)/100;

                        //alert(tillag);
                        document.forms.ds.elements('kost1['+i+']['+j+']').value = ib;

                        if(modulus==antaltyper){
                            <?php $mld++;?>;
                        }
                    } else {
                        var originale = document.forms.ds.elements('kost1['+i+']['+modulus+']').value;

                        var ib = Math.round(originale*100)/100;

                        //alert(ib);

                        document.forms.ds.elements('kost1['+i+']['+j+']').value = ib;

                        if(modulus==antaltyper){
                            <?php $mld++;?>;
                        }
                    }
            //alert(mld);
            }
            }
            //document.ds.submit();
        }
    }
</script>


Afsnit3.php, som indeholder $TILLAEGOVERFLADE[]. Ved godt at 1 mangler, med det er en lille bug, som ikke betyder noget.
    $TILLAEGOVERFLADE = array(
        "2" => "0.25",
    "3" => "0.65",
    "4" => "1.05",
    "5" => "1.9",
    "6" => "1.9",

Det er altså den jeg skal bruge, og løbe igennem, pt for hvert tredje af de tidligere nævnte felter.
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:23 #28
Jeg kan selvfølgelig også lave et hidden felt til hver array værdi, men det må da kunne gøres på en anden måde.
Avatar billede busschou Praktikant
17. maj 2005 - 15:23 #29
og du har defineret $mld?
Avatar billede busschou Praktikant
17. maj 2005 - 15:26 #30
hmm jeg kan ikke rigtig se hvor det går galt desværre
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:28 #31
Jeg skulle mener at $mld er defineret

<?php $mld = 1;?>;

men det er som den ikke er med i "vis kilde"
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:29 #32
Men ellers vil du mene jeg gør det rigtigt nok?
Avatar billede busschou Praktikant
17. maj 2005 - 15:36 #33
hvis det er det her der går galt
//var tillag = document.forms.ds.elements('TILLAEGOVERFLADE['+mld+']').value;
Så skal det jo være
//var tillag = document.forms.ds.elements('<?=$TILLAEGOVERFLADE[$mld]?>').value;
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:42 #34
Det har jeg prøvet i linien ovenover, men det får ingen værdi.
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:43 #35
I vis kilde ser den sådanne ud så:
var tillag = document.forms.ds.elements('').value;
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:44 #36
Men den er jo som sådan ikke med i formen ds, og skal elements bruges når det ikke er felter, men "kun" et array?
Avatar billede busschou Praktikant
17. maj 2005 - 15:45 #37
strange måske du skulle putte et spørgsmål i php kategorien. For hvis de variable ikke kommer med når du inkluderer...hmm..
Ja så aner jeg ikke hvorfor de ikke gør det :o(
Avatar billede busschou Praktikant
17. maj 2005 - 15:47 #38
ok nu har du tabt mig hehe
Hvad er det præcis du ønsker?. Tror jeg har misforstået noget
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 15:57 #39
Det er ikke fordi variablerne ikke kommer med, jeg bruger dem senere, jeg kan bare ikke fange lige netop arrayet $TILLAEGOVERFLADE i js.

Men selvom det er lidt kompleks at forklare kan jeg da prøve.

Det er et administrationmodul til et system som er i brug.

På en af siderne i admin, kan brugerne angiver en masse ting, bl.a. hvor mange korrosionsklasser der  er(grund., galvaniseret o.l.), samt hvad ekstra prisen er for disse i forhold til ingen, som er 0.

Disse værdier bliver faktisk skrevet i en fil på serveren, som dog er en ren php-fil. Det er bl.a. denne som includes, og heri ligger $TILLAEGOVERFLADE[].

På en anden side i admin, skal brugerne så indtaste en grundpris for deres varer, uden overfladebehandling (korrosion). Derefter skal de resterende felter, udregnes alt efter hvilken overfladebehandling samt produktionsmetode(robot, cnc o.l.) de har.

Dette sker ved klik på en knap, som altså kalder functionen validate(), som så skal udregne felternes pålydende værdi og skrive den i dem. Dertil skal jeg altså bruge overfladeprisen ($TILLAEGOVERFLADE) i js.

Problemet er at få fat i den, udregningerne skulle ikke være noget problem, hvis bare jeg har en værdi at kunne lægge til.

Håber det letter lidt på tågen ;-)
Avatar billede lsskaarup Nybegynder
17. maj 2005 - 16:02 #40
Ahhh, det kan måske skyldes at den første er tom, idet jeg mangler $TILLAEGOVERFLADE[1]. Nå det kigger jeg videre på i morgen.
Avatar billede lsskaarup Nybegynder
18. maj 2005 - 09:45 #41
Hele min kode ser sådan ud nu:

    function validate(){
        var rakke = document.forms.ds.elements('rakke').value;
        var kolonne = document.forms.ds.elements('kolonne').value;
        var antaltyper = document.forms.ds.elements('antaltyper').value;
        //var tillag = document.forms.ds.elements('tillag').value;


        if (rakke == "" || kolonne == ""){
            alert("På grund af en fejl i antallet af produktionsmetoder, korrosionklasser samt spændvidder/vægtklasser, kan værdierne ikke udregnes. Opdatere siden og prøv igen. Se du denne fejl igen, så kontakt systemudvikleren.");
        } else {

            for (i=1; i<=rakke; i++){
            var lars=1;
            <?php echo $mld = 1;
            $tip = 0;?>;
                for (j=1; j<=kolonne; j++) {
                    //alert(j);//giver 1-18 pt
                    modulus = j % antaltyper;
                    if (modulus==0){
                        modulus=antaltyper;
                    }
                   

                    //alert(modulus);
                    //alert(antaltyper);
                    if(j>antaltyper) {
                        alert(<?php echo $tip;?>);
                        var originale = document.forms.ds.elements('kost1['+i+']['+modulus+']').value;
                        //var tmp = <?php echo $TILLAEGOVERFLADE[$mld];?>;
                        //var tillag = document.forms.ds.elements('<?php echo $TILLAEGOVERFLADE[$mld];?>');
                        //var tillag = document.forms.ds.elements('TILLAEGOVERFLADE['+lars+']').value;
                        //var tmp = originale + tillag;
                        //alert(<?php echo $mld;?>);
                        var ib = Math.round((originale)*100)/100;

                        //alert(tillag);
                        document.forms.ds.elements('kost1['+i+']['+j+']').value = ib;

                        if(modulus==antaltyper){
                            lars++;
                            //alert("sdfsdfsdf");
                            //alert(<?php echo $mld++;?>);
                        }
                       
                    } else {


                        var originale = document.forms.ds.elements('kost1['+i+']['+modulus+']').value;

                        var ib = Math.round(originale*100)/100;

                        //alert(ib);

                        document.forms.ds.elements('kost1['+i+']['+j+']').value = ib;

                        if(modulus==antaltyper){
                            lars++;
                            //alert("1");
                            <?php echo $mld++;?>;
                        }
                    }
                //var trist = lars+" "+j;
                //alert(lars+" "+j);
                }
            }
            //document.ds.submit();
        }
    }

Mit problem er den udkommenterede linie, //var tmp = <?php echo $TILLAEGOVERFLADE[$mld];?>;

Her skulle jeg have $mld til automatisk at komme med en placering i arrayet $TILLAEGOVERFLADE, men $mld bliver ikke talt op mærkeligt nok. Derimod kan jeg godt få talt en js-variabel op, men hvordan få jeg den ind i linie i stedet for $mld?
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