fabmin
Goto Top

JavaScript zur Berechnung der besten Kombination

Für einen .html Produktblatt soll die beste Bundlekombination errechnet werden

Hallo zusammen,

ich suche ein Skript, welches mir aus einer gegebenen Menge bspw. 33 eine Anzahl an 20er, 10er und 5er Bundles liefert, welche immer die maximale zahl an 20er, dann 10er und dann erst 5er Bundles berücksichtigt.

am bsp. 33 sind das also 1x20er,1x10er und 1x5er
am bsp. 100 sind das also 5x20er
am bsp. 16 ist das 1x20er
am bsp. 14 ist das 1x10er und 1x5er

dürfte klar sein face-smile
kann mir da vielleicht jemand helfen?

Content-Key: 112470

Url: https://administrator.de/contentid/112470

Printed on: April 19, 2024 at 01:04 o'clock

Member: godlie
godlie Mar 26, 2009 at 16:24:23 (UTC)
Goto Top
Also ich habs nur mal grob zusammengestöpselt.

function brack(amount, vpe, vpe2, vpe3)
{
  var sp = (amount / vpe);

  spl = amount % vpe;
  if(spl > 0)
  {
    a = Math.floor(sp);
    re = amount % vpe;

    spl2 = re % vpe2;
    if( spl2 > 0 )
    {
      b = Math.floor(re/vpe2);
      re2 = re % vpe2;

      spl3 = re2 % vpe3;
      if( spl3 > 0 )
      {
        c = Math.floor(re2/vpe3);
        if( c == "0" )  
        c = 1;
      }
      else
      {
        if(re2/vpe3 < 1)
        {
          c = 1;
        }
        else
        {
          c = re2/vpe3;
        }
      }
    }
    else
    {
        if(re/vpe2 < 1)
        {
          b = 1;
        }
        else
        {
          b = re/vpe2;
        }
    }
  }
  else
  {
    if(amount/vpe < 1)
    {
      a = 1;
    }
    else
    {
      a = amount/vpe;
    }
  }
  return a+" - "+b+" - "+c;  
}

alert(brack(44,20,10,5));

ich glaube das geht so in deine Richtung.
Member: bastla
bastla Mar 26, 2009 at 16:32:15 (UTC)
Goto Top
Hallo FaBMiN!

Von mir leider nur als VBScript:
x = CInt(InputBox("Wieviele Einheiten?"))  

F = Int(x / 5 + .99)
Do While F > 1
    Ze = Ze + 1
    F = F - 2
Loop
Do While Ze > 1
    Zw = Zw + 1
    Ze = Ze - 2
Loop

MsgBox Zw & " x 20er, " & Ze & " x 10er, " & F & " x 5er"  
Grüße
bastla
Member: FaBMiN
FaBMiN Mar 27, 2009 at 08:04:15 (UTC)
Goto Top
Danke Ihr 2 face-smile
ich brauchs leider als JS, weil ich es gerne für unser shopping cart auf die Page packen würde face-smile
Member: godlie
godlie Mar 27, 2009 at 08:09:39 (UTC)
Goto Top
Das was ich dir geliefert habe ist ja javascript face-smile
sieht nur noch nicht wirklich schön aus bin grad dran das ganze zu vereinfachen.

grüße
Member: FaBMiN
FaBMiN Mar 27, 2009 at 08:11:04 (UTC)
Goto Top
Habs schon gesehen =) dank scheee!
Member: FaBMiN
FaBMiN Apr 01, 2009 at 08:19:31 (UTC)
Goto Top
Hi,

meine Anforderung hat sich ein wenig geändert und ich bekomme es einfach nicht hin!

Wie Ihr mit Sicherheit mitbekommen habt, handelt es sich hierbei um eine Art Produktblatt, aus welchem man Bundles und Lizenzen in einen Warenkorb legen kann.

Die Produkte werden auf shop.xxx.com/cgi-bin/cart übergeben.
Das Produkt an sich als ID,ID1,ID2 usw. auf shop.xxx.com/cgi-bin/cart?ID=1001&ID1=1005&ID2=1112
Die Menge als AM,AM1,AM2 usw.

Hier ein Bsp.
50x Produkt 1112
3x Produkt 1001
--> shop.xxx.com/cgi-bin/cart?ID=1112&ID1=1001&AM=50&AM1=3


Nun gelten für die Produkte 1001 bis 1003 die oben genannten Regeln.
1001 (5er Bundle)
1002 (10er Bundle)
1003 (20er Bundle)
Der Kunde trägt also in ein Textfeld eine ganze Zahl ein und das Skript soll in ein Ausgabefeld, die kleinstmöglich anzahl an Bundles zusammenstellen.
Bei 15 bspw. 1x 1001 und 1x 1002.

Gibt der Kunden nun eine Anzahl >49 bzw. >=50 ein, so soll das Produkt 1004 verwendet werden.
bspw. 55
--> shop.xxx.com/cgi-bin/cart?ID=1004&AM=55

Genauso ab einer Anzahl von >= 250 das Produkt 1005
bspw. 500
--> shop.xxx.com/cgi-bin/cart?ID=1005&AM=500


Ich weiss, dass es nicht so gradlinig umzusetzen ist - über eine Lösung würde ich mich aber trotzdem freuen face-smile
(html und js)

LG
Member: godlie
godlie Apr 01, 2009 at 10:11:08 (UTC)
Goto Top
Hm eigentlich sieht das nicht so schlimm aus.
function brack(amount, vpe, vpe2, vpe3)
{
  var sp = (amount / vpe);

  spl = amount % vpe;
  if(spl > 0)
  {
    a = Math.floor(sp);
    spl2 = spl % vpe2;
    if( spl2 > 0 )
    {
      b = Math.floor(spl2/vpe2);
      spl3 = spl2 % vpe3;
      if( spl3 > 0 )
      {
        c = Math.floor(spl3/vpe3);
        if( c == "0" )  
        c = 1;
      }
      else
      {
        if(spl3/vpe3 < 1)
        {
          c = 1;
        }
        else
        {
          c = spl3/vpe3;
        }
      }
    }
    else
    {
	alert("b "+spl/vpe2);  
        if(spl/vpe2 < 1)
        {
          b = 1;
          c = 0;
        }
        else
        {
          b = spl/vpe2;
          c = 0;
        }
    }
  }
  else
  {
    if(amount/vpe < 1)
    {
      a = 1;
      b = 0;
      c = 0;
    }
    else
    {
      a = amount/vpe;
      b = 0;
      c = 0;
    }
  }
  return a+"x1003 - "+b+"x1002 - "+c+"x1001";  
}
var url = encodeURI(window.location);
var Zeile = url.split("?");  
var param = Zeile[1].split("&");  
var ids = new Array();
var amounts = new Array();

for(i=0;i<param.length;i++)
{
  if(param[i].indexOf("ID")!= -1)  
  {
    var spli = param[i].split("=");  
    ids.push(spli[1]); 
  } else if(param[i].indexOf("AM") != -1) {  
    var spli2 = param[i].split("=");  
    amounts.push(spli2[1]);
  }
}
var products = new Array();
for(i=0;i<ids.length;i++)
{
  if(amounts[i] >= 50)
  {
    if(amounts[i] >= 250)
    {
      bundle = ids[i]+' Menge(n):1x1005';  
    }
    else
    {
      bundle = ids[i]+' Menge(n):1x1004';  
    }
  }
  else
  {
    bundle = ids[i]+' Menge(n):'+brack(amounts[i],20,10,5);  
  }
  products.push(bundle);
}
for(i=0;i<products.length;i++)
{
  alert(products[i]);
}
Member: FaBMiN
FaBMiN Apr 01, 2009 at 11:12:27 (UTC)
Goto Top
ok =)
so wie ich das verstanden hab, binde ich das skript folgendermassen ein - bitte korregier mich, wenn ich falsch liege.

im Header wird das Skript per
<script type="text/javascript" src="skript.js"></script>  
ganz normal von einer externen Datei importiert =) richtig? oder gibts da ein Variablenproblem? oder wird die Funktion direkt im
<form>...</form>
ausgeführt?

Im FormTextFeld
<input name="amount" type="text" value="0" size="5" maxlength="3" />  
wird der 'Amount', also die Anzahl eingetragen.

Dann ist allerdings auch schon wieder zappe bei mir *(
Wie muss ich die entsprechende Funktion aufrufen ?
Wie und Wo erfolgt die Ausgabe und Übergabe?
--> total überfordert!

Kannst Du mir vielleicht eine kurze html reinstellen!?
Danke =)
Member: godlie
godlie Apr 01, 2009 at 11:39:46 (UTC)
Goto Top
Hm ich sehs gerade das was ich da gebaut habe sollte an dem Punkt ansetzen wo die URL
der Form ID=xxx&ID1=xxxx&AM=xxx&AM1=xxx lautet, also erst nach dem ganzen Formular.

Wie soll das ganze dann aussehen gibt es da ein feld für die Menge für jedes Produkt?
Blick da irgendwie noch net ganz durch an welchem Punkt das Script arbeiten muss.

Kannst mir da mal einen Ablauf geben?
Member: FaBMiN
FaBMiN Apr 01, 2009 at 11:52:50 (UTC)
Goto Top
na klar face-smile
hab Dir mal alles hier in einer .html zusammen gepackt =)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Unbenanntes Dokument</title>
</head>

<body>
<table id="table1">  
  <thead>
    <tr class="odd">  
      <td class="column1"></td>  
      <th scope="col" abbr="Home">5er Lizenz Bundle</th>  
      <th scope="col" abbr="Home Plus">10er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">20er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">Ab 50 Lizenzen</th>  
      <th scope="col" abbr="Business">Ab 250 Lizenzen</th>  
    </tr>
  </thead>
  <tfoot>
  </tfoot>
  <tbody>
    <tr>
      <th scope="row" class="column1">Produkt A</th>  
      <td id="td1"><span class="Stil1">&euro;100,00</span>&nbsp;/ Bundle (ID 1001) </td>  
      <td id="td1"><span class="Stil1">&euro;180,00</span>&nbsp;/ Bundle (ID 1002) </td>  
      <td id="td1"><span class="Stil1">&euro;300,00</span>&nbsp;/ Bundle (ID 1003) </td>  
      <td id="td1"><span class="Stil1">&euro;15,00</span>&nbsp;/ Benutzer (ID 1004) </td>  
      <td id="td1"><span class="Stil1">&euro;13,00</span>&nbsp;/ Benutzer (ID 1005) </td>  
    </tr>
    <tr class="odd">  
      <th scope="row" class="column1">Produkt B</th>  
      <td id="td1"><span class="Stil1">&euro;200,00</span>&nbsp;/ Bundle (ID 2001) </td>  
      <td id="td1"><span class="Stil1">&euro;380,00</span>&nbsp;/ Bundle (ID 2002) </td>  
      <td id="td1"><span class="Stil1">&euro;720,00</span>&nbsp;/ Bundle (ID 2003) </td>  
      <td id="td1"><span class="Stil1">&euro;36,00</span>&nbsp;/ Benutzer (ID 2004) </td>  
      <td id="td1"><span class="Stil1">&euro;34,20</span>&nbsp;/ Benutzer (ID 2005) </td>  
    </tr>
  </tbody>
</table>
<form method="post" name="LIZ" action="https://shop.xxx.com/cgi-bin/cart/ml=DE?">  
<br />
Anzahl der Lizenzen/Benutzer (Amount)
<br />
<input name="Amount" type="text" value="0" size="5" maxlength="3" />  
<input type="submit" name="button" id="button" value="Senden" />  
</form>
</body>
</html>

so sieht die Seite aus. Es sind natürlich mehr Produkte und hinter dem ganzen liegt auch ne CSS, aber das spielt ja im Moment keine Rolle.
Ablauf:
1. Kunde trägt in "Anzahl der Lizenzen/Benutzer (Amount)" eine Lizenzzahl ein.
2. Kunde drückt 'Senden'
3. Es soll die für den Kunden günstige Möglichkeit gefunden werden, diese Lizenzzahl in den Warenkorb zu legen
a. Am Bsp. der Produkte, siehst Du, dass die Preise gestaffelt sind --> desto größer die Bestellmenge, desto geringer der Einzelpreis. Und davon soll der Kunden natürlich, ohne nachzudenken profitieren!
4. Die Produkte werden nach dem Schema shop.xxx.com/cgi-bin/cart?ID=1001&ID1=2005&AM=5&AM1=100 übergeben =)

Verstehste? Ist nich so leicht zu erklären ;)
Member: godlie
godlie Apr 01, 2009 at 12:24:55 (UTC)
Goto Top
Hm das kann jetzt a bisserl dauern bin auf ein paar fehler draufgekommen in der Berechnung.
Member: FaBMiN
FaBMiN Apr 01, 2009 at 12:26:22 (UTC)
Goto Top
Hey Super!
Vielen Dank,dass Du Dir die Mühe machst =)
Member: godlie
godlie Apr 02, 2009 at 08:08:58 (UTC)
Goto Top
sodala
also nun hier die Lösung:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Unbenanntes Dokument</title>
<script type="text/javascript">  
var amounts = new Array();
var cnt = 0;
function brack(amount,vpe,pid,sid) {
var sub1 = 0;
var sub2 = 10;

  if(amount > 0 ) {
	if(amount >= 50 && amount < 250) {
			amounts[sid].push("1x"+pid[cnt+3]);  
		} else if(amount >= 250) {
			amounts[sid].push("1x"+pid[cnt+4]);  
		/*} else {
			if(sub2 > 5 && sub1 < 11) {
			  amounts[sid].push("1x"+pid[1]);  
			} else if( sub2 <= 5 ) {
			  amounts[sid].push("1x"+pid);  
			} else {
			  brack(sub1,vpe - sub2,pids,sid);
			}*/
		} else {
		  if((amount / vpe) > 1) {
			amounts[sid].push(Math.floor(amount/vpe)+"x"+pid[cnt+2]);  
			sub1 = amount - (Math.floor(amount/vpe)*vpe);
			sub2 = cnt == 0 ? 10 : 5;
					pids = cnt == 0 ? pid[1] : pid;
			cnt++;
			if(amount % vpe != 0) {
			if(sub1 > 5 && sub1 < 11) {
			  amounts[sid].push("1x"+pid[1]);  
			} else if( sub1 <= 5 ) {
			  amounts[sid].push("1x"+pid);  
			} else {
			  brack(sub1,vpe - sub2,pid,sid);
			}
			}
		  } else if(amount == vpe) {
			amounts[sid].push("1x"+pid[cnt+2]);  
			sub1 = amount - vpe;
		  } else {
			if(amount > 5 && amount < 11) {
					  amounts[sid].push("1x"+pid[1]);  
					} else if( amount <= 5 ) {
					  amounts[sid].push("1x"+pid);  
					} else {
					  brack(amount,vpe - sub2,pid,sid);
					}
		  }
		}
	}
}

function calculateBundles() {
var productsAmounts = document.getElementsByName("Amount");  
var products = new Array();
for(i=0;i<productsAmounts.length;i++)
{
    var locAmount = productsAmounts[i].value;
    cnt = 0;
    amounts[i] = new Array(); 
    pids = new Array(i+"001",i+"002",i+"003",i+"004",i+"005");  
    brack(locAmount,20,pids,i);
}
for(i=0;i<amounts.length;i++)
{
  var bundleVal = "";  
  for(j=0;j<amounts[i].length;j++) {
    bundleVal += " "+amounts[i][j];  
  }
  var target = "bundles"+(i+1);  
  document.getElementById(target).value = bundleVal;
}
}
</script>
</head>
<body>
<table id="table1">  
  <thead>
    <tr class="odd">  
      <td class="column1"></td>  
      <th scope="col" abbr="Home">5er Lizenz Bundle</th>  
      <th scope="col" abbr="Home Plus">10er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">20er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">Ab 50 Lizenzen</th>  
      <th scope="col" abbr="Business">Ab 250 Lizenzen</th>  
    </tr>
  </thead>
  <tfoot>
  </tfoot>
  <tbody>
    <tr>
      <th scope="row" class="column1">Produkt A</th>  
      <td id="td1"><span class="Stil1">.100,00</span> / Bundle (ID 1001) </td>  
      <td id="td1"><span class="Stil1">.200,00</span> / Bundle (ID 1002) </td>  
      <td id="td1"><span class="Stil1">.400,00</span> / Bundle (ID 1003) </td>  
      <td id="td1"><span class="Stil1">.20,00</span> / Benutzer (ID 1004) </td>  
      <td id="td1"><span class="Stil1">.15,00</span> / Benutzer (ID 1005) </td>  
    </tr>
    <tr class="odd">  
      <th scope="row" class="column1">Produkt B</th>  
      <td id="td1"><span class="Stil1">.200,00</span> / Bundle (ID 2001) </td>  
      <td id="td1"><span class="Stil1">.380,00</span> / Bundle (ID 2002) </td>  
      <td id="td1"><span class="Stil1">.720,00</span> / Bundle (ID 2003) </td>  
      <td id="td1"><span class="Stil1">.36,00</span> / Benutzer (ID 2004) </td>  
      <td id="td1"><span class="Stil1">.34,20</span> / Benutzer (ID 2005) </td>  
    </tr>
  </tbody>
</table>
<form method="post" name="LIZ" action="https://shop.xxx.com/cgi-bin/cart/ml=DE?">  
<br />
Anzahl der Lizenzen/Benutzer (Amount)
<br />
p1<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" />  
p2<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" />  
<input id="bundles1" name="bundles" type="text" value="" size="40"/>  
<input id="bundles2" name="bundles" type="text" value="" size="40"/>  
<input type="button" onClick="calculateBundles()" value="calculate">  
<input type="submit" name="button" id="button" value="Senden" />  
</form>
</body>
</html>
Member: FaBMiN
FaBMiN Apr 02, 2009 at 08:34:14 (UTC)
Goto Top
Hey Danke =) !
bei einer Kleinigkeit blicke ich allerdings noch nicht so ganz durch.
naja...eigentlich 3 kleinigkeiten.

1. bei >= 250 und >=50 soll die Anzahl nicht 1x sondern Anzahl'mal'/Amount'mal' genommen werden face-smile
und
2. und ich glaub die berechnung stimmt noch nich so ganz face-sad bei einer Anzahl zwischen 30 und 39 packt er immer ein 1004er Paket mit rein face-sad
und
3. die übergabe in Form von "https://shop.xxx.com/cgi-bin/cart/ml=DE?ID=1001&ID2=1003&AM=1&AM1=3" klappt nicht face-sad
Member: FaBMiN
FaBMiN Apr 02, 2009 at 10:04:09 (UTC)
Goto Top
und dann muss ich 'Amount' natürlich auch auf AM,AM1 usw. kriegen face-smile
Member: godlie
godlie Apr 02, 2009 at 10:56:30 (UTC)
Goto Top
Sodala den ganzen JavascriptTeil kannst auslagern in eine Externe Datei.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Unbenanntes Dokument</title>
<script type="text/javascript">  
var amounts = new Array();
var cnt = 0;
var ids = new Array();

function brack(amount,vpe,pid,sid) {
var sub1 = 0;
var sub2 = 10;

  if(amount > 0 ) {
	if(amount >= 50 && amount < 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+3]);
		} else if(amount >= 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+4]);
		} else {
		  if((amount / vpe) > 1) {
			intID = sid == 0 ? '' : sid+1;  
			amounts[sid].push(Math.floor(amount/vpe));
			ids[sid].push(pid[2-cnt]);
			sub1 = amount - (Math.floor(amount/vpe)*vpe);
			sub2 = cnt == 0 ? 10 : 5;
			pids = cnt == 0 ? pid[1] : pid;
			cnt++;
			if(amount % vpe != 0) {
			if(sub1 > 5 && sub1 < 11) {
			  amounts[sid].push(1);
			  ids[sid].push(pid[1]);
			} else if( sub1 <= 5 ) {
			  amounts[sid].push(1);
			  ids[sid].push(pid);
			} else {
			  brack(sub1,vpe - sub2,pid,sid);
			}
			}
		  } else if(amount == vpe) {
			amounts[sid].push(1);
			ids[sid].push(pid[cnt+2]);
			sub1 = amount - vpe;
		  } else {
			if(amount > 5 && amount < 11) {
					  amounts[sid].push(1);
					  ids[sid].push(pid[1]);
					} else if( amount <= 5 ) {
					  amounts[sid].push(1);
					  ids[sid].push(pid);
					} else {
					  brack(amount,vpe - sub2,pid,sid);
					}
		  }
		}
  }
}

function calculateBundles() {
var productsAmounts = document.getElementsByName("Amount");  
var products = new Array();
var idString = "";  
var amountString = "";  
for(i=0;i<productsAmounts.length;i++)
{
    var locAmount = productsAmounts[i].value;
    cnt = 0;
    amounts[i] = new Array(); 
    ids[i] = new Array();
    pids = new Array(i+1+"001",i+1+"002",i+1+"003",i+1+"004",i+1+"005");  
    brack(locAmount,20,pids,i);
}
for(i=0;i<ids.length;i++)
{
  var bundleVal = "";  
  for(j=0;j<ids[i].length;j++) {
    a = j==0 ? '' : j;  
    b = i==0 ? i : j+i*ids[i].length+1;
    c = i==0 ? a : b;
    bundleVal += "&ID"+c+"="+ids[i][j];  
  }
  idString += bundleVal;
}
for(i=0;i<amounts.length;i++)
{
  var bundleVal = "";  
  for(j=0;j<amounts[i].length;j++) {
    a = j==0 ? '' : j;  
    b = i==0 ? i : j+i*ids[i].length+1;
    c = i==0 ? a : b;
    bundleVal += "&AM"+c+"="+amounts[i][j];  
  }
  amountString += bundleVal;
}
document.getElementById("bundles1").value = idString;  
document.getElementById("bundles2").value = amountString;  
var target = "https://shop.xxx.com/cgi-bin/cart/ml=DE?"+idString.substr(1,idString.length)+amountString;  
document.LIZ.action = target;
document.LIZ.submit();
}
</script>
</head>
<body>
<table id="table1">  
  <thead>
    <tr class="odd">  
      <td class="column1"></td>  
      <th scope="col" abbr="Home">5er Lizenz Bundle</th>  
      <th scope="col" abbr="Home Plus">10er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">20er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">Ab 50 Lizenzen</th>  
      <th scope="col" abbr="Business">Ab 250 Lizenzen</th>  
    </tr>
  </thead>
  <tfoot>
  </tfoot>
  <tbody>
    <tr>
      <th scope="row" class="column1">Produkt A</th>  
      <td id="td1"><span class="Stil1">.100,00</span> / Bundle (ID 1001) </td>  
      <td id="td1"><span class="Stil1">.200,00</span> / Bundle (ID 1002) </td>  
      <td id="td1"><span class="Stil1">.400,00</span> / Bundle (ID 1003) </td>  
      <td id="td1"><span class="Stil1">.20,00</span> / Benutzer (ID 1004) </td>  
      <td id="td1"><span class="Stil1">.15,00</span> / Benutzer (ID 1005) </td>  
    </tr>
    <tr class="odd">  
      <th scope="row" class="column1">Produkt B</th>  
      <td id="td1"><span class="Stil1">.200,00</span> / Bundle (ID 2001) </td>  
      <td id="td1"><span class="Stil1">.380,00</span> / Bundle (ID 2002) </td>  
      <td id="td1"><span class="Stil1">.720,00</span> / Bundle (ID 2003) </td>  
      <td id="td1"><span class="Stil1">.36,00</span> / Benutzer (ID 2004) </td>  
      <td id="td1"><span class="Stil1">.34,20</span> / Benutzer (ID 2005) </td>  
    </tr>
  </tbody>
</table>
<form method="post" name="LIZ" action="https://shop.xxx.com/cgi-bin/cart/ml=DE?">  
<br />
Anzahl der Lizenzen/Benutzer (Amount)
<br />
p1<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" />  
p2<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" />  
<input id="bundles1" name="bundles" type="text" value="" size="40"/>  
<input id="bundles2" name="bundles" type="text" value="" size="40"/>  
<input type="button" onClick="calculateBundles()" value="calculate">  
<input type="submit" name="button" id="button" value="Senden" />  
</form>
</body>
</html>
ah grml hab noch fehler gefunden bin am überarbeiten.....
so ausgebessert
Member: FaBMiN
FaBMiN Apr 02, 2009 at 11:49:47 (UTC)
Goto Top
klappt leider immer noch nicht so richtig face-sad

1. ich hab leider einen kleinen Fehler in der Beschreibung gemacht!
Die Produkt sind folgende
9001,9002,9003,...,9011,9012,9013,...,9021,9022,...

ich hab das so versucht
for(i=0;i<productsAmounts.length;i++)
{
    var locAmount = productsAmounts[i].value;
    cnt = 0;
    amounts[i] = new Array(); 
    ids[i] = new Array();
    pids = new Array("90"+i+"1","90"+i+"2","90"+i+"3","90"+i+"4","90"+i+"5");  
    brack(locAmount,20,pids,i);
}
scheint auch zu klappen, allerdings hast Du da immer noch ein i+1 reingepackt und ich versteh nicht ganz warum!?
pids = new Array(i+1+"001",i+1+"002",i+1+"003",i+1+"004",i+1+"005");   

2. mit der Übergabe
er gibt immer: ID=9002&ID2=9013
statt: ID=9002&ID1=9013
-> er macht also immer ID und dann ID2 face-sad

oder er macht
&ID=9003&ID1=9002&ID2=9001&ID2=9013 und &AM=1&AM1=1&AM2=1&AM2=1

:*( *verzweifel* face-smile

hier mal meine Version
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Unbenanntes Dokument</title>
<script type="text/javascript">  
var amounts = new Array();
var cnt = 0;
var ids = new Array();

function brack(amount,vpe,pid,sid) {
var sub1 = 0;
var sub2 = 10;

  if(amount > 0 ) {
	if(amount >= 50 && amount < 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+3]);
		} else if(amount >= 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+4]);
		} else {
		  if((amount / vpe) > 1) {
			intID = sid == 0 ? '' : sid+1;  
			amounts[sid].push(Math.floor(amount/vpe));
			ids[sid].push(pid[2-cnt]);
			sub1 = amount - (Math.floor(amount/vpe)*vpe);
			sub2 = cnt == 0 ? 10 : 5;
			pids = cnt == 0 ? pid[1] : pid;
			cnt++;
			if(amount % vpe != 0) {
			if(sub1 > 5 && sub1 < 11) {
			  amounts[sid].push(1);
			  ids[sid].push(pid[1]);
			} else if( sub1 <= 5 ) {
			  amounts[sid].push(1);
			  ids[sid].push(pid);
			} else {
			  brack(sub1,vpe - sub2,pid,sid);
			}
			}
		  } else if(amount == vpe) {
			amounts[sid].push(1);
			ids[sid].push(pid[cnt+2]);
			sub1 = amount - vpe;
		  } else {
			if(amount > 5 && amount < 11) {
					  amounts[sid].push(1);
					  ids[sid].push(pid[1]);
					} else if( amount <= 5 ) {
					  amounts[sid].push(1);
					  ids[sid].push(pid);
					} else {
					  brack(amount,vpe - sub2,pid,sid);
					}
		  }
		}
  }
}

function calculateBundles() {
var productsAmounts = document.getElementsByName("Amount");  
var products = new Array();
var idString = "";  
var amountString = "";  
for(i=0;i<productsAmounts.length;i++)
{
    var locAmount = productsAmounts[i].value;
    cnt = 0;
    amounts[i] = new Array(); 
    ids[i] = new Array();
    pids = new Array("90"+i+"1","90"+i+"2","90"+i+"3","90"+i+"4","90"+i+"5");  
    brack(locAmount,20,pids,i);
}
for(i=0;i<ids.length;i++)
{
  var bundleVal = "";  
  for(j=0;j<ids[i].length;j++) {
    a = j==0 ? '' : j;  
    b = i==0 ? i : j+i*ids[i].length+1;
    c = i==0 ? a : b;
    bundleVal += "&ID"+c+"="+ids[i][j];  
  }
  idString += bundleVal;
}
for(i=0;i<amounts.length;i++)
{
  var bundleVal = "";  
  for(j=0;j<amounts[i].length;j++) {
    a = j==0 ? '' : j;  
    b = i==0 ? i : j+i*ids[i].length+1;
    c = i==0 ? a : b;
    bundleVal += "&AM"+c+"="+amounts[i][j];  
  }
  amountString += bundleVal;
}
document.getElementById("bundles1").value = idString;  
document.getElementById("bundles2").value = amountString;  
var target = "https://shop.xxx.com/cgi-bin/cart?"+idString.substr(1,idString.length)+amountString;  
document.LIZ.action = target;
document.LIZ.submit();
}
</script>
</head>
<body>
<table id="table1">  
  <thead>
    <tr class="odd">  
      <td class="column1"></td>  
      <th scope="col" abbr="Home">5er Lizenz Bundle</th>  
      <th scope="col" abbr="Home Plus">10er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">20er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">Ab 50 Lizenzen</th>  
      <th scope="col" abbr="Business">Ab 250 Lizenzen</th>  
    </tr>
  </thead>
  <tfoot>
  </tfoot>
  <tbody>
    <tr>
      <th scope="row" class="column1">Produkt A</th>  
      <td id="td1"><span class="Stil1">.100,00</span> / Bundle (ID 9001) </td>  
      <td id="td1"><span class="Stil1">.200,00</span> / Bundle (ID 9002) </td>  
      <td id="td1"><span class="Stil1">.400,00</span> / Bundle (ID 9003) </td>  
      <td id="td1"><span class="Stil1">.20,00</span> / Benutzer (ID 9004) </td>  
      <td id="td1"><span class="Stil1">.15,00</span> / Benutzer (ID 9005) </td>  
    </tr>
    <tr class="odd">  
      <th scope="row" class="column1">Produkt B</th>  
      <td id="td1"><span class="Stil1">.200,00</span> / Bundle (ID 9011) </td>  
      <td id="td1"><span class="Stil1">.380,00</span> / Bundle (ID 9012) </td>  
      <td id="td1"><span class="Stil1">.720,00</span> / Bundle (ID 9013) </td>  
      <td id="td1"><span class="Stil1">.36,00</span> / Benutzer (ID 9014) </td>  
      <td id="td1"><span class="Stil1">.34,20</span> / Benutzer (ID 9015) </td>  
    </tr>
  </tbody>
</table>
<form method="post" name="LIZ" action="https://shop.xxx.com.com/cgi-bin/cart?">  
<br />
Anzahl der Lizenzen/Benutzer (Amount)
<br />
p1<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" />  
p2<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" />  
<input id="bundles1" name="bundles" type="hidden" value="" size="40"/>  
<input id="bundles2" name="bundles" type="hidden" value="" size="40"/>  
<input type="button" onClick="calculateBundles()" value="In den Warenkorb legen">  
<!--<input type="submit" name="button" id="button" value="Senden" />--> 
</form>
</body>
</html>

die nächste Frage wäre dann: Es sind natürlich nicht nur 2 Produkte, die in den Warenkorb gelegt werden sollen, sonder insgesamt 6 face-smile Wie erweitere ich das ganze?
Wer will ein Eis?
Member: godlie
godlie Apr 02, 2009 at 12:54:24 (UTC)
Goto Top
Sodala da ist jetzt nur der javascriptteil.
Die Erweiterung kommt mit mehr input Feldern face-smile
und zwar die die sich da <input id="Amount" name="Amount" schimpfen face-smile
Der Code selbst dürfte sich dann schon durchgraben.

var amounts = new Array();
var cnt = 0;
var ids = new Array();

function brack(amount,vpe,pid,sid) {
var sub1 = 0;
var sub2 = 10;
  if(amount > 0 ) {
	if(amount >= 50 && amount < 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+3]);
		} else if(amount >= 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+4]);
		} else {
		  if((amount / vpe) > 1) {
			intID = sid == 0 ? '' : sid+1;  
			amounts[sid].push(Math.floor(amount/vpe));
			ids[sid].push(pid[2-cnt]);
			sub1 = amount - (Math.floor(amount/vpe)*vpe);
			sub2 = cnt == 0 ? 10 : 5;
			pids = cnt == 0 ? pid[1] : pid;
			cnt++;
			if(amount % vpe != 0) {
			if(sub1 > 5 && sub1 < 11) {
			  amounts[sid].push(1);
			  ids[sid].push(pid[1]);
			} else if( sub1 <= 5 ) {
			  amounts[sid].push(1);
			  ids[sid].push(pid);
			} else {
			  brack(sub1,vpe - sub2,pid,sid);
			}
			}
		  } else if(amount == vpe) {
			amounts[sid].push(1);
			ids[sid].push(pid[cnt+2]);
			sub1 = amount - vpe;
		  } else {
			if(amount > 5 && amount < 11) {
					  amounts[sid].push(1);
					  ids[sid].push(pid[1]);
					} else if( amount <= 5 ) {
					  amounts[sid].push(1);
					  ids[sid].push(pid);
					} else {
					  brack(amount,vpe - sub2,pid,sid);
					}
		  }
		}
  }
}

function createURL(arr,description) {
  cnter = 0;
  target = "";  
  for(i=0;i<arr.length;i++)
  {
    var bundleVal = "";  
    for(j=0;j<arr[i].length;j++) {
      c = cnter == 0 ? '' : cnter;  
      bundleVal += "&"+description+c+"="+arr[i][j];  
      cnter++;
    }
    target += bundleVal;
  }
  return target;
}

function calculateBundles() {
var productsAmounts = document.getElementsByName("Amount");  
var products = new Array();
var idString = "";  
var amountString = "";  
for(i=0;i<productsAmounts.length;i++)
{
    var locAmount = productsAmounts[i].value;
    cnt = 0;
    amounts[i] = new Array(); 
    ids[i] = new Array();
    pids = new Array();
    for(c=1;c < 24;c++) {
      pids.push(9000+c);
    }
    brack(locAmount,20,pids,i);
}
idString = createURL(ids,"ID");  
amountString = createURL(amounts,"AM");  
document.getElementById("bundles1").value = idString;  
document.getElementById("bundles2").value = amountString;  
var target = "https://shop.xxx.com/cgi-bin/cart/ml=DE?"+idString.substr(1,idString.length)+amountString;  
document.LIZ.action = target;
//document.LIZ.submit();
}
Member: FaBMiN
FaBMiN Apr 02, 2009 at 13:25:00 (UTC)
Goto Top
ein weiteres kleines Problemchen face-smile oder eher 2 =D

der String der übergeben muss, muss von min nach max gehen, also
ID=9001&ID1=9003&ID2=9004
und nicht
ID=9005&ID1=9001&ID2=9002
also chronologisch face-smile
genauso natürlich auch die Mengen/Amounts/AM, da diesen sich auf die Ziffern nach den IDs berufen
ID1 und AM1
ID5 und AM5 face-smile

das zweite Problemchen wäre...
die Produkte sind
9001,9002,9003,9004,9005, 9011,9012,...9015, 9021,9022,...,9025,...,9054,9055
leider wirft er mir nur 900x Produkte aus :*(
Member: godlie
godlie Apr 02, 2009 at 13:43:24 (UTC)
Goto Top
ähm warum müssen die bitte chronologisch sein?
naja das ist auch klar das er dir nur 900x Produkte auswirft. is ja auch nur für 4 ausgelegt.

Wenn du mir jetzt mal erklärst was du genau brauchst dann kann ich da evtl. was machen.

Wieso sind die Produkte nun auf einmal 9001 - 9055? vorher wars noch 1001-1005........
Member: FaBMiN
FaBMiN Apr 02, 2009 at 14:00:24 (UTC)
Goto Top
Also erstmal Vielen Dank für die Mühe, die Du Dir gemacht hast.
Ich hatte Anfang nicht gedacht, dass Du mir eine kurze Vorschlage bastelst und ich diese dann anpassen kann. Deswegen war das ganze ein wenig unpräzise.

Also die Produkte sind.
9001-9005
9011-9015
9021-9025
9031-9035
9041-9045
9051-9055


Das ganze muss chronologisch übergeben werden, weil unser Shopsystem, welches dahinter sitzt, verlagt einfach so eine Übergabe. face-sad
I'm SORRY
Member: godlie
godlie Apr 03, 2009 at 07:32:48 (UTC)
Goto Top
So jetzt glaub ich hab ich es falls sich die Anforderungen icht odch noch ändern ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Unbenanntes Dokument</title>
<script type="text/javascript">  
var amounts = new Array();
var cnt = 0;
var ids = new Array();

function brack(amount,vpe,pid,sid) {
var sub1 = 0;
var sub2 = 10;
  if(amount > 0 ) {
	if(amount >= 50 && amount < 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+3]);
		} else if(amount >= 250) {
			amounts[sid].push(amount);
			ids[sid].push(pid[cnt+4]);
		} else {
		  if((amount / vpe) > 1) {
			intID = sid == 0 ? '' : sid+1;  
			amounts[sid].push(Math.floor(amount/vpe));
			ids[sid].push(pid[2-cnt]);
			sub1 = amount - (Math.floor(amount/vpe)*vpe);
			sub2 = cnt == 0 ? 10 : 5;
			cnt++;
			if(amount % vpe != 0) {
			if(sub1 > 5 && sub1 < 11) {
			  amounts[sid].push(1);
			  ids[sid].push(pid[1]);
			} else if( sub1 <= 5 ) {
			  amounts[sid].push(1);
			  ids[sid].push(pid);
			} else {
			  brack(sub1,vpe - sub2,pid,sid);
			}
			}
		  } else if(amount == vpe) {
			amounts[sid].push(1);
			ids[sid].push(pid[cnt+2]);
			sub1 = amount - vpe;
		  } else {
			if(amount > 5 && amount < 11) {
					  amounts[sid].push(1);
					  ids[sid].push(pid[1]);
					} else if( amount <= 5 ) {
					  amounts[sid].push(1);
					  ids[sid].push(pid);
					} else {
					  brack(amount,vpe - sub2,pid,sid);
					}
		  }
		}
  }
}

function createURI() {
  var arr = new Array();
  var idString = "";  
  var amountString="";  
  for(var i=0; i < ids.length; i++)
  {
    for( var h=0; h < ids[i].length; h++) 
    arr.push(ids[i][h]+"#"+amounts[i][h]);  
  }
  arr = arr.sort();
  var cnt = 0;
  for(var i=0; i < arr.length; i++)
  {
    if(arr[i] != "#") {  
      var tpart = arr[i].split("#");  
      var tIds = tpart.split(",");  
      var tAms = tpart[1].split(",");  
      for(var j=0; j < tIds.length; j++) {
        alert(tIds[j]+" - "+tAms[j]);  
	c = cnt == 0 ? '' : cnt;  
	idString += "&ID"+c+"="+tIds[j];  
        amountString += "&AM"+c+"="+tAms[j];  
	cnt++;
      }
    }
  }
  return  "https://shop.xxx.com/cgi-bin/cart/ml=DE?"+idString.substring(1)+amountString;  
}

function createPIDS() {
  var pids_ = new Array();
  for(var j=0;j<6;j++) {
    pids_[j] = new Array(4); 
    for(var i=0;i<5;i++) {
      pids_[j][i] = i+1+j*10+9000;
    }
  }
  return pids_;
}

function calculateBundles() {
  var productsAmounts = document.getElementsByName("Amount");  
  for(var i=0;i<productsAmounts.length;i++)
  {
    var locAmount = productsAmounts[i].value;
    cnt = 0;
    amounts[i] = new Array();  
    ids[i] = new Array(); 
    pids = createPIDS();
    brack(locAmount,20,pids[i],i);
  }
  document.LIZ.action = createURI();
  //document.LIZ.submit();
}
</script>
</head>
<body>
<form method="post" name="LIZ" action="https://shop.xxx.com/cgi-bin/cart/ml=DE?">  
<table id="table1">  
  <thead>
    <tr class="odd">  
      <td class="column1"></td>  
      <th scope="col" abbr="Home">5er Lizenz Bundle</th>  
      <th scope="col" abbr="Home Plus">10er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">20er Lizenz Bundle</th>  
      <th scope="col" abbr="Business">Ab 50 Lizenzen</th>  
      <th scope="col" abbr="Business">Ab 250 Lizenzen</th>  
    </tr>
  </thead>
  <tfoot>
  </tfoot>
  <tbody>
	<tr><th scope="row" class="column1">Produkt</th><td id="td1"><span class="Stil1">100</span> / Bundle (ID 9001) </td>  
	<td id="td1"><span class="Stil1">200</span> / Bundle (ID 9002) </td>  

	<td id="td1"><span class="Stil1">300</span> / Bundle (ID 9003) </td>  
	<td id="td1"><span class="Stil1">400</span> / Bundle (ID 9004) </td>  
	<td id="td1"><span class="Stil1">500</span> / Bundle (ID 9005) </td>  
	</tr><tr><td colspan="5">Menge:<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" /></td></tr><tr>  
	<tr><th scope="row" class="column1">Produkt</th><td id="td1"><span class="Stil1">100</span> / Bundle (ID 9011) </td>  

	<td id="td1"><span class="Stil1">200</span> / Bundle (ID 9012) </td>  
	<td id="td1"><span class="Stil1">300</span> / Bundle (ID 9013) </td>  
	<td id="td1"><span class="Stil1">400</span> / Bundle (ID 9014) </td>  
	<td id="td1"><span class="Stil1">500</span> / Bundle (ID 9015) </td>  
	</tr><tr><td colspan="5">Menge:<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" /></td></tr><tr>  

	<tr><th scope="row" class="column1">Produkt</th><td id="td1"><span class="Stil1">100</span> / Bundle (ID 9021) </td>  
	<td id="td1"><span class="Stil1">200</span> / Bundle (ID 9022) </td>  
	<td id="td1"><span class="Stil1">300</span> / Bundle (ID 9023) </td>  
	<td id="td1"><span class="Stil1">400</span> / Bundle (ID 9024) </td>  

	<td id="td1"><span class="Stil1">500</span> / Bundle (ID 9025) </td>  
	</tr><tr><td colspan="5">Menge:<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" /></td></tr><tr>  
	<tr><th scope="row" class="column1">Produkt</th><td id="td1"><span class="Stil1">100</span> / Bundle (ID 9031) </td>  
	<td id="td1"><span class="Stil1">200</span> / Bundle (ID 9032) </td>  
	<td id="td1"><span class="Stil1">300</span> / Bundle (ID 9033) </td>  

	<td id="td1"><span class="Stil1">400</span> / Bundle (ID 9034) </td>  
	<td id="td1"><span class="Stil1">500</span> / Bundle (ID 9035) </td>  
	</tr><tr><td colspan="5">Menge:<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" /></td></tr><tr>  
	<tr><th scope="row" class="column1">Produkt</th><td id="td1"><span class="Stil1">100</span> / Bundle (ID 9041) </td>  
	<td id="td1"><span class="Stil1">200</span> / Bundle (ID 9042) </td>  

	<td id="td1"><span class="Stil1">300</span> / Bundle (ID 9043) </td>  
	<td id="td1"><span class="Stil1">400</span> / Bundle (ID 9044) </td>  
	<td id="td1"><span class="Stil1">500</span> / Bundle (ID 9045) </td>  
	</tr><tr><td colspan="5">Menge:<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" /></td></tr><tr>  
	<tr><th scope="row" class="column1">Produkt</th><td id="td1"><span class="Stil1">100</span> / Bundle (ID 9051) </td>  

	<td id="td1"><span class="Stil1">200</span> / Bundle (ID 9052) </td>  
	<td id="td1"><span class="Stil1">300</span> / Bundle (ID 9053) </td>  
	<td id="td1"><span class="Stil1">400</span> / Bundle (ID 9054) </td>  
	<td id="td1"><span class="Stil1">500</span> / Bundle (ID 9055) </td>  
	</tr><tr><td colspan="5">Menge:<input id="Amount" name="Amount" type="text" value="0" size="5" maxlength="3" /></td></tr><tr>  
  </tbody>
</table>
<br />
Anzahl der Lizenzen/Benutzer (Amount)
<br />
<input type="button" onClick="calculateBundles()" value="calculate">  
</form>
</body>
</html>
Member: FaBMiN
FaBMiN Apr 03, 2009 at 07:46:27 (UTC)
Goto Top
Guten Morgen face-smile
vielen Dank!
Wenn wir jetzt noch die Ausgabe von einem eigenen PopUp in ein Textfeld bekommen, dann bin ich glücklich! =D
Dann funktioniert nämlich auch die übergabe in php ordentlich!

Vielen Dank nochmal
Member: godlie
godlie Apr 03, 2009 at 07:59:58 (UTC)
Goto Top
Ich kann dir nciht folgen was meinst du? das was da in der textbox ausgegeb wird kannst durch löschen der Zeile 77 beseitigen.
danach wird die Form action url auf den entsprechenden link gelegt und wenn die bei der zeile 111 die // wegmachst dann wird die form sogar submitted.