Avatar billede cybermaster Nybegynder
09. marts 2007 - 18:16 Der er 30 kommentarer og
1 løsning

form text felt skal finde i array og sætte ind

Hej med jer, vil meget gerne have hjælp til hvordan jeg laver et array, der indeholder (Item, Stock, Qty, Description, Price, Price_Total)

Jeg har alle informationer liggende i en mysql datavase, så de kan udtrækkes, hvordan det skal være.

----udklip af formen--------
<form method="POST" action="--WEBBOT-SELF--">
    <table border="1" width="100%" id="table1">
        <tr>
            <td>Item:</td>
            <td>Stock:</td>
            <td>Qty:</td>
            <td>Description:</td>
            <td>Price:</td>
            <td>Price Total:</td>
        </tr>
        <tr>
            <td><input type="text" name="item" size="14"></td>
            <td><input type="text" name="stock" size="14"></td>
            <td><input type="text" name="qty" size="14"></td>
            <td><input type="text" name="description" size="14"></td>
            <td><input type="text" name="price" size="14"></td>
            <td><input type="text" name="price_total" size="14"></td>
        </tr>
        <tr>
            <td><input type="text" name="item" size="14"></td>
            <td><input type="text" name="stock" size="14"></td>
            <td><input type="text" name="qty" size="14"></td>
            <td><input type="text" name="description" size="14"></td>
            <td><input type="text" name="price" size="14"></td>
            <td><input type="text" name="price_total" size="14"></td>
        </tr>
    </table>
</form>

------ Klip slut --------

Så når der skrives i "item" feltet der er et 5 cifret tal, så skal den retunerer indholdet til de andre felter.

De 2 felter "Qty" og "Total_price"
Når Item er hentet skal Qty være "1" og "Total_price" være lig med prisen, Ellers skal "Total_price" være lig med prisen gange "Qty".

Håber i forstår.

Mvh.
Avatar billede roenving Novice
10. marts 2007 - 00:55 #1
Hvor mange rækker har du ?-)

-- for hvis det er mange, kan det nok ikke betale sig at lave et javascript-objekt, men en 10-20 stykker ad gangen vil ikke være noget problem !-)
Avatar billede cybermaster Nybegynder
10. marts 2007 - 11:43 #2
Havde en ide om ca 50 rækker & Selv array'et skulle gerne indeholde ca. 1500 rækker.

Grunden til jeg ikke laver det i PHP er for at kunne se det "on the fly" om man skriver den rigtige kode.

Mvh.
Avatar billede roenving Novice
10. marts 2007 - 14:33 #3
Hvis alle de data skal være til rådighed, så kommer der en situation, hvor det faktisk nok er bedre og hurtigere at slå op i selve databasen med noget ajax-noget !-)
Avatar billede cybermaster Nybegynder
10. marts 2007 - 14:58 #4
Ok, der satte du mig af... Ajax ;o) hva?
Avatar billede roenving Novice
10. marts 2007 - 15:06 #5
Ved hver gang, der tastes at lave et kald til serveren, hvor data så hentes og indsættes i de relevante felter !-)

Ajax = Asynkron Javascript Og Xml (xml er dog nok ikke optimalt til denne opgave, det vil nok nærmere være json, JavaScript Object Notation !o]
Avatar billede cybermaster Nybegynder
10. marts 2007 - 15:14 #6
Ok, men er det noget der skal instalerers på servren, eller er det klient baseret?
Avatar billede roenving Novice
10. marts 2007 - 15:35 #7
Du laver en simpel side serverside, som laver opslaget i databasen og returnerer en minimal fil med de nødvendige oplysninger, smartest med json (som også er integreret i f.eks. php !-)

Clientside indsætter du en stribe relativ simpel javascript, som foretager forespørgslen mod serveren, modtager data og indsætter dem i dokumentet via DOM ...

-- til slut kan du jo så kalde en opdatering af f.eks. fakturasum e.l.
Avatar billede cybermaster Nybegynder
10. marts 2007 - 16:07 #8
Jammen det lyder jo ganske ligetil... eller noget :o)

Har du mulighed for at lave et eksempel til mig?
Avatar billede roenving Novice
10. marts 2007 - 16:40 #9
*lol*

-- ja, principielt er det så simpelt, at det er svært at forstå, at sådan noget ikke har været udbredt i årevis ...

-- serverside-koden kan jeg ikke lave for dig, men json-objektet, der returneres skal f.eks. se sådan ud:

{"item":12345,"stock":15,"description":"En højkvalitets støvsugerpose til Xqv 19665","price":143.75}

Rækken med tingene skal så have en event på indtastning i item:

        <tr>
            <td><input type="text" name="item" size="14" onchange="getDetails(this)"></td>
            <td><input type="text" name="stock" size="14"></td>
            <td><input type="text" name="qty" size="14" onchange="updateTotals(this);"></td>
            <td><input type="text" name="description" size="14"></td>
            <td><input type="text" name="price" size="14"></td>
            <td><input type="text" name="price_total" size="14"></td>
        </tr>

Script-koden bliver så ca. således (absolut utestet, skrevet lige her, og sikkert derfor en anelse hrm ...)

<script type="text/javascript">
function getXmlHttpObject(){
  try{
    xmlHttp = new XMLHttpRequest();
  }catch(e){
    try{
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return xmlHttp;
}
function getDetails(elm){
  var url = "/getDataForItem.php?item=" + elm.value;
  var obj = retrieveData(url);
  var elms = elm.parentNode.parentNode.getElementsByTagName("input");
  var priceElm = null;
  for(i=0,im=elms.length;im>i;i++){
    //kun nødvendig, hvis din prisopdatering skal bruge et specifikt felt, det ville jeg ikke selv gøre
    if(elms[i].name = "price")priceElm = elms[i];
    //opdater felter
    if(obj[elms[i].name]){
      elms[i].value = obj[elms[i].name];
    }else if(elms[i].name == "qty")
      elms[i].value = 1;
    }else if(elms[i].name == "price_total")
      elms[i].value = obj["price"];
    }
  }
  updateTotals(priceElm);
}
function retrieveData(url){
  var xmlHttp = getXmlHttpObject();
  if(xmlHttp){
    xmlHttp.onreadystatechange = function(){
      if (xmlHttp.readyState == 4){
        return eval("(" + xmlHttp.responseText + ")");
      }
    }
    xmlHttp.open("GET",url);
    xmlHttp.send(null);
  }else{
    alert("fejl");//Sæt selv en ordentlig fejlmeddelelse
    return null;
  }
}
//og så skal du nok også have en funktion, der opdaterer totaler
function updateTotals(elm){
  var f = elm.form;//form-elementet skal du bruge
  //resten af koden må du selv tilføje
}
</script>

Som sagt ganske utestet !-)
Avatar billede roenving Novice
10. marts 2007 - 16:51 #10
Hov noget af det skal laves direkte omvendt, for vi skal jo vente med at indsætte til alle data er tilstede:

getXmlHttpObject er fin nok, getDetails og retrieveData bliver så:

function getDetails(elm){
  var url = "/getDataForItem.php?item=" + elm.value;
  retrieveData(url,elm);
}
function retrieveData(url,elm){
  var xmlHttp = getXmlHttpObject();
  if(xmlHttp){
    xmlHttp.onreadystatechange = function(){
      if (xmlHttp.readyState == 4){
        insertData(eval("(" + xmlHttp.responseText + ")"),elm);
      }
    }
    xmlHttp.open("GET",url);
    xmlHttp.send(null);
  }else{
    alert("fejl");//Sæt selv en ordentlig fejlmeddelelse
    return null;
  }
}
-- og så en ny funktion:

function insertData(obj,elm){
  var elms = elm.parentNode.parentNode.getElementsByTagName("input");
  var priceElm = null;
  for(i=0,im=elms.length;im>i;i++){
    //kun nødvendig, hvis din prisopdatering skal bruge et specifikt felt, det ville jeg ikke selv gøre
    if(elms[i].name = "price")priceElm = elms[i];
    //opdater felter
    if(obj[elms[i].name]){
      elms[i].value = obj[elms[i].name];
    }else if(elms[i].name == "qty")
      elms[i].value = 1;
    }else if(elms[i].name == "price_total")
      elms[i].value = obj["price"];
    }
  }
  updateTotals(priceElm);
}
Avatar billede roenving Novice
10. marts 2007 - 16:54 #11
-- og en fejl mere:

    if(elms[i].name == "price")priceElm = elms[i];
Avatar billede cybermaster Nybegynder
10. marts 2007 - 19:48 #12
Det giver da lidt mening ;o) Så nu sidder jeg og leger lidt med det og prøver at få tingene til at ske. Det hjælper jo også når man kigger lidt i din kode, og søger lidt på nogle af de ting der virker lidt "sorte".

Ud fra det fandt jeg noget på google.
http://www.w3schools.com/php/php_ajax_database.asp

Dit script, sammen med denne kode, tror helt sikkert er vejen frem.

Så jeg siger mange tak for hjælpen ;o)

Og det ville være cool, hvis du ligger et svar.

Mvh. og god weekend ;o)
Avatar billede cybermaster Nybegynder
10. marts 2007 - 19:59 #13
Jeg bliver desværre nødt til at smutte, skal være til middag kl. 20:00 ... så må vist heller smutte, men kommer igen i morgen. Hygge

Mvh
Avatar billede roenving Novice
10. marts 2007 - 23:19 #14
Ja, du kan sagtens bruge w3schools tutorial som inspiration, men bemærk, at det er endnu et af de steder, hvor w3schools tutorial er fuldstændig ude på et sidespor, for der er ikke meget af ideen i ajax tilbage, hvis man benytter færdigformattering i html på serveren og innerHTML på klienten ...

-- det første fordi hele ideen er, at så meget processering som muligt skal overlades til klienten, det andet fordi der ikke findes noget innerHTML i nogle rekommendationer og det vil få en browser, der arbejder x(ht)ml-baseret til at gå ned med et hult drøn med en xml-fejl !-)

-- men hvis du ud fra eksemplet kan stable et json-objekt på benene er det helt fint !-)
Avatar billede cybermaster Nybegynder
11. marts 2007 - 23:47 #15
Har leget lidt med det her til aften, men prøver at få det til at blive færdigt i morgen.

mvh
Avatar billede roenving Novice
12. marts 2007 - 00:17 #16
¡Es muy bueno!
Avatar billede cybermaster Nybegynder
12. marts 2007 - 19:26 #17
Kan ikke få det til at funge, der sker ikke så meget når jeg skriver et tal.
Kan du evt. se hvad der kunne være galt.

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

<script type="text/javascript">
function getXmlHttpObject(){
  try{
    xmlHttp = new XMLHttpRequest();
  }catch(e){
    try{
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return xmlHttp;
}
function getDetails(elm){
  var url = "../scripts/getDataForItem.php?item=" + elm.value;
  retrieveData(url,elm);
}
function retrieveData(url,elm){
  var xmlHttp = getXmlHttpObject();
  if(xmlHttp){
    xmlHttp.onreadystatechange = function(){
      if (xmlHttp.readyState == 4){
        insertData(eval("(" + xmlHttp.responseText + ")"),elm);
      }
    }
    xmlHttp.open("GET",url);
    xmlHttp.send(null);
  }else{
    alert("fejl");//Sæt selv en ordentlig fejlmeddelelse
    return null;
  }
}

function insertData(obj,elm){
  var elms = elm.parentNode.parentNode.getElementsByTagName("input");
  var priceElm = null;
  for(i=0,im=elms.length;im>i;i++){
    //kun nødvendig, hvis din prisopdatering skal bruge et specifikt felt, det ville jeg ikke selv gøre
    if(elms[i].name == "price")priceElm = elms[i];
    //opdater felter
    if(obj[elms[i].name]){
      elms[i].value = obj[elms[i].name];
    }else if(elms[i].name == "qty")
      elms[i].value = 1;
    }else if(elms[i].name == "price_total")
      elms[i].value = obj["price"];
    }
  }
  updateTotals(priceElm);
}
</script>


</head>

<body>

<form method="POST" action="">
    <table border="1" width="100%" id="table1">
        <tr>
            <td>Item:</td>
            <td>Stock:</td>
            <td>Qty:</td>
            <td>Description:</td>
            <td>Price:</td>
            <td>Price Total:</td>
        </tr>
        <tr>
            <td><input type="text" name="item" size="14" onchange="getDetails(this);"></td>
            <td><input type="text" name="stock" size="14"></td>
            <td><input type="text" name="qty" size="14" onchange="updateTotals(this);"></td>
            <td><input type="text" name="description" size="14"></td>
            <td><input type="text" name="price" size="14"></td>
            <td><input type="text" name="price_total" size="14"></td>
        </tr>
        <tr>
            <td><input type="text" name="item" size="14" onchange="getDetails(this);"></td>
            <td><input type="text" name="stock" size="14"></td>
            <td><input type="text" name="qty" size="14" onchange="updateTotals(this);"></td>
            <td><input type="text" name="description" size="14"></td>
            <td><input type="text" name="price" size="14"></td>
            <td><input type="text" name="price_total" size="14"></td>
        </tr>
    </table>
</form>

</body>

</html>
Avatar billede roenving Novice
12. marts 2007 - 22:51 #18
-- hvis ikke funktionen updateTotals findes, vil der være en javascript-fejl !-)
Avatar billede cybermaster Nybegynder
13. marts 2007 - 13:46 #19
Havde jeg ikke lige set... Er ikke lige den skabeste ske i skoven til javaScript.
Men forsøger da lige ;o)

Og dog så må jeg konstaterer at jeg ikke lige er med :o(

Kan du lokkes??
Avatar billede roenving Novice
13. marts 2007 - 13:49 #20
-- du kan bare remme linjen med kaldet ud:

  //updateTotals(priceElm);

-- og fjerne funktionen fra qty-elementet !-)
Avatar billede cybermaster Nybegynder
13. marts 2007 - 13:52 #21
Det er nu gjort. Og der sker stadivæk ingen ting. :o(
Avatar billede cybermaster Nybegynder
13. marts 2007 - 13:53 #22
kan lige nævne, det melder ingen fejl... der sker bare intet.
Avatar billede cybermaster Nybegynder
13. marts 2007 - 15:09 #23
Bliver nødt til at smutte nu, men kommer igen senere.
Avatar billede cybermaster Nybegynder
15. marts 2007 - 11:11 #24
Jeg har prøvet at sammen sætte noget udfra dit og det der var på W3School

Det virker nogen lunde, men det er godt nok blevet lidt rodet. men her er det indtil videre

var xmlHttp

function showHint(str)
{
if (window.event.keyCode==13 || window.event.keyCode==9)
    {
    strTmp=str.value;
    returnName=str.name;
    xmlHttp=GetXmlHttpObject()
    if (xmlHttp==null)
    {
    alert ("Browser does not support HTTP Request")
    return
    }
    var url="gethint.php"
    url=url+"?query="+strTmp
    url=url+"&return_id_tmp="+returnName
    xmlHttp.onreadystatechange=stateChanged
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
    }
}

function stateChanged(){
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
xmlDoc=xmlHttp.responseXML;
 
  ArrNr = xmlDoc.getElementsByTagName("return_id")[0].childNodes[0].nodeValue;
 
  arr = frm.getElementsByTagName("input");
  for (i = 0; i < arr.length; i++)
  {   
        if (arr[i].name == "my_description[" + ArrNr + "]")
        {
        arr[i].value = xmlDoc.getElementsByTagName("description")[0].childNodes[0].nodeValue;
        }

        if (arr[i].name == "my_stock[" + ArrNr + "]")
        {
        arr[i].value = xmlDoc.getElementsByTagName("stock")[0].childNodes[0].nodeValue;
        }

        if (arr[i].name == "my_price[" + ArrNr + "]")
        {
        arr[i].value = xmlDoc.getElementsByTagName("price")[0].childNodes[0].nodeValue;
        }

        if (arr[i].name == "my_qty[" + ArrNr + "]")
        {
        if(arr[i].value == "") { arr[i].value = 1;}
        }

        if (arr[i].name == "my_line_total[" + ArrNr + "]" && arr[i].value=="")
        {
        arr[i].value = xmlDoc.getElementsByTagName("price")[0].childNodes[0].nodeValue;
        }
  }
   
 
}
} function GetXmlHttpObject()
{
var objXMLHttp=null
if (window.XMLHttpRequest)
  {
  objXMLHttp=new XMLHttpRequest()
  }
else if (window.ActiveXObject)
  {
  objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
  }
return objXMLHttp
}

function SetTotal()
    {
    var plus_arr
    var get_total_price

    arr = frm.getElementsByTagName("input");

      for (i = 5; i < arr.length; i=i+6)
        {
        plus_arr = arr[i].value * 1;
        get_total_price = plus_arr *1;

        get_total_price = plus_arr + get_total_price * 1;
        }
        arr['60'].value = get_total_price;
    }

function SetLineTotal(qty)
    {
    var get_qty;
    var ArrNr;

    get_qty = qty.value;
    ArrNr = qty.name;
    ArrNr = ArrNr.replace("my_qty[", "");
    ArrNr = ArrNr.replace("]", "");
   
   
  arr = frm.getElementsByTagName("input");

      for (i = 0; i < arr.length; i++)
      {   
            if (arr[i].name == "my_price[" + ArrNr + "]")
            {
            var get_price = arr[i].value;
            }
           
            var line_price_set = get_price * get_qty;
           

            if (arr[i].name == "my_line_total[" + ArrNr + "]")
            {
            arr[i].value = line_price_set;
            }
        }
    //alert ( line_price_set );
    SetTotal();
    }
Avatar billede cybermaster Nybegynder
15. marts 2007 - 11:56 #25
function SetTotal()
    {
    var plus_arr = 0
    var get_total_price = 0

    arr = frm.getElementsByTagName("input");
      for (i = 5; i < arr.length; i=i+6)
        {
        plus_arr += arr[i].value * 1;
        }
        arr['60'].value = plus_arr;
    }
Avatar billede cybermaster Nybegynder
18. marts 2007 - 21:35 #26
Når du er sikker over alle bjerge, men et svar ville være fint hvis du kommer forbi!
Avatar billede roenving Novice
19. marts 2007 - 00:28 #27
Oki '-)

-- blev projektet fuldført ?-)
Avatar billede cybermaster Nybegynder
19. marts 2007 - 17:06 #28
Ja det er mere eller mindre fuldført, er ikke helt sikker at det var sådan de fleste andre ville have bygget det, men det funker.
Avatar billede roenving Novice
19. marts 2007 - 17:12 #29
Velbekomme '-)
Avatar billede cybermaster Nybegynder
24. marts 2007 - 17:41 #30
Og tak ;o)
Avatar billede roenving Novice
25. marts 2007 - 22:16 #31
-- og jeg takker for point ;~}
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