Хранить все записи в одном массиве от Wufoo API-интерфейс


Что я делаю

Используя В3 из Wufoo по API для получения всех записях и хранить в одном массиве ($all_results). Это необходимо из-за предел 100 записи ограничить, что Wufoo и при получении результатов от их API. Также сохранять результаты в файл, мы не получаем медленные ответы от API.

Мой вопрос

Мне интересно, как я мог бы сделать это лучше. Этот код работает для меня, но я хочу сделать лучше.

<?php

function wufoo_entries() {
    // Setup
    $account = "ACCOUNT_NAME";
    $form = "FORM_NAME";
    $api_key = "YOUR-API-KEY";
    $offset = 0;
    $limit = 100;
    $check_int = 15 * 60; // 15 minutes
    $file_time = 'time_stamp.txt';
    $file_results = 'results.txt';


    // Check for the last update
    $time = time();
    $time_stamp = file_get_contents($file_time);
    $refresh = ($check_int < ($time - $time_stamp)) ? TRUE : FALSE;

    // if true run functions and save the results and time to file else pull the results from file
    if ($refresh) {
        // Initialize our results array
        $all_results = array();

        // How many entries are there?
        $api_uri = "https://$account.wufoo.com/api/v3/forms/$form/entries/count.json";
        $count = wufoo_api($api_key, $account, $form, $offset, $limit, $api_uri);
        $counted = $count['EntryCount'];

        // Call the api as many times as needed
        for ($offset = 0; $offset <= $counted - 1; $offset = $offset + $limit) {
            $results = wufoo_api($api_key, $account, $form, $offset, $limit);
            // Limit the number of times we put results into the $all_results array to make sure we don't end up with blanks
            $limit = (($offset + $limit) > $counted) ? $limit - (($offset + $limit) - $counted) : $limit;

            // Iterate through the Entries array to push each entry into a new array
            for ($result = 0; $result <= $limit - 1; $result++) {
                array_push($all_results, $results['Entries'][$result]);
            }
        }

        // Save the new results (as json) and time to file
        $all_results_file = json_encode($all_results);
        file_put_contents($file_results, $all_results_file);
        file_put_contents($file_time, $time);
        return $all_results;
    }

    else {
        // Pull the results array from file
        $all_results = file_get_contents($file_results);
        $all_results = json_decode($all_results, true);
        return $all_results;
    }
}

function wufoo_api($api_key, $account, $form, $offset, $limit, $api_uri = NULL) {
    // Check to see if it's asking for the the entries or the total count
    $api_url = ($api_uri) ? $api_uri : 'https://' . $account . '.wufoo.com/api/v3/forms/' . $form . '/entries.json?pageStart=' . $offset . '&pageSize=' . $limit;

    $curl = curl_init($api_url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_USERPWD, $api_key . ':footastic');
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_USERAGENT, 'Wufoo Sample Code');
    $response = curl_exec($curl);
    $resultStatus = curl_getinfo($curl);

    if ($resultStatus['http_code'] == 200) {
        $results = json_decode($response, true);
        return $results;
    } else {
        $results = 'Call Failed '.print_r($resultStatus, true);
        return $results;
    }
}

// Show me some results and make sure it works
echo "<pre>";
print_r(wufoo_entries());
echo "</pre>";

?>


759
4
задан 15 ноября 2011 в 12:11 Источник Поделиться
Комментарии
1 ответ

Просто некоторым заметку:

1, я бы отдельные параметры конфигурации для отдельного php-файла (и использовать WufooConfig класс/struct) и включить его в начале кода. Это делает настройку проще поменять. Если вы используете WufooConfig класс/struct и передать его wufoo_entries() функции вы сможете использовать ту же функцию для извлечения данных из более чем одного счета. Кроме того, он будет инкапсулировать конфигурации, так что вы просто должны пройти вокруг одного параметра вместо $счет, $форма, $api_keyи т. д.

class WufooConfig {
private $account;
private $form;
private $api_key;
...

public function __construct($account, ...) {
$this->account = $account;
...
}
}

2, извлеките затем и другой ветви, если в wufoo_entries() функции:

if ($refresh) {
$results = fetchContent(...);
saveToCache($results, ...); // write file here
return $results
} else {
return getCachedContent();
}

Это делает код легче читать, вы увидите сразу большую картину, она не будет отвлекаться на низкоуровневые API-вызовов.

По той же причине я создать несколько новых функций, например:

functio entryCount(...)
$count = wufoo_api($api_key, $account, $form, $offset, $limit, $api_uri);
$counted = $count['EntryCount'];
return $counted;
}

Название функции говорит то, что вы хотите сделать и тела показывает, как вы делаете это.

3, Изменение

for ($offset = 0; $offset <= $counted - 1; ...

для

for ($offset = 0; $offset < $counted;

Это более распространенная.

4, во внутренней для цикла $результат переменной цикла это немного запутанно, можно легко перепутать с $Результаты. $resultIndex будет лучше.

for ($resultIndex = 0; $resultIndex < $limit; $resultIndex++) {  
array_push($all_results, $results['Entries'][$resultIndex]);
}

Наконец, я согласен с @Яннис Rizos, вся логика будет лучше как класс.

2
ответ дан 15 ноября 2011 в 08:11 Источник Поделиться