Как отображать сообщения об ошибках с помощью Wufoo API V3?

#json #forms #api #wufoo

#json #формы #API #wufoo

Вопрос:

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

Мне было интересно, как я могу проверять наличие сообщений об ошибках и отображать текст ошибки для каждого поля ввода текста с помощью 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] по поводу оболочки Wufoo PHP API. Сейчас я использую оболочку API, и она работает. У меня возникли некоторые проблемы с интеграцией кода, который вы предоставили в моей форме.

Например, если у меня есть форма на 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):

Теперь я могу отображать сообщения об ошибках с помощью кода 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-->
  

Ответ №1:

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

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

Используя Wufoo API, вы должны выполнить поиск значения успеха 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 param URL-адреса, перечисляя поля ошибок и сообщения. Итак, например, вы могли бы сделать это:

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

if($str) {
    $str = '?errors=trueamp;'.$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("amp;"); 
  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, поэтому он, вероятно, будет содержать синтаксические ошибки. Но вы можете уловить суть…

Комментарии:

1. Министр могущества, я ценю быстрый ответ. Я опубликовал следующий вопрос выше.

2. Спасибо, что объяснили это на PHP. Я был бы невероятно признателен, если бы вы могли создать пример с помощью javascript, потому что я с ним лучше знаком.

3. Спасибо за доработку. Я все еще работаю над кодом. Скоро я опубликую обновление.

4. У меня возникла некоторая проблема с перенаправлением обратно на форму со значением в параметре GET URL. Также, когда я пытаюсь протестировать оболочку API самостоятельно, я получаю следующую ошибку «Неустранимая ошибка: использование $ this, когда не в контексте объекта …» Кстати, возможно ли проверять и отображать ошибки без обновления страницы с помощью AJAX?

5. Я опубликовал обновление к своему первоначальному ответу выше. Любая помощь была бы высоко оценена.