#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. У меня есть пара последующих вопросов:
-
Мне было интересно, как я настраиваю форму ниже с помощью PHP, чтобы она публиковала записи при нажатии кнопки отправки?
-
Возможно ли сделать это с помощью 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. Я опубликовал обновление к своему первоначальному ответу выше. Любая помощь была бы высоко оценена.