PDA

Zobacz pełną wersję : Dodatkowe artykuły sciągane z XML.



staty
08-08-2012, 16:30
Chciałbym pobierac do artykułów w Joomli, artykuły z Bloga, za pomocą XML.

Probowałem juz to robic, przerabiajac plik components\com_content\models\category.php oraz funkcję getItems() gdzie na koncu jest zwracana tablica artykułów.
Pobieranie jest za pomoca dodatkowej funkcji, ktora zwraca tablice z artykułami z bloga. Problem jest kiedy lacze te dwie tablice i probuje zwrócic w funkcji getItems() tablice koncowa..
Stąd moje pytanie.
Czy może nie byłoby łatwiej to zrobic poprzez plugin, jesli tak to jak się za to zabrac.. Bo moze zamiast ingerowac w instniejacy kod moglbym jakos dopisac artykuły do tablicy toz przed wyswietleniem :>

Aha.. jeszcze jedna wazna sprawa, chce aby artykuły te były w jednej tablicy, zeby mozna bylo je posortowac (art z Joomli i z bloga) nie interesuje mnie rozwiązanie osadzenia np powyzej artykułow z Bloga.

Proszę o pomoc weteranow ktorzy na Joomla zęby pozjadali! :P

deviapps
13-08-2012, 11:15
Moim zdaniem najlepiej skopiować to, co najważniejsze z com_content do nowego komponentu i wtedy dodać nową tabelę z arykułami z bloga (odnośnikami) oraz zmodyfikować zapytanie, żeby robiło np UNION z nową tabelą.
Nowa tabela najlepiej jakby była zasilana (synchronizowana) cyklicznie, żeby odciążyć w request ściąganie xml z zewnętrznego serwisu.
Wtedy na bazie możesz sobie sortować i filtrować wg potrzeb.

staty
13-08-2012, 12:22
Moim zdaniem najlepiej skopiować to, co najważniejsze z com_content do nowego komponentu i wtedy dodać nową tabelę z arykułami z bloga (odnośnikami) oraz zmodyfikować zapytanie, żeby robiło np UNION z nową tabelą.
Nowa tabela najlepiej jakby była zasilana (synchronizowana) cyklicznie, żeby odciążyć w request ściąganie xml z zewnętrznego serwisu.
Wtedy na bazie możesz sobie sortować i filtrować wg potrzeb.

Więc tak, dodaje i wyswietla dane z xml.. aleeee, jest problem z paginacja, poniewaz w nowej joomli paginacja jest tak rozwiazana ze pobiera wiersze przy kazdym przeladowaniu, z pliku modellist z bibliotek, wiec nie bardzo sie da operowac na tym..
Przykladowo, pierwsza strona ladnie dodaje i sortuje wg daty, ale wejde strona 2..3..4 itd to zawsze dodaje na gore te z xml i sortuje.. Czyli do zapytania zawsze jest dodawany dodatkowo rezultat z xml.

deviapps
13-08-2012, 13:13
No to przerób jeszcze getListQuery() tak, aby START i LIMIT było po połączeniu tabel, czyli w wynikowym:
Select * FROM (Select * from #__content WHERE $where UNION Select * from #__content_xml WHERE $where) ORDER BY $order_col START $start LIMIT $limit;
zapytanie może nie jest optymalne, ale da efekt i na pewno coś wymyślisz przyśpieszającego z czasem. Może za pomocą full outer joina coś (w oracle używa się przy tym NVL - nie wiem jak w mysql).

Pozostaje jeszcze możliwość kopiowania treści z #__content do #__content_xml - będzie szybciej, ale duplikuje zawartość bazy

lub umieszczenia w #__content odnośników do bloga i specjalne obsłużenie tych specjalnych przy wyświetlaniu linków - trzeba uważać, żeby te treści nie pokazały się w oryginalnym komponencie lub w modułach w innych częściach witryny.

staty
13-08-2012, 15:39
No więc tak, problem rozwiązany.
Nie trzeba było ingerować w kod joomli, wystarczyły zmiany w componencie content :)
Dla zainteresowanych plik models/category.php

1. Ustalenie wartosci na sztywno:

$model->setState('list.start', 0);
$model->setState('list.limit', 999999);

2. Pobranie tablicy artykułów Bloga z XML do tablicy.
3. Policzenie wartości artykułów z Joomli oraz z tablicy Bloga. (
count())
4. Następnie ustalenie tej wartosci:
$model->setState('list.limit',$count);
5. Przypisanie paginacji na sztywno:
$this->_pagination = new JPagination($count,$this->getState('list.start'),5);
gdzie: $count jest wartoscia wsztskich art., getState.. jest wartoscia aktualnej strony paginacji, a 5 jest iloscia artykułów.
6. Polaczenie
array_merge'm tablicy Joomli i Bloga, przesortowanie jej wg daty dzieki
usort()
7. No i faza koncowa to zwrocenie potrzebnych nam wartosci w nowej tablicy. Przykladowo jestesmy na stronie 5 paginacji, mamy za soba 25 artykulow bo tyle wyswietla nam poszczegolna paginacja, wiec pobieramy wszystkie wartosci 25> :)) moze i niezbyt eleganckie ale działa prawidłowo.

$i=0;

$Final = array();
$j=0;
for ($i=$this->getState('list.start'); $i<$count; $i++) {
$Final[$j] = $FullList[$i];
$j++;

}

No i oczywiscie zwrocenie tablicy $Final.
Poza tym trzeba pozniej sie pobawic w stylach zeby dobrze wyswietlalo, miec funkcje pobierajaca wartosci z xml i wrzucajaca do tablicy.
Najwazniejsza rzecza jest przypisanie [params] dla kazdego artykulu, poniewaz Joomla dopina je automatycznie, wiec w artykul z XML tez musimy!

Mam nadzieję ze poradnik się komus przyda, gdyby ktos byl zainteresowany bezposrednio plikiem prosze o info.

Craft
14-08-2012, 15:51
Fajnie, że działa ale lepszym rozwiązaniem byłoby napisanie pluginu lub komponentu. Teraz musisz pamiętać aby sprawdzić czy kolejne aktualizacje nie nadpiszą Ci tych plików.

staty
14-08-2012, 20:00
Fajnie, że działa ale lepszym rozwiązaniem byłoby napisanie pluginu lub komponentu. Teraz musisz pamiętać aby sprawdzić czy kolejne aktualizacje nie nadpiszą Ci tych plików.

Nie nadpisza :) bo com_component mozna skopiowac, zrobic z tego nowa instalke np pod nazwa com_component_other i wtedy przypisac to w menu pod com_component_other :)) to jest bardzo mala zmiana w pliku, wiec wszystko powinno dzialac nawet przy nowej wersji, ew moze sie zmienic nazwa getow/setow lub klasy paginacji :))

Takze mozna to potraktowac jako nowy komponent :) jesli chodzi o plugin to chyba by to nie zdalo egzaminu, zdecydowanie musiałby to byc komponent.