AJAX - String - porada

0

Cześć

Piszę tutaj tylko, żeby się poradzić. Napisałem coś ala tablica fejsbukowa. Funkcja zwraca dane o wpisach i innych działalnościach, przekazuje ją do templejtki i ona w pętli ją tam mieli i wyświetla.

Postanowiłem jednak dorobić do tego AJAXa (pokaż starsze wpisy). Odpalam za pomocą niego wspomnianą funkcję i dane miele w javascripcie tworząc odpowiedniego, długaśnego stringa w którym tworzę divy, obrazki i teksty i dodaje na koniec diva głównego. I tu mam pytanie, bo kod tworzący stringa z htmlem i tu i tu jest bardzo podobny, a dodatkowo jeśli coś będę chciał zmienić w wyglądzie tej tablicy to będę to musiał robić w dwóch miejscach, co nie jest wygodne (i zgodne z zasadami KISS i DRY). Może lepiej zrobić tak, żeby wspomniana funkcja nie zwracała tablicy PHPowej tylko już przygotowanego stringa? Mam tylko wątpliwości, czy to zgodne z zasadami dobrego programowania.

0

Ja bym spokojnie zrobił stringa z kodem, skoro masz system templatek to raczej nie warto się powtarzać i robić jakieś parsery. Potrzebujesz po coś mieć to w JSON/cokolwiek? Raczej nie. Nie wiem na ile dłuższy jest kod HTML, ale jak nie robi Ci różnicy więcej danych do przesłania to raczej zrób zwrotkę w html i tyle.

0

Nie wiem, czy dobrze wszystko zrozumiałem -- opis sugeruje, że Ajax wywołuje "funkcję PHP-ową" (a przecież w rzeczywistości może "wywołać" co najwyżej jakiś URL, tj. po prostu wysłać żądanie), która zwraca "tablicę PHP-ową" (a w rzeczywistości musi zwrócić jakiś tekst: zserializowaną tablicę, np. w JSON-ie, HTML-u czy innym formacie).

W każdym razie, słusznie zauważyłeś problem! Generowanie HTML-a i po stronie serwera, i po stronie klienta, to naruszenie DRY!

Poniżej jedno z możliwych rozwiązań.

Funkcja zwracająca tablicę PHP-ową zostaje jak jest, zgodnie z ogólnie rozumianą zasadą SRP. Zadaniem funkcji jest wygenerowanie danych -- i nic więcej!

Templatka w PHP przerabia dane na kod HTML.

Jakaś usługa, tj. skrypt PHP -- może to być kontroler lub funkcja istniejącego kontrolera -- przetwarza i odpowiada na żądania Ajaxowe. JavaScript puszcza Ajax do tej usługi zawsze gdy chce zmienić czy odczytać tablicę. Usługa ta robi swoje, tj. ewentualnie modyfikuje tablicę (jeśli Ajax tego żąda), po czym odpala funkcję PHP-ową i przekazuje ją do templatki. Ostatecznie, wywołuje więc i zwraca templatkę z nowym kodem HTML tablicy. Skrypty dostają ten kod i aktualizują tablicę.

Na tę chwilę zachowanie DRY, prostoty i innych zasad jakości oprogramowania jest dla Ciebie ważniejsze. Jak będziesz zawalony użytkownikami i będziesz miał problemy z wydajnością konkretnie w tym module, to wtedy można pomyśleć o zmianie sposobu działania modułu.

Np. taką średnio trudną zmianą, którą być może chciałbyś wprowadzić (może nawet teraz -- dla ćwiczenia) byłoby dodanie większej ilości logiki po stronie klienta, dzięki czemu serwer nie musiałby generować całej tablicy (co może być kosztowne!) w odpowiedzi na każde żądanie ajaxowe. Można by zrobić to tak, że gdyby ktoś kliknął na "Usuń wpis" i usunął swój wpis, JavaScript słałby ajaxem żądanie, a serwer odpowiadał zwykłym statusem "usunięcie powiodło się/wystąpił błąd". Jeśli status byłby OK, JavaScript usuwałby elementy DOM z usuniętym wpisem z drzewa dokumentu. Z drugiej strony, gdy ktoś dodawałby wpis, serwer odpowiadałby tylko HTML-em nowo dodanego wpisu i JavaScript wstawiałby go w jedno miejsce.

Nie wiem dokładnie jak działa tablica facebookowa, nie korzystam z tego portalu: jeśli tablica zawiera też wpisy innych osób i chcemy je aktualizować również po dodaniu czy usunięciu naszego wpisu, to sprawa się komplikuje i opisaną wyżej optymalizację ciężej zastosować.

0

W końcu metodę tworzącą tablicę pozostawiłem bez zmian, stworzyłem natomiast drugą, która na wejściu dostaje ową tablicę i wypluwa stringa, to chyba najlepsze wyjście z sytuacji.

Dzięki za sugestie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1