VISÃO GERAL
O jeito mais simples de se fazer, mas o menos eficiente/menos real-time. Cria-se uma tela que periodicamente fica consultando o servidor por novos eventos (AJAX) e atualizando seus próprios dados. O servidor provavelmente envia o ID/timestamp do evento mais recente em todas as respostas, e o poll é feito passando esse ID, que serve como um filtro (me mande apenas eventos mais novos que esse aqui). A arquitetura fica algo assim:
HTML
<table id="tabela">
<tbody><tr class="tableModel noshow">
...
</tbody>
</table>
JS
async function pollForNewData(lastID) {
//DEFINIÇÕES GERAIS
const table = $('#tabela');
const data = {endpoint: 'endpoint/poll/'+lastID}
const pollInterval = 5000;
if (table.count === 0) return;
//FAZ REQUEST E PARSE DO OBJETO QUE RETORNAR DO BACKEND
const html = await SNFWHelpers.ajaxRequest({dontshowloading: true}, data);
const obj = DataHandler.parseObj(html);
//EXTRAI OS DADOS NECESSÁRIOS DA RESPOSTA
const newLastID = obj.lastID;
const receivedRows = obj.msg;
//ATUALIZA A TABELA COM OS NOVOS DADOS E REAGENDA O POLL
addNewRowsFromPoll(table, receivedRows);
window.setTimeout(() => pollForNewData(newLastID), pollInterval);
}
function addNewRowsFromPoll(table, rows) {
let rowsToAdd = [];
$.each(rows, function(_k,rowData) {
newTr = Table.addNewLineFromModel(null, table, true);
Table.fillTableRow(newTr, rowData);
newTr.removeClass('dirty');
rowsToAdd.push(newTr);
});
table.prepend(rowsToAdd);
}
pollForNewData(0);
PHP
public function handlePoll(ServerRequestInterface $request, array $params) : ResponseInterface {
$lastID = $params['lastID'];
$arrFilters = new FilteringQueryArray();
$arrFilters->addFilter('lastID', '>', $lastID);
$data = $this->buscarDados($arrFilters);
end($data);
$lastID = $data['id'];
$response = ['msg' => $data, 'lastID' => $lastID];
return DataFlusher::flush($request, DataFlusher::HTTP_OK, $response);
}
PRÓS
- simples de implementar
- funciona em qualquer browser
CONTRAS
- não é em tempo real
- o poll pode pode ser "custoso" (a query pode ser pesada)
- se o usuário tiver várias abas abertas, um único operador vai fazer "n" polls