PDA

Zobacz pełną wersję : ukryj moduł, jeśli pusty



bigos
16-08-2007, 15:47
Witam wszystkich, jako że to mój pierwszy post.
Szukałem i szukałem, a odpowiedzi nie znalazłem, więc pozwoliłem sobie opisać mój problem:

Z tego co mi wiadomo, joomla pozwala jedynie na publikowanie / ukrywanie modułów na konkretnych podstronach. Ja chciałbym wyświetlać je warunkowo, np. jeżeli dla danego artykułu nie ma żadnych tematów pokrewnych, to niech się ten moduł nie wyświetla... Jak to zrobić?

Rada, gotowy hack - wszystko mile widziane...

-----------------------------------------------------

Póki co rozwiązałem to po stronie klienta przy pomocy jQuery:

1) Drobna modyfikacja pliku includes/frontend.html.php
w funkcji: modoutput_xhtml
zamiast: <div class="moduletable<?php echo $moduleclass_sfx; ?>">
zrobiłem: <div id="<?php echo $module->module; ?>" class="moduletable<?php echo $moduleclass_sfx; ?>">

- dzięki temu mogę zidentyfikować każdy moduł, a później w js sprawdzić jego zawartość i ewentualnie ukryć.
2) Kod jquery wykonywany po załadowaniu dokumentu:
if (!$("#mod_related_items > ul").length) $("#mod_related_items").hide();

Działa tylko dla modułu mod_related_items, dla każdego innego trzeba by dodać odpowiednią linijkę...

Jeżeli ktoś wymyśli coś lepszego, niech się podzieli.

zwiastun
16-08-2007, 17:08
Bo tak zawzięcie szukałeś!:)
Umieszczanie modułów (http://www.pomoc.joomla.pl/content/view/559/46/)
Ukrywanie kolumn (http://www.pomoc.joomla.pl/content/view/560/46/)
Ukrywanie modułów (http://www.pomoc.joomla.pl/content/view/561/46/)
Ukrywanie modułów (http://www.pomoc.joomla.pl/content/view/623/30/)
Forum to nie podręcznik to nie jedyne i nie podstawowe miejsce, które trzeba przeszukać.
Wszystkie cztery tytuły łatwe do odszukania na Pomocy

=> Szablony => podręcznik => lista tytułów
=> Programowanie => Zaawansowane projektowanie szablonów => Lista tytułów

Masz pomysł, ja to można zrobić prościej? Bo ja już nie mam!
Podane przez Ciebie rozwiązanie nadaje się tylko do tego modułu - choć można by szukać rozwiązania w poprawie kodu modułu

bigos
17-08-2007, 00:24
Tak, szukałem zanim zadałem pytanie na forum.
Forum traktuję jako miejsce, gdzie można się wymienić hackami, sposobami na rozwiązanie czegoś co nie jest rozwiązane przez system... A to nie jest rozwiązane przez system.

Jeśli przeczytasz proponowane przez Ciebie materiały, to też będziesz wiedział że domyślne ukrywanie modułów w joomli polega jedynie na wykorzystaniu funkcji mosCountModules(), która sprawdza czy w podanym obszarze są jakieś moduły. Nie ma możliwości sprawdzenia, czy dany moduł nie wyświetli żadnej treści.


Tak, proponowany przeze mnie sposób zadziała tylko dla podanego modułu, ale nie ma problemu, żeby zastosować go dla każdego innego - wystarczy lekka modyfikacja...

Aha, gdyby ktoś chciał mój sposób wykorzystać, to go poprawiłem:

1) w pliku .css wyłączamy widoczność danego modułu, np:
#mod_related_items{ display:none; }
2) kod jQuery włącza widoczność gdy moduł jest niepusty (odwrotnie niż w pierwszej wersji sztuczki):
if ($("#mod_related_items > ul").length) $("#mod_related_items").show();

Dzięki temu nie ma efektu pojawienia się na chwilę pustego modułu i jego zniknięcia, gdy już załaduje się cała strona.

zwiastun
17-08-2007, 01:15
:)
Gdy skończyłem (a właściwie kończyłem, to pojąłem do końca, o co Ci chodzi. Potem szkoda było wpisu - zawiera przydatne odnośniki! Powinienem pewno jeszcze dopisać dla jasności jakieś zdanie, co czynię właśnie.

SmOp
18-03-2008, 00:25
... a masz może jakiś pomysł, żeby tematy pokrewne wyświetlały się od najnowszego do najstarszego?

bigos
18-03-2008, 00:40
Hej,
No, niestety trzeba hackować moduł - autorzy systemu tego nie przewidzieli.

plik: modules/mod_related_items.php

w linijce #46 zaczyna się zapytanie do bazy danych:

$query = "SELECT a.id, a.title, a.sectionid, a.catid, cc.access AS cat_access, s.access AS sec_access, cc.published AS cat_state, s.published AS sec_state"
. "\n FROM #__content AS a"
. "\n LEFT JOIN #__content_frontpage AS f ON f.content_id = a.id"
. "\n LEFT JOIN #__categories AS cc ON cc.id = a.catid"
. "\n LEFT JOIN #__sections AS s ON s.id = a.sectionid"
. "\n WHERE a.id != " . (int) $id
. "\n AND a.state = 1"
. "\n AND a.access <= " . (int) $my->gid
. "\n AND ( a.metakey LIKE '%" . implode( "%' OR a.metakey LIKE '%", $likes ) ."%' )"
. "\n AND ( a.publish_up = " . $database->Quote( $nullDate ) . " OR a.publish_up <= " . $database->Quote( $now ) . " )"
. "\n AND ( a.publish_down = " . $database->Quote( $nullDate ) . " OR a.publish_down >= " . $database->Quote( $now ) . " )"
;

trzeba je leciutko zmienić - jeżeli chcesz sortować po dacie modyfikacji:

$query = "SELECT a.id, a.title, a.sectionid, a.catid, cc.access AS cat_access, s.access AS sec_access, cc.published AS cat_state, s.published AS sec_state, a.modified"
. "\n FROM #__content AS a"
. "\n LEFT JOIN #__content_frontpage AS f ON f.content_id = a.id"
. "\n LEFT JOIN #__categories AS cc ON cc.id = a.catid"
. "\n LEFT JOIN #__sections AS s ON s.id = a.sectionid"
. "\n WHERE a.id != " . (int) $id
. "\n AND a.state = 1"
. "\n AND a.access <= " . (int) $my->gid
. "\n AND ( a.metakey LIKE '%" . implode( "%' OR a.metakey LIKE '%", $likes ) ."%' )"
. "\n AND ( a.publish_up = " . $database->Quote( $nullDate ) . " OR a.publish_up <= " . $database->Quote( $now ) . " )"
. "\n AND ( a.publish_down = " . $database->Quote( $nullDate ) . " OR a.publish_down >= " . $database->Quote( $now ) . " )"
. "\n ORDER BY a.modified DESC; "
;

Dopisałem tylko dwie rzeczy - a.modified w pierwszej linijce i na końcu wiersz z ORDER BY. Nie mam czasu testować, ale powinno działać. W razie czego odezwij się na priva, albo w tym temacie.

SmOp
18-03-2008, 01:36
Zero połajanek dla szóstoklasistów - same konkrety. To lubię. Tym bardziej, że działa.
A może dałoby się z sortowaniem po dacie publikacji?