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