Home / Community / Blog

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 ...

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28