-1

我正在尝试使用 Xero 会计软件的 API (php) 创建发票。如果我使用以下代码(摘录),我可以毫无问题地创建发票并添加产品:

$lineitem1 = new XeroAPI\XeroPHP\Models\Accounting\LineItem;
$lineitem1
->setItemCode(MODEL-REF1)
->setQuantity(10)
->setTaxType(NONE);
$arr_lineitem = [];
array_push($arr_lineitem, $lineitem1);

$lineitem2 = new XeroAPI\XeroPHP\Models\Accounting\LineItem;
$lineitem2
->setItemCode(MODEL-REF2)
->setQuantity(20)
->setTaxType(NONE);   
$arr_lineitem = [];
array_push($arr_lineitem, $lineitem2);

这没有任何问题,并将在发票上创建两个产品(MODEL-REF1 和 MODEL-REF2)及其相关的数量和税种。

当我尝试从上一页的表单中填充这些详细信息时,问题就开始了(因为每张发票上可能有 1 或 100 多种不同的产品)。该表单将传递具有唯一 id 的产品型号项目代码等(在下面的示例中由“X”显示自动递增 1),还将传递购买的产品线的总量。

例如,上述表格将是:

<input type="text" id="ItemCode**X**" name="ItemCode**X**" value="MODEL-REF1">
<input type="text" id="Quantity**X**" name="Quantity**X**" value="10">
<input type="text" id="TaxType**X**" name="TaxType**X**" value="NONE">

<input type="text" id="ItemCode**X**" name="ItemCode**X**" value="MODEL-REF2">
<input type="text" id="Quantity**X**" name="Quantity**X**" value="20">
<input type="text" id="TaxType**X**" name="TaxType**X**" value="NONE">

<input type="text" id="TotalProductsInLoop" name="TotalProductsInLoop" value="2">

因此,我认为我可以使用以下代码在脚本 API 端循环遍历这些值(然后将产品提交给 xero):

for ($i=1; $i<=$TotalProductsInLoop; $i++) {
   
    $ItemCode = $_POST['ItemCode'.$i];
    $Quantity = $_POST['Quantity'.$i];
    $TaxType = $_POST['TaxType'.$i];

    $lineitem . $i = new XeroAPI\XeroPHP\Models\Accounting\LineItem;
    $lineitem . $i
    ->setItemCode($ItemCode)
    ->setQuantity($Quantity)
    ->setTaxType($TaxType);
    
    $arr_lineitem = [];
    array_push($arr_lineitem, $lineitem . $i);
    
}

但是,这只是将循环中的最后一个产品(例如 MODEL-REF2)而不是其他产品的第一个产品提交到发票。

任何人都可以看到我在这里缺少什么吗?

我假设这与在数组中使用计数循环有关?

4

1 回答 1

1
  1. 我非常怀疑以下行是否在没有任何警告或错误的情况下执行:
    $lineitem . $i = new XeroAPI\XeroPHP\Models\Accounting\LineItem;
    $lineitem . $i
    ->setItemCode($ItemCode)
    ->setQuantity($Quantity)
    ->setTaxType($TaxType);

这个 ( $lineitem . $i) 是标准的字符串连接,不能这样创建编号变量。

实际上,您不需要编号变量,您可以在循环中重用单个变量。

  1. 您正在$arr_lineitem每个循环步骤中重置结果容器数组 ( )。所以它总是只包含最新的值。

正确的代码应该看起来更像这样:

$arr_lineitem = [];
for ($i=1; $i<=$TotalProductsInLoop; $i++) {
   
    $ItemCode = $_POST['ItemCode'.$i];
    $Quantity = $_POST['Quantity'.$i];
    $TaxType = $_POST['TaxType'.$i];

    $lineitem = new XeroAPI\XeroPHP\Models\Accounting\LineItem;
    $lineitem
    ->setItemCode($ItemCode)
    ->setQuantity($Quantity)
    ->setTaxType($TaxType);
    
    array_push($arr_lineitem, $lineitem);
}
于 2020-12-13T21:34:50.807 回答