0

我正在使用 Wufoo API V3 将我网站上托管的表单中的数据提交到我的 Wufoo 帐户。我按照 [Entries POST API][1] 页面上的示例进行操作,并且能够成功地将数据发送到我的帐户。

我想知道如何检查错误消息,并使用 PHP 为每个文本输入字段显示 ErrorText?

例如,如果有人没有在必填的电子邮件字段中提供他们的电子邮件地址。

这是我到目前为止的代码:

<?
function submit() { 
    $ref = curl_init('https://myname.wufoo.com/api/v3/forms/xxxxxx/entries.json'); 
    curl_setopt($ref, CURLOPT_HTTPHEADER, array('Content-type: multipart/form-data')); 
    curl_setopt($ref, CURLOPT_POST, true); 
    curl_setopt($ref, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ref, CURLOPT_POSTFIELDS, getPostParams()); 
    curl_setopt($ref, CURLOPT_USERPWD, 'XXXX-XXXX-XXXX-XXXX'); 
    curl_setopt($ref, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
    curl_setopt($ref, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ref, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($ref, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ref, CURLOPT_USERAGENT, 'Wufoo.com'); 
    $response = curl_exec($ref);
    echo $response;  
} 

function getPostParams() { 
    return array( 'Field4' => "you@company.com"); 
} 

submit();
?>

更新(2011 年 11 月 12 日):

权力部长,

感谢关于 Wufoo PHP API Wrapper 的[回复和建议][2]。我现在正在使用 API Wrapper 并且它很糟糕。我在将您提供的代码与我的表单集成时遇到了一些挑战。

例如,如果我在 index.php(见下文)上有一个带有电子邮件必填字段的表单。提交表单后,如何设置 API 包装器以在适当的输入字段旁边显示错误?

这是index.php的代码:

<? require_once('my-wrapper.php'); ?>
<html>
<head>
<title>Form</title>
</head>
<body>
<form id="form1" name="form1" autocomplete="off" enctype="multipart/form-data" method="post" action="">
    <div>
        <label id="email" class="icons" for="Field4">Email</label>
        <input id="Field4" name="Field4" type="text" class="formreg"/>
    </div>
    <div>
        <label id="name" class="icons" for="Field6">Name</label>
        <input id="Field6" name="Field6" type="text" class="formreg"/>
    </div>
    <input type="submit" name="saveForm" value="Submit" id="submit" class="submit" />
    <input type="hidden" id="idstamp" name="idstamp" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=" />
</form>   
</body>
</html>

这是my-wrapper.php的代码:

$wrapper = new WufooApiWrapper('XXXX-XXXX-XXXX-XXXX', 'mysubdomain','wufoo.com'); 
$postArray = array();
foreach ($this->postValues as $value => $key) {
    $postArray[] = new WufooSubmitField($key, $value);
}

try {
    $result = $wrapper->entryPost('XXXXXX', $postArray);         
    if (!$result->Success) {
        foreach ($result->FieldErrors as $key => $value) {
            echo "Error on $key.  Error Text: $value <br />";
        }
    }
} catch (Exception $e) {
    //Read the error message.
}

更新(2011 年 11 月 20 日):

我现在可以在MinisterofPower 的代码和Wufoo API 包装器的帮助下显示错误消息。我有几个后续问题:

  1. 我想知道如何使用 PHP 设置下面的表单,以便在按下提交按钮时发布条目?

  2. 是否可以使用 AJAX 来做到这一点,这样页面就不会刷新?

这是代码:

<?
// API
require_once('WufooApiExamples.php');

// Wufoo
$wrapper = new WufooApiWrapper('XXXX-XXXX-XXXX-XXXX', 'mysubdomain','wufoo.com'); 


// Post Entries    
$postArray = array();
foreach ($this->postValues as $key => $value) {
    $postArray[] = new WufooSubmitField($key, $value);
}

try {
    $result = $wrapper->entryPost('xxxxxx', $postArray);
    if (!$result->Success) {  
        foreach ($result->FieldErrors as $key => $value) { 
           $fieldError[$value->ID] = $value->ErrorText;
        } 
    } 
} catch (Exception $e) {
    //Read the error message.
}

// Add Errors
function addErrors($fieldName, $fieldError, $add){
    if($fieldError[$fieldName] != ''){
        if ($add == 'message') return '<p class="errors">'.$fieldError[$fieldName].'</p>';
        else if ($add == 'class') return 'class ="errors"';
    }
}
?>

<!--Begin Form-->
<div <? echo addErrors('Field4', $fieldError, 'class') ?>>
<label id="profile" class="icons" for="Field4">Email</label>
<input id="Field4" name="Field4" type="text" class="formreg" tabindex="1"/>
<? echo addErrors('Field4', $fieldError, 'message')?>
</div>

<div <? echo addErrors('Field6', $fieldError, 'class') ?>>
<label id="profile" class="icons" for="Field6">Name</label>
<input id="Field6" name="Field6" type="text" class="formreg" tabindex="1"/>
<? echo addErrors('Field6', $fieldError, 'message')?>
</div>
<!--End Form-->
4

1 回答 1

2

API 文档中概述了检索响应的过程。此外,在处理失败部分中的字段错误标记。

Wufoo 为PHP许多其他语言提供 API Wrappers 是毫无价值的。我强烈建议使用其中一种,因为它们使过程变得更加容易。

使用 Wufoo API,您将在响应对象中搜索 Success 值 0,然后解析 Field Errors 节点,如下所示:

$wrapper = new WufooApiWrapper($this->apiKey, $this->subdomain, 'wufoo.com');
$postArray = array();
foreach ($this->postValues as $value => $key) {
    $postArray[] = new WufooSubmitField($key, $value);
}

try {
    $result = $wrapper->entryPost($this->formHash, $postArray);         
    if (!$result->Success) {
        foreach ($result->FieldErros as $key => $value) {
            echo "Error on $key.  Error Text: $value <br />";
        }
    }
} catch (Exception $e) {
    //Read the error message.
}

上面发布了一个后续问题,所以我将在这里添加我的答案。

您询问了如何在相关表单旁边显示错误。您可以使用 javascript 或 php 执行此操作。我将只向您展示 PHP 方式。

使用 PHP,您可以使用 URL 的 GET 参数中的值重定向回表单,枚举错误字段和消息。因此,例如,您可以这样做:

for($result->FieldErrors as $name => $value) {
    $str.="$name=$value&";
}

if($str) {
    $str = '?errors=true&'.$str;
    $host  = $_SERVER['HTTP_HOST'];
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    header("Location: http://$host$uri/$str");
    exit;
}

然后,将上面的代码包装在这个 if 语句中,以检查回发时的错误值,如下所示:

if($_GET['errors']) {
    require_once('my-wrapper.php');
else
    //Your HTML HERE
endif

之后,添加一些 PHP 条件,如果它们包含错误,则将类名附加到您的字段中。例如:

<label id="Field4" class="icons <?php if ($_GET['Field4']) echo 'error'; ?>" for="Field4">Email</label>

最后,添加一些 CSS 以使用颜色或其他指示符标出错误字段。

另一种方法是使用 javascript。

使用与上述相同的逻辑,但将以下脚本添加到您的页面(从此处此处获取。)

<script type="text/javascript" charset="utf-8">
function getQueryVariable(variable) { 
  var query = window.location.search.substring(1); 
  var vars = query.split("&"); 
  for (var i=0;i<vars.length;i++) { 
    var pair = vars[i].split("="); 
    if (pair[0] == variable) { 
      return 'error'; 
    } 
  } 
}

function changeClass (elementID, newClass) {
    var element = document.getElementById(elementID);

    element.setAttribute("class", newClass); //For Most Browsers
    element.setAttribute("className", newClass); //For IE; harmless to other browsers.
}

changeClass('Field4', 'error');
</script>

然后改用这个标记:

   <label id="Field4" class="icons" for="Field4">Email</label> 

祝你好运。

PS:这里的代码是用 SO 写的,所以可能会包含语法错误。但你可以明白这一点...

于 2011-11-12T19:40:55.123 回答