如何使用Wufoo API V3显示错误消息?

时间:2011-11-11 19:32:20

标签: json forms api wufoo

我正在使用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日):

MinisterOfPower,

感谢关于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执行此操作,因此页面无法刷新?

  3. 以下是代码:

    <?
    // 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-->
    

1 个答案:

答案 0 :(得分:2)

API docs概述了检索响应的过程。此外,字段错误的标记找到了Dealing With Failure部分。

Wufoo为PHPmany other语言提供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。

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

<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中编写的,因此它可能包含语法错误。但你可以明白这一点......