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
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_idFROM
{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,
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 :)