W istniejącej instalacji ezPublish w wersji 4.0.3 miałem problem, o nie wyświetlała się chmura tag'ów (tag cloud). Wskazówka była w pliku var/log/error.log:
Error: error executing query: SELECT ezkeyword.keyword, count(*) as keyword_count
FROM ezkeyword,
ezkeyword_attribute_link,
ezcontentobject,
ezcontentobject_attribute,
ezcontentobject_tree
WHERE ezkeyword.id = ezkeyword_attribute_link.keyword_id
AND ezkeyword_attribute_link.objectattribute_id = ezcontentobject_attribute.id
AND ezcontentobject_attribute.contentobject_id = ezcontentobject_tree.contentobject_id
AND ezcontentobject_attribute.contentobject_id = ezcontentobject.id
AND ezcontentobject.status = 1
AND ezcontentobject_attribute.version = ezcontentobject.current_version
AND ezcontentobject_tree.main_node_id = ezcontentobject_tree.node_id
AND ezcontentobject_tree.path_string like '/1/2/%'
AND ezcontentobject_tree.node_id != 2
AND ezcontentobject_tree.is_invisible = 0
AND ezcontentobject.language_mask & 3 > 0
GROUP BY ezkeyword.id
ORDER BY ezkeyword.keyword ASC BŁĄD: kolumna "ezkeyword.keyword"
musi występować w klauzuli GROUP BY lub być użyta w funkcji agregującej
rozwiązanie jest oczywiste, mniej oczywista jest lokalizacja pliku w którym jest zdefiniowane to zapytanie. Przeszukałem pliki pod kątem frazy ezkeyword.keyword i znalazłem plik
extension/ezwebin/autoloads/eztagcloud.php
w którym zmieniłem GROUP BY'a w linii 120 na:
GROUP BY ezkeyword.id, ezkeyword.keyword
problem został rozwiazany, a efekty było widać nawet bez czyszczenia pamięci podręcznej.
Pojawiał się błąd:
BŁĄD: błąd składni w lub blisko "DESC" LINE 14: ... FROM_UNIXTIME( ezcontentobject_attribute.data_int ) ) DESC
Żeby to poprawić to najpierw trzeba dodać funkcje które udają (emulują) MySQL'a (źródło):
CREATE OR REPLACE FUNCTION MONTH(TIMESTAMP without TIME ZONE)
RETURNS INTEGER AS $$
SELECT EXTRACT(MONTH FROM $1)::INTEGER;
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION MONTH(TIMESTAMP WITH TIME ZONE)
RETURNS INTEGER
AS $$
SELECT EXTRACT(MONTH FROM $1)::INTEGER;
$$ LANGUAGE SQL STABLE;
CREATE OR REPLACE FUNCTION MONTH(DATE) RETURNS INTEGER
AS $$
SELECT EXTRACT(MONTH FROM $1)::INTEGER;
$$ LANGUAGE SQL IMMUTABLE;
dodatkowo jeszcze:
CREATE OR REPLACE FUNCTION YEAR(TIMESTAMP without TIME ZONE)
RETURNS INTEGER AS $$
SELECT EXTRACT(YEAR FROM $1)::INTEGER;
$$ LANGUAGE SQL IMMUTABLE;
oraz konwersji czasu (źródło):
CREATE OR REPLACE FUNCTION from_unixtime(integer) RETURNS timestamp AS ' SELECT $1::abstime::timestamp without time zone AS result ' LANGUAGE 'SQL'; CREATE OR REPLACE FUNCTION unix_timestamp() RETURNS integer AS ' SELECT ROUND(EXTRACT( EPOCH FROM abstime(now()) ))::int4 AS result; ' LANGUAGE 'SQL'; CREATE OR REPLACE FUNCTION unix_timestamp(timestamp with time zone) RETURNS integer AS ' SELECT ROUND(EXTRACT( EPOCH FROM ABSTIME($1) ))::int4 AS result; ' LANGUAGE 'SQL';
i na podstawie powyższych:
CREATE OR REPLACE FUNCTION unix_timestamp(text) RETURNS integer AS ' SELECT ROUND(EXTRACT( EPOCH FROM ABSTIME($1) ))::int4 AS result; ' LANGUAGE 'SQL';
i na koniec:
CREATE OR REPLACE FUNCTION "concat"(int, text, int, text, int) RETURNS text AS ' SELECT $1 || $2 || $3 || $4 || $5; ' LANGUAGE 'sql';
specjalnie dla zapytania w pliku extension/ezwebin/autoloads/ezarchive.php które też trzeba poprawić. W zapytaniu SQL w linii 54 jest błąd: GROUP BY nie służy do sortowania a poza tym skoro pola są zdefiniowane i nazwane to wystarczy użyć tej nazwy. Ja zmieniłem końcówkę na taką:
GROUP BY year, month ORDER BY year DESC, month DESC
niestety na tym nie koniec. Pojawiają się kolejne błędy, ale o tym w następnym odcinku ...
Add comment