Ajuda para forçar UTC numa view

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
PedroMiguel's picture

Olá a todos,

Para não variar muito ando aqui de volta de projectos não muito convencionais e preciso da vossa ajuda.

Tenho uma view que faz agregação (SUM) de um campo especifico e a mesma é filtrada por um determinado periodo fornecido por um "field date" (na realidade é uma propriety, a last updated).

Tudo isto para no final gerar um ranking mensal dos utilizadores.

Se isto fosse apenas num "locale" era simples, para complicar este projecto está a ser feito para varios dominios, cada um com a sua timezone.

Decidi que o a hora oficial do ranking seria UTC, desta forma é sempre a mesma hora em qualquer parte do mundo.

Ando aqui meio perdido para encontrar forma de fazer isso na view, provavelmente é algo que se faz bem com um hook_search_api_views_query_alter, no entanto confesso que não consigo fazer um reset ao cerebro e chegar lá... (montes de coisas ainda para fazer e uns "50" custom modules abertos à frente).

Se alguém me puder dar uma "luz" agradeço.

Comments

Esqueci-me de deixar a query

PedroMiguel's picture

Esqueci-me de deixar a query que está a ser criada:

SELECT users_eck_bet.name AS users_eck_bet_name, users_eck_bet.uid AS users_eck_bet_uid, eck_bet.uid AS eck_bet_uid, COUNT(DISTINCT eck_bet.uid) AS eck_bet_uid_1, SUM(eck_bet.points) AS eck_bet_points, COUNT(eck_bet.id) AS id, SUM(eck_bet.wins) AS eck_bet_wins, COUNT(eck_bet.id) AS eck_bet_id
FROM
{eck_bet} eck_bet
LEFT JOIN {users} users_eck_bet ON eck_bet.uid = users_eck_bet.uid
WHERE (( (eck_bet.type IN  ('bet')) AND (DATE_FORMAT(ADDTIME(FROM_UNIXTIME(eck_bet.created), SEC_TO_TIME(3600)), '%Y-%m') = '2014-05') AND (eck_bet.status = '2') ))
GROUP BY users_eck_bet_name, users_eck_bet_uid, eck_bet_uid
ORDER BY eck_bet_wins DESC, eck_bet_id DESC
LIMIT 100 OFFSET 0

Obviamente e para não variar,

PedroMiguel's picture

Obviamente e para não variar, depois de reler o que escrevi fez-se luz...

Bem então fica aqui a solução:

Bastou criar isto num modulo:

function XPTO_views_query_alter(&$view, &$query) {

if ($view->name == 'NOME_DA_VIEW') {
$query->where[1]['conditions'][1]['field'] = preg_replace("#SEC_TO_TIME([0-9]+#", "SEC_TO_TIME(0", $query->where[1]['conditions'][1]['field']);
}

}

Assim ele "matcha" qualquer algarismo dentro daquela funcao e muda-o para zero (UTC é como a data é gravada na DB).

Problema resolvido :)