2016-06-27 1 views
0

Я работаю над тем, как я могу экспортировать панель управления из какого-то определенного проекта, например, это link.API-интерфейс Doodboard GoodData Export

Код, который я сделал, создает ссылку для загрузки правильно, как и ожидалось. Но экспортированный файл PDF не приносит значения, отфильтрованные, как я намеревался.

Моей проблемы случаться ниже этот комментарий:

// Execute the dashboard with context 

... где я supose установить «все фильтры, которые влияют на панель», как ссылка выше говорит. Но он не указывает, как установить значение фильтра.

Я сделал весь код в PHP (замените все «{какой-вещь}», чтобы сделать этот код работать):

<?php 

    $login = '{email}'; 
    $pass = '{password}'; 

    $headers = array('accept' => 'Accept: application/json','content-type' => 'Content-Type: application/json; charset=utf-8'); 
    $data = json_encode(array('postUserLogin'=>array('login'=> $login,'password'=> $pass,'remember'=>0))); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($ch, CURLOPT_URL, "https://secure.gooddata.com/gdc/account/login"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    $output = curl_exec($ch); 
    $AuthSST = substr($output, strrpos($output, "GDCAuthSST=")+strlen("GDCAuthSST="), 17); 

    $headers = array('accept' => 'Accept: application/json', 
        'content-type' => 'Content-Type: application/json; charset=utf-8', 
        'cookie:' => 'Cookie: $Version=0; GDCAuthSST='.$AuthSST.' $Path=/gdc/account'); 

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_HTTPGET, 1); 
    curl_setopt($ch, CURLOPT_URL, "https://secure.gooddata.com/gdc/account/token"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    $output = curl_exec($ch);   

    $start = strrpos($output, "GDCAuthTT=")+strlen("GDCAuthTT="); 
    $finish = strrpos($output, "Path=/gdc"); 

    $GDCAuthTT = substr($output, $start, ($finish-$start)); 

    $headers = array('accept' => 'Accept: application/json', 
        'content-type' => 'Content-Type: application/json; charset=utf-8', 
        'cookie:' => 'Cookie: $Version=0; GDCAuthTT='.$GDCAuthTT.' $Path=/gdc/account'); 

    // Authentication finished, now start the dashboard export API 

    // Execute the dashboard with context 

    $project_id = '{project_id}'; 
    $filter_id = '{filter_id}'; 
    $filter_obj = '{0000}'; 
    $dash_obj = '{0000}'; 
    $url = 'https://secure.gooddata.com/gdc/internal/projects/'.$project_id.'/executionContexts'; 

    // Inside filters: constraint, promptUri, uri, id ||||||||| Inside executionContext: dashboard, links, name, type, user 

    $bode = json_encode(array('executionContext' => array('filters' => array(array(
          'uri' => '/gdc/md/'.$project_id.'/obj/'.$filter_obj, // /elements?id=0000 
          'id' => $filter_id)), 
          'dashboard' => '/gdc/md/'.$project_id.'/obj/'.$dash_obj, 
          'type' => 'export' 
         ))); 

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $bode); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    $output = curl_exec($ch); 

    // Export the Dashboard 

    $dash_tab = 'ae2b1ab3a87c'; 

    $start = strrpos($output, "\"uri\":\"")+7; 
    $finish = strrpos($output, "\"}"); 

    $url = "https://secure.gooddata.com/gdc/projects/".$project_id."/clientexport"; 

    $request_url = "https://secure.gooddata.com/dashboard.html#"; 
    $project = "project=/gdc/projects/".$project_id; 
    $dashboard = "&dashboard=/gdc/md/".$project_id."/obj/".$dash_obj; 
    $tab = "&tab=".$dash_tab."&export=1"; 
    $ctx = "&ctx=".substr($output, $start, ($finish-$start)); 

    $bode2 = json_encode(array('clientExport'=>array('url'=>$request_url.$project.$dashboard.$tab.$ctx, 'name'=>'{Dash_Name}'))); 

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $bode2); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    $output = curl_exec($ch); 

    // Poll the URL from response Result: 

    $start = strrpos($output, "\"poll\":\"")+8; 
    $finish = strrpos($output, "\"}"); 
    $poll = "https://secure.gooddata.com".substr($output, $start, ($finish-$start)); 

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_HTTPGET, 1); 
    curl_setopt($ch, CURLOPT_URL, $poll); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 

    $output = curl_exec($ch); 

    echo "Link: ".$poll; 
    echo "<br>Output: ".$output; 

    // Wait 90 seconds and then make the download, otherwise it returns 202 http code 

    sleep(90); 

    $opts = array('http' => 
     array(
     'method' => 'GET', 
     'header' => "Accept: application/json\r\n". 
      "Content-Type: application/json; charset=utf-8\r\n". 
      'Cookie: $Version=0; GDCAuthTT='.$GDCAuthTT.' $Path=/gdc/account'."\r\n", 
     'timeout' => 6000 
    ) 
    ); 

    $context = stream_context_create($opts); 
    $file = file_get_contents($poll."?download=true", false, $context); 
    file_put_contents("Dashboard.pdf", $file); 

    echo "<br><br>Link used: ".$poll."?download=true"; 

    $errors= error_get_last(); 
    echo "<br><br>".$errors['type']; 
    echo "<br>".$errors['message']; 

    curl_close($ch); 
?> 
+0

Пожалуйста, не используйте хаки, такие как '$ AuthSST = подстрока ($ выход, strrpos ($ выход "GDCAuthSST =") + STRLEN ("GDCAuthSST ="), 17);' мы можем изменить длина файла cookie GDCAuthSST в любое время (фактически мы собираемся сделать это в ближайшее время). Либо обрабатывайте файлы cookie должным образом, либо используйте аутентификацию на основе заголовка (например, используйте уровень проверки 2). Подробнее см. [Http://developer.gooddata.com/api#/reference/authentication](API doc). –

+0

Ничего себе, спасибо! Я собираюсь сделать это ^^ –

ответ

1

Вы можете определить значения фильтра, используя constraint объект в определении фильтра. Точный формат ограничения зависит от типа фильтра. Если фильтр тип list формат ограничение:

"constraint": { 
    "type": "list", 
    "elements": [ 
     "/gdc/md/{project_id}/obj/{attribute_id}?id={element_id}", 
     ... 
    ] 
} 

если это фильтр даты ограничение выглядит следующим образом:

"constraint": { 
    "from": "2006-07-01", 
    "to": "2008-03-31", 
    "type": "interval" 
} 

или

"constraint": { 
    "from": -5, 
    "to": 0, 
    "type": "floating" 
} 

Пример всей executionContext объект для POST с одним list фильтр с 2 выбранными значениями:

{ 
    "executionContext": { 
    "filters": [ 
     { 
     "uri": "/gdc/md/{project_id}/obj/{attribute_id}", 
     "constraint": { 
      "type": "list", 
      "elements": [ 
      "/gdc/md/{project_id}/obj/{displayForm_id}/elements?id={element_id_1}", 
      "/gdc/md/{project_id}/obj/{displayForm_id}/elements?id={element_id_2}" 
      ] 
     }, 
     "id": "{filter_id}" 
     } 
    ], 
    "dashboard": "/gdc/md/{project_id}/obj/{dashboard_id}", 
    "type": "export" 
    } 
} 

Вы можете увидеть действительный пример ограничения фильтра, например. в документах для handling drills или creating of saved view.

+0

Спасибо !!! Он работал правильно !!! –

+0

@ Álvaro ok - поэтому, пожалуйста, отметьте ответ как правильный, чтобы другие знали – akloboucnik