【问题标题】:javascript for loop to get order detailsjavascript for 循环获取订单详情
【发布时间】:2013-05-26 19:37:37
【问题描述】:

我想在这个 nopcart.js 文件中放置一个 for 循环,以便我可以将订单的详细信息保存为字符串。目前它正在将订单的所有详细信息输出到表格中以显示结帐页面。我只想要数组信息

fields = new Array;
          fields[0] = database.substring( 0, Token0 );                 // Product ID
          fields[1] = database.substring( Token0+1, Token1 );          // Quantity
          fields[2] = database.substring( Token1+1, Token2 );          // Price
          fields[3] = database.substring( Token2+1, Token3 );          // Product Name/Description
          fields[4] = database.substring( Token3+1, Token4 );          // Shipping Cost
          fields[5] = database.substring( Token4+1, database.length ); //Additional Information

循环并保存到一个字符串中。然后将所有订单详细信息放在一个字符串上,然后我可以将其保存到 php.ini 中的文本文件中。 (我们暂时没有使用 SQL。

到目前为止,我的尝试只得到了购物车中的最后一项,或者循环也在编写 html 表格代码。这是一个 uni 任务,我们不打算编辑基本的购物车功能,但我认为将客户和订单详细信息保存到文本文件会更有用。

//---------------------------------------------------------------------||
// FUNCTION:    CheckoutCart                                           ||
// PARAMETERS:  Null                                                   ||
// RETURNS:     Product Table Written to Document                      ||
// PURPOSE:     Draws current cart product table on HTML page for      ||
//              checkout.                                              ||
//---------------------------------------------------------------------||
function CheckoutCart( ) {
   var iNumberOrdered = 0;    //Number of products ordered
   var fTotal         = 0;    //Total cost of order
   var fTax           = 0;    //Tax amount
   var fShipping      = 0;    //Shipping amount
   var strTotal       = "";   //Total cost formatted as money
   var strTax         = "";   //Total tax formatted as money
   var strShipping    = "";   //Total shipping formatted as money
   var strOutput      = "";   //String to be written to page
   var bDisplay       = true; //Whether to write string to the page (here for programmers)
   var strPP          = "";   //Payment Processor Description Field

   iNumberOrdered = GetCookie("NumberOrdered");
   if ( iNumberOrdered == null )
      iNumberOrdered = 0;

   if ( TaxByRegion ) {
      QueryString_Parse();
      fTax = parseFloat( QueryString( OutputOrderTax ) );
      strTax = moneyFormat(fTax);
   }

   if ( bDisplay )
      strOutput = "<TABLE CLASS=\"nopcart\"><TR>" +
                  "<TD CLASS=\"nopheader\"><B>"+strILabel+"</B></TD>" +
                  "<TD CLASS=\"nopheader\"><B>"+strDLabel+"</B></TD>" +
                  "<TD CLASS=\"nopheader\"><B>"+strQLabel+"</B></TD>" +
                  "<TD CLASS=\"nopheader\"><B>"+strPLabel+"</B></TD>" +
                  (DisplayShippingColumn?"<TD CLASS=\"nopheader\"><B>"+strSLabel+"</B></TD>":"") +
                  "</TR>";

   for ( i = 1; i <= iNumberOrdered; i++ ) {
      NewOrder = "Order." + i;
      database = "";
      database = GetCookie(NewOrder);

      Token0 = database.indexOf("|", 0);
      Token1 = database.indexOf("|", Token0+1);
      Token2 = database.indexOf("|", Token1+1);
      Token3 = database.indexOf("|", Token2+1);
      Token4 = database.indexOf("|", Token3+1);

      fields = new Array;
      fields[0] = database.substring( 0, Token0 );                 // Product ID
      fields[1] = database.substring( Token0+1, Token1 );          // Quantity
      fields[2] = database.substring( Token1+1, Token2 );          // Price
      fields[3] = database.substring( Token2+1, Token3 );          // Product Name/Description
      fields[4] = database.substring( Token3+1, Token4 );          // Shipping Cost
      fields[5] = database.substring( Token4+1, database.length ); //Additional Information



      fTotal     += (parseInt(fields[1]) * parseFloat(fields[2]) );
      fShipping  += (parseInt(fields[1]) * parseFloat(fields[4]) );
      if ( !TaxByRegion ) fTax = (fTotal * TaxRate);
      strTotal    = moneyFormat(fTotal);
      if ( !TaxByRegion ) strTax = moneyFormat(fTax);
      strShipping = moneyFormat(fShipping);

      if ( bDisplay ) {
         strOutput += "<TR><TD CLASS=\"nopentry\">"  + fields[0] + "</TD>";

         if ( fields[5] == "" )
            strOutput += "<TD CLASS=\"nopentry\">"  + fields[3] + "</TD>";
         else
            strOutput += "<TD CLASS=\"nopentry\">"  + fields[3] + " - <I>"+ fields[5] + "</I></TD>";

         strOutput += "<TD CLASS=\"nopentry\">" + fields[1] + "</TD>";
         strOutput += "<TD CLASS=\"nopentry\">"+ MonetarySymbol + moneyFormat(fields[2]) + "/ea</TD>";

         if ( DisplayShippingColumn ) {
            if ( parseFloat(fields[4]) > 0 )
               strOutput += "<TD CLASS=\"nopentry\">"+ MonetarySymbol + moneyFormat(fields[4]) + "/ea</TD>";
            else
               strOutput += "<TD CLASS=\"nopentry\">N/A</TD>";
         }

         strOutput += "</TR>";
      }

      if ( AppendItemNumToOutput ) {
         strFooter = i;
      } else {
         strFooter = "";
      }
      if ( PaymentProcessor != '' ) {
         //Process description field for payment processors instead of hidden values.
         //Format Description of product as:
         // ID, Name, Qty X
         strPP += fields[0] + ", " + fields[3];
         if ( fields[5] != "" )
            strPP += " - " + fields[5];
         strPP += ", Qty. " + fields[1] + "\n";
      } else {
         strOutput += "<input type=hidden name=\"" + OutputItemId        + strFooter + "\" value=\"" + fields[0] + "\">";
         strOutput += "<input type=hidden name=\"" + OutputItemQuantity  + strFooter + "\" value=\"" + fields[1] + "\">";
         strOutput += "<input type=hidden name=\"" + OutputItemPrice     + strFooter + "\" value=\"" + fields[2] + "\">";
         strOutput += "<input type=hidden name=\"" + OutputItemName      + strFooter + "\" value=\"" + fields[3] + "\">";
         strOutput += "<input type=hidden name=\"" + OutputItemShipping  + strFooter + "\" value=\"" + fields[4] + "\">";
         strOutput += "<input type=hidden name=\"" + OutputItemAddtlInfo + strFooter + "\" value=\"" + fields[5] + "\">";

      } 

   }

   if ( bDisplay ) {
      strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strSUB+"</B></TD>";
      strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strTotal + "</B></TD>";
      strOutput += "</TR>";

      if ( DisplayShippingRow ) {
         strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strSHIP+"</B></TD>";
         strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strShipping + "</B></TD>";
         strOutput += "</TR>";
      }

      if ( DisplayTaxRow || TaxByRegion ) {
         strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strTAX+"</B></TD>";
         strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strTax + "</B></TD>";
         strOutput += "</TR>";
      }

      strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strTOT+"</B></TD>";
      strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + moneyFormat((fTotal + fShipping + fTax)) + "</B></TD>";
      strOutput += "</TR>";

      strOutput += "</TABLE>";


      if ( PaymentProcessor == 'an') {
         //Process this for Authorize.net WebConnect
         strOutput += "<input type=hidden name=\"x_Version\" value=\"3.0\">";
         strOutput += "<input type=hidden name=\"x_Show_Form\" value=\"PAYMENT_FORM\">";
         strOutput += "<input type=hidden name=\"x_Description\" value=\""+ strPP + "\">";
         strOutput += "<input type=hidden name=\"x_Amount\" value=\""+ moneyFormat((fTotal + fShipping + fTax)) + "\">";
      } else if ( PaymentProcessor == 'wp') {
         //Process this for WorldPay
         strOutput += "<input type=hidden name=\"desc\" value=\""+ strPP + "\">";
         strOutput += "<input type=hidden name=\"amount\" value=\""+ moneyFormat((fTotal + fShipping + fTax)) + "\">";
      } else if ( PaymentProcessor == 'lp') {
         //Process this for LinkPoint         
         strOutput += "<input type=hidden name=\"mode\" value=\"fullpay\">";
         strOutput += "<input type=hidden name=\"chargetotal\" value=\""+ moneyFormat((fTotal + fShipping + fTax)) + "\">";
         strOutput += "<input type=hidden name=\"tax\" value=\""+ MonetarySymbol + strTax + "\">";
         strOutput += "<input type=hidden name=\"subtotal\" value=\""+ MonetarySymbol + strTotal + "\">";
         strOutput += "<input type=hidden name=\"shipping\" value=\""+ MonetarySymbol + strShipping + "\">";
         strOutput += "<input type=hidden name=\"desc\" value=\""+ strPP + "\">";
      } else {
         strOutput += "<input type=hidden name=\""+OutputOrderSubtotal+"\" value=\""+ MonetarySymbol + strTotal + "\">";
         strOutput += "<input type=hidden name=\""+OutputOrderShipping+"\" value=\""+ MonetarySymbol + strShipping + "\">";
         strOutput += "<input type=hidden name=\""+OutputOrderTax+"\"      value=\""+ MonetarySymbol + strTax + "\">";
         strOutput += "<input type=hidden name=\""+OutputOrderTotal+"\"    value=\""+ MonetarySymbol + moneyFormat((fTotal + fShipping + fTax)) + "\">";
      }
   }

   document.write(strOutput);


   document.close();
}

感谢大家的帮助,你们已经帮了我不少忙了。我迫不及待地等到我对编程更加熟悉并且可以立即解决这些问题。

【问题讨论】:

    标签: javascript html loops for-loop


    【解决方案1】:

    更新

    根据我们的讨论,这是您正在寻找的代码(或类似的东西)吗?

    // Return a string containing all of the items in the cart,
    // one line per item with a newline character after each line,
    // and the fields in each line separated by | characters.
    function getCartString() {
        var result = '',
            count = GetCookie('NumberOrdered') || 0;
        for( var i = 1;  i <= count;  i++ ) {
            result += GetCookie( 'Order.' + i ) + '\n';
        }
        return result;
    }
    

    这段代码中有什么你不明白的地方吗?我很乐意解释。它产生的格式是您想要的吗?如果不是,请详细描述您想要的格式,并且生成它应该很简单 - 现在来自 nopcart.js 罚款的糟糕代码已经消失,所以它不会让我们所有人感到困惑。

    原答案

    你写的代码太多了!当你有如此多的重复时,它很难跟上,而且很容易出错。

    编辑:笑话是在我身上!这不是您编写的代码,也不是您的教授或类似人员编写的代码,它是“动态 HTML”时代遗留下来的一些可怕的脚本。不过,对于必须处理这样的脚本的任何人,以下内容可能会有一两个有用的提示。 :-)

    您现在要专注的最重要的事情是如何简化您的代码。有两个领域特别突出:

    1. 尽可能使用内置的 JavaScript 功能而不是手动编码。
    2. 每当您发现自己重复了一段代码时,就把它变成一个函数。

    这是一个例子:

    database = "";
    database = GetCookie(NewOrder);
    
    Token0 = database.indexOf("|", 0);
    Token1 = database.indexOf("|", Token0+1);
    Token2 = database.indexOf("|", Token1+1);
    Token3 = database.indexOf("|", Token2+1);
    Token4 = database.indexOf("|", Token3+1);
    
    fields = new Array;
    fields[0] = database.substring( 0, Token0 );                 // Product ID
    fields[1] = database.substring( Token0+1, Token1 );          // Quantity
    fields[2] = database.substring( Token1+1, Token2 );          // Price
    fields[3] = database.substring( Token2+1, Token3 );          // Product Name/Description
    fields[4] = database.substring( Token3+1, Token4 );          // Shipping Cost
    fields[5] = database.substring( Token4+1, database.length ); //Additional Information
    

    该代码可以替换为:

    var database = GetCookie(NewOrder);
    var fields = database.split('|');
    

    是的,真的!这完全一样。 (嗯,不完全正确。如您所见,它不会创建所有 Token0Token1 等变量,但这些变量并不会在其他任何地方使用。)

    此外,您应该删除完全删除这些 cmets,而是为所有这些字段创建命名变量:

    var database = GetCookie(NewOrder);
    var fields = database.split('|'),
        productID = fields[0],
        quantity = parseInt( fields[1], 10 ),
        price = +fields[2],
        description = fields[3],
        shipping = +fields[4],
        moreInfo = fields[5];
    

    然后在其余代码中,您可以将所有 fields[n] 引用替换为这些名称。例如这段代码:

     fTotal += ( parseInt(fields[1]) * parseFloat(fields[2]) );
    

    可以替换为:

     fTotal += quantity * price;
    

    这样更易读,不是吗?

    相关说明:

    1. 如果您使用parseInt()总是在第二个参数中提供一个明确的基础。否则,如果用户碰巧输入“010”,它将被转换为8,这可能不是预期的。
    2. 为简单起见,您可以使用+someString 代替parseFloat(someString)

    现在我将留给你一些练习。查看您将此类代码重复多次但有细微变化的所有地方:

    strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strSUB+"</B></TD>";
    strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strTotal + "</B></TD>";
    strOutput += "</TR>";
    

    您能想出一种方法,您可以编写该代码一次并多次调用它,并传入针对每个实例更改的项目吗?例如在这段代码的重复中,除了你输入strSUBSymbol + strTotal的地方之外,每次都是一样的。代码重复的下一个地方,它在这些地方有strSHIPMonetarySymbol + strShipping,但其他地方是相同的。以此类推。

    在 JavaScript 中有没有一种方法可以编写一段可重用的代码,您可以在其中传递这样的参数,这样大部分代码只出现一次,然后您为每个单独的实例提供参数?

    最后,一个小的风格说明。你的一些 HTML 有&lt;lowercasetags&gt;,有一些有&lt;UPPERCASETAGS&gt;。浏览器不管大小写都会以相同的方式对待它们,但最好保持一致,现代 JavaScript/HTML 代码使用&lt;lowercasetags&gt;

    【讨论】:

    • 感谢您的深入回复! nopcart.js 是给我们使用的,我现在只是对其进行修改以将订单详细信息转换为要保存的字符串。我现在将尝试一下,看看我是怎么做的,我知道你的方式更容易阅读,但我有点犹豫要修改这段代码,而不知道很多关于 javascript 的知识并犯了错误。
    • 啊,这段代码不是你写的,它是作为作业的一部分给你修改的?那么请原谅我说“你写的代码太多了!”诸如此类的事情。但是你的教授写过这段代码吗?然后我会脱掉手套:这个人不知道如何编码,你应该非常小心地向他们学习东西。但是你绝对是对的,当给你一段无可救药的乱码,你必须修改时,最好小心行事!不过,至少你可以试试.split('|') 代码,而不是更长的版本。
    • 我很确定 nopcart 代码来自 2005 年...here 我试图解释我想要什么,但不确定我是否解释得足够好。我认为将数组保存为字符串可能对我更有效
    • 我明白了……我以为这是教授在作业中分发的一些代码。那是一个可怕的想法!好消息是您最终会丢弃该函数中的几乎所有代码——就像所有的 HTML 字符串连接一样。但我不明白的是:在您调用var database = GetCookie(NewOrder); 之后,您已经 拥有一个字符串中的所有数据,即database 变量。你为什么不扔掉所有其余的代码,只使用这个字符串?
    • 事实上,你应该这样做:完全忘记代码,只描述数据。准确指定您要获取的数据以及您想要生成的数据 - 确切的样子。然后代码将很容易弄清楚。在那之前,我们只是猜测。
    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2013-02-13
    • 2012-03-05
    • 2023-04-02
    • 1970-01-01
    • 2019-03-20
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多