Akses Limesurvey API dari PHP

Saya igin mengambil hasil survey di LimeSurvey. Bisa saja langsung query ke database. Namun ada satu hal yang agak rumit yaitu ketika kita langsung ambil di dari tabel misalnya lime_survey_638765 maka kita hanya mendapatkan keynya saja. Padahal dalam kasus tertentu kita membutuhkan valuenya.

Sebagai contoh misalnya ada pilihan  rating 1 sampai 5, array(‘A1’=>1, ‘A2’=>2, ‘A3’=>3, ‘A4’=>4, ‘A5’=>5). Sebenarnya kalau key dan valuenya hanya seperti itu masih mudah, namun pembuatan key yang bisa semaunya membuat harus berhati-hati.

Pengambilan value cukup rumit kalau dilihat dari Database Scemanya. Maka cara yang paling mudah adalah mengambil data dari API.

API biasanya ada dalam alamat seperti ini, http://limesurvey6.test/index.php/admin/remotecontrol walaupun untuk mengeluarkannya kita perlu melakukan setting pada menu “configuration > global > interfaces”.

Lalu, bagaimana cara kita mengambilnya dari PHP? Berikut saya berikan contoh untuk mengambil data dari salah satu survey menggunakan PHP.

<?php
define('LS_API_URL', 'http://limesurvey6.test/index.php/admin/remotecontrol');
define('LS_USERNAME', 'admin');
define('LS_PASSWORD', 'password');

function ls_api_request($method, $params = [], $id = 1) {
    $request = json_encode([
        'method' => $method,
        'params' => $params,
        'id'     => $id,
    ]);

    $ch = curl_init(LS_API_URL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// 1. Login
$loginResult = ls_api_request('get_session_key', [LS_USERNAME, LS_PASSWORD]);
$sessionKey = $loginResult['result'];
if (!$sessionKey) {
    die("Gagal login ke API");
}

// 2. Ambil responses dari survey ID 498572
$surveyId = 498572;
$responseResult = ls_api_request('export_responses', [
    $sessionKey,
    $surveyId,
    'json',     // Format export: 'json', 'csv', 'xml'
    'id',       // Bahasa, default 'en'
    'complete',  // Completed responses: 'complete','incomplete' or 'all'
    'short',    // Format heading: code / full
    'long'      // Format response sort / long
]);

$responseJson = $responseResult['result'];
$responseData = json_decode(base64_decode($responseJson)  );
$responseData = $responseData->responses;

// print_r($responseData);

// 3. Tampilkan hanya field tertentu 
foreach ($responseData as $row) {
    echo "F1: " . ($row->submitdate ?? '-') . " | ";
    echo "F2: " . ($row->startdate ?? '-') . "\n";
}

// 4. Logout
ls_api_request('release_session_key', [$sessionKey]);
?>

Berikut ini parameter export_responses

/**
     * Export responses in base64 encoded string
     *
     * @access public
     * @param string $sSessionKey Auth credentials
     * @param int $iSurveyID ID of the Survey
     * @param string $sDocumentType any format available by plugins (for example : pdf, csv, xls, doc, json)
     * @param string $sLanguageCode (optional) The language to be used
     * @param string $sCompletionStatus (optional) 'complete','incomplete' or 'all' - defaults to 'all'
     * @param string $sHeadingType (optional) 'code','full' or 'abbreviated' Optional defaults to 'code'
     * @param string $sResponseType (optional)'short' or 'long' Optional defaults to 'short'
     * @param integer $iFromResponseID (optional) Frpm response id
     * @param integer $iToResponseID (optional) To response id
     * @param array $aFields (optional) Name the fields to export
     * @param array $aAdditionalOptions (optional) Addition options for export, mainly 'convertY', 'convertN', 'nValue', 'yValue',
     * @return array|string On success: Requested file as base 64-encoded string. On failure array with error information
**/

Lalu bagaimana mekanisme untuk mengambil data agar efisien. Caranya adalah tidak langsung mengakses dari aplikasi namun disimpan dulu dalam tabel lain agar tidak memberatkan limesurvey.

Selamat mencoba !

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.