0

Wufoo API V3 を使用して、Web サイトでホストされているフォームから 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 ラッパーを使用しています。あなたが提供したコードを私のフォームに統合するのにいくつかの課題があります。

たとえば、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 ドキュメントで概説されています。また、フィールド エラーのマークアップは、「失敗に対処する」セクションにありました。

Wfoo がPHP他の多くの言語用の API ラッパーを提供していることには何の価値もありません。プロセスが非常に簡単になるため、それらのいずれかを使用することを強くお勧めします。

以下に示すように、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 を追加して、色やその他のインジケーターでエラー フィールドを呼び出します。

これを行うもう 1 つの方法は、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 に答える