Как отображать сообщения об ошибках с Wufoo API V3? - PullRequest
0 голосов
/ 11 ноября 2011

Я использую Wufoo API V3 для отправки данных из формы, размещенной на моем веб-сайте, в мою учетную запись Wufoo. Я последовал примеру на странице [Entries POST API] [1] и смог успешно передать данные в свою учетную запись.

Мне было интересно, как я могу проверять сообщения об ошибках и отображать ErrorText для каждого поля ввода текста, используя PHP?

Например, если кто-то не указал свой адрес электронной почты в обязательном поле.

Вот код, который у меня есть:

<?
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();
?>

ОБНОВЛЕНИЕ (12 ноября 2011 г.):

MinisterOfPower

Спасибо за [ответ и совет] [2] о оболочке PHP API Wufoo. Я сейчас использую 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.
}

ОБНОВЛЕНИЕ (20 ноября 2011 г.):

Теперь я могу отображать сообщения об ошибках с помощью кода MinistryofPower и оболочки API Wufoo. У меня есть пара вопросов:

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

1 Ответ

2 голосов
/ 12 ноября 2011

Процесс получения ответа описан в API документах . Кроме того, разметка для полевых ошибок найдена в разделе Работа с ошибкой .

Ничего не стоит, что Wufoo предлагает API Wrappers для PHP и многих других языков. Я настоятельно рекомендую использовать один из них, поскольку они значительно упрощают процесс.

Используя API Wufoo, вы должны найти значение Success 0 в объекте ответа, а затем проанализировать узел «Ошибки поля», как показано здесь:

$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, вы можете перенаправить обратно в форму со значением в параметре GET URL-адреса, перечисляя поля ошибок и сообщения. Так, например, вы можете сделать это:

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, поэтому он, вероятно, будет содержать синтаксические ошибки. Но вы можете понять суть ...

...