PHP和xajax调用函数来做更改数量的动作


php and xajax call function to do change quantity action

之前我已经发布了一个关于购物车页面调用shopcart.php的帖子,但似乎没有人真正能回答它。每当我输入新的数量并点击更改数量按钮时,似乎无法获得新的数量并且按钮没有任何作用,(我真的已经非常非常努力地寻找了三个星期的解决方案,直到现在仍然无法找到问题所在的解决方案)希望大家能给我一个温暖的手,为我找到问题或提示我

<?php
  error_reporting(0);
  session_start();
  header('Content-type: text/html; charset=utf-8');
  include_once('../../xajax_core/xajax.inc.php');  // 引用 xajax
  $xajax = new xajax();            // 建立 xajax 物件
  // 註冊回應函式 
  $chaObj=$xajax->registerFunction('change_quantity');
  $chaObj->useSingleQuote();
  $chaObj->addParameter(XAJAX_FORM_VALUES,'form1');
  $xajax->processRequest();        // 處理回應
  $xajax->printJavascript();

  //---------------------- 自訂函式區 ---------------------
  // 負責更改商品數量的回應函式
  function change_quantity($form) {
    $objResponse = new xajaxResponse();  // 建立回應物件
    // 表單中的 Checkbox 屬性為 p_id, 若有勾選, 其值才會傳入
    // 所以檢查表單欄位中有 'p_id' 資料, 表示使用者有勾選產品
    // 此時才做後續處理
    if(isset($form['p_id'])) {
      // 逐筆處理每一個被勾選的產品
      foreach($form['p_id'] as $p_id) {
        // 根據產品的訂購數量決定處理方式
        if($form['qua'][$p_id]=='0') {
          // 若訂購數量被設為 0, 則將此產品從購物車中移除
          unset($_SESSION['cart'][$p_id]);
          if(count($_SESSION['cart'])==0) {  // 若購物車變成空的
            $objResponse->                   // 則關閉視窗
              script('alert("cart has no items");window.close();');
              unset($_SESSION['cart']);
          }
          else  { // 若購物車中還有其它商品
            // 將被刪除的產品從網頁中移除
            $objResponse->remove($p_id);
            // 更新購物車中的金額總計
            $objResponse->assign('total','innerHTML',gettotal());
          }
        }
        else if ($form['qua'][$p_id]>0) {
          // 若設為大於 0 的值, 則將之設為購物車中的新數量
          $_SESSION['cart'][$p_id]['quantity'] = $form['qua'][$p_id];
          // 因已修改數量, 所以要更新購物車中的小計及總計金額
          $objResponse->assign('sub[' . $p_id . ']', 'innerHTML',
                               $_SESSION['cart'][$p_id]['quantity'] *
                               $_SESSION['cart'][$p_id]['price']);
          $objResponse->assign('total','innerHTML',gettotal());
        }
        else {
          // 若被設為負值, 則將之回復原本的值
          $objResponse->assign('qua[' . $pid . ']', 'innerHTML',
                               $_SESSION[$pid]['quantity']);
        }
      }
    }
    return $objResponse;          // 傳回回應物件
  } // 回應函式 change_quantity() 結束
  // 計算總金額的函式
  function getTotal() {
    $total = 0;
    foreach($_SESSION['cart'] as $p_id => $item)
      $total += ($item['quantity'] * $item['price']);
    return $total;
  }

  //---------------------- 購物車 HTML  ---------------------
  // 目前購物車中有商品, 程式才取出購物車內產品並顯示於網頁
  if( !isset($_SESSION['cart']) ) { // 使用者尚未購物
    echo "<script>alert('"you haven't chosen any products'");" .
         "window.close();</script>";
    exit();
  }
?>
<title>購物車內容</title>

<!-- -------------------- 用戶端 JavaScript ------------------ -->
<script type="text/javascript">
// 勾選或取消產品清單中所有產品 checkbox 的函式
function select_all(formName, elementName, selectAllName) {
  elem = document.forms[formName].elements[elementName];
  if(!elem) // 若找不到元素
    return;
  else if(elem.length!= null) // 若網頁列出多個產品 (elem 是陣列)
    for(var i = 0; i < elem.length; i++)
      elem[i].checked =
        document.forms[formName].elements[selectAllName].checked;
  else
    elem.checked =
        document.forms[formName].elements[selectAllName].checked;
}
// 將勾選的產品之訂購數量設為0, 再產生非同步要求
function settozero(formName, elementName) {
  elem = document.forms[formName].elements[elementName];
  if(!elem) // 若找不到元素
    return;
  else if(elem.length!= null) { // 若網頁列出多個產品 (elem 是陣列)
    for(var i = 0; i < elem.length; i++)
      if(elem[i].checked) {
        var qua =
            document.getElementById("qua[" + elem[i].value + "]");
        var subtotal = document.getElementById("sub[" + elem[i].value + "]");

        qua.value = 0;  // 將數量設為 0
        subtotal.value = 0;

      }
  }
  else {
    var qua = document.getElementById("qua[" + elem.value + "]");
    var subtotal = document.getElementById("sub[" + elem.value + "]");

    qua.value = 0;  // 將數量設為 0
    subtotal.value = 0;
  }
  var total_value = document.getElementById("total");
  total_value.value = 0;
  <?php $chaObj->printScript(); // 輸出呼叫回應函式的程式碼 ?>
}
</script>
<?php $xajax->printJavaScript('/'); ?>

<!-- ------------------- 購物車表單及表頭 -------------------  -->
<link rel="StyleSheet" type="text/css" href="../module.css" />
<form name="form1" id="form1" method="post" action="checkout.php">
<table width="800" border="0" align="center"
       cellspacing="0" cellpadding="2"
       style="text-align:center;border:1px solid silver">
  <tr><th colspan="7">cart</th></tr>
  <tr style="background-color:silver;color:white">
    <td height="23" width="80">all
        <!----- 呼叫函式選取或取消全部的 checkbox ----->
        <input type="checkbox" name="all"
               onClick="select_all('form1','p_id[]',this.name);">
    </td>
    <td height="23" width="460">product name</td>
    <td height="23" width="60">unit price</td>
    <td width="10" height="23"></td>
    <td height="23" width="60">quantity</td>
    <td width="10" height="23"></td>
    <td width="70" height="23">subtotal</td>
  </tr>

<!-- -------------------- 輸出購物車內容 --------------------  -->
<?php
  // 呈現購物車表格內容
  $total = 0;
  foreach($_SESSION['cart'] as $p_id => $item) {
    // 將此列的 id 屬性設為 $p_id, 以方便移除產品
    echo "<tr id='$p_id'>'n";
    echo "<td width='80' height='21'>" .
         "<input type='checkbox' name='p_id[]' value='" .
         $p_id . "'></td>'n";
    echo "<td>" . $item['name'] . "</td>'n";
    echo "<td width='60' >" . $item['price'] . "</td>'n";
    echo "<td width='10' style='border-width:0'>×</td>'n";
    echo "<td width='60'>" .
         "<input type='text' name='qua[$p_id]' id='qua[$p_id]'
         value='" . $item['quantity'] . "' size='3'></td>";
    echo "<td width='10' style='border-width:0'>=</td>'n";
    echo "<td width='70' align='right'>" ."<input type='text' size='6' id='sub[$p_id]' value='".($item['quantity'] * $item['price'])."' disabled>"."</td></tr>'n";
  }
?>
  <tr>
    <td align="right" colspan="6">total:</td>
    <td align="right" style="border-top:1px solid silver;width:70">
        <input type="text" name="total" value="<?php echo gettotal(); // display total amount ?>" id="total">
    </td>
  </tr>
</table>

<!-- -------------------- cart button --------------------  -->
<table width="800" border="0" align="center">
  <tr>
    <td height="23" align="center">
        <input type="button" name="DEL" value="remove products"
               onClick="settozero('form1','p_id[]')">
    </td>
    <td height="23" align="center">
      <input type="button" name="UPD" value="change quantity"
             onClick="xajax_change_quantity(xajax.getFormValues('form1'))">
    </td>
    <td height="23" align="right">
        <input type="button" name="CONT" value="continue shopping"
               onClick="window.close();">
    </td>
    <td height="23" align="right">
        <input type="button" name="CONT" value="checkout"
               onClick="location.href='checkout.php';">
    </td>
  </tr>
</table>
</form>

不是"innerHTML"…因为tag id="total"是元素表单输入,正确的是"value"

$objResponse->assign('total','innerHTML',gettotal());

正确…

$objResponse->assign('total','value',gettotal());