Zapobieganie jednoczesnemu wyświetlaniu tekstu

0

Mam abstrakcyjną klasę Module z metodą showModule() oraz klasy dziedziczące:

  • CategoryModule - wyświetla dwie tabele, korzystając z danych pobranych z bazy MySQL
  • InfoModule - wyświetla krótką informację, później ma zostać rozbudowana

Główna klasa programu tworzy tablicę obiektów rozszerzających Module i wykonuje na nich metodę:

$modules = getModules();
foreach ($modules as $module) {
	Utilities::log(get_class($module)); //wyświetla nazwę klasy w konsoli JavaScript; użyte tylko dla przykładu
	$module->showModule();
}

Konsola przeglądarki wyświetla mi poprawnie kolejność:

CategoryModule
InfoModule

Ale na stronie informacja z InfoModule umieszcza się nie na końcu, a pomiędzy dwoma tabelami z CategoryModule. Na pewno nie jest to wina CSSa. Z nieznanych mi przyczyn kolejna iteracja pętli foreach jest wykonywana, gdy metoda showModule() uruchomiona w poprzedniej iteracji jeszcze się nie zakończyła.

Może mnie ktoś oświecić, co robię źle?

0

Sprawdź czy gdzieś tam wcześniej nie masz foreacha z referencją (foreach ($cośtam as $k => &$v)) - to coś potrafi nieźle namieszać w kodzie.

0

Rozwiązanie zagadki masz w swoim komentarzu w kodzie.
Prawdopodobnie kolejność którą widzisz nie jest kolejnością renderowania strony.
Lepiej pobaw się w HTML-u lub na konsoli serwera.

0

Referencji żadnych wcześniej nie ma. Kolejność wyświetlania modułów jest dobra, są one uruchamiane również w odpowiedniej kolejności, tylko kolejne wyświetlenia są uruchamiane, gdy poprzednie jeszcze się nie zakończyły:

Ponieważ Utilities::log() wysyła dane do loga, po prostu wstawiając na stronę logujący skrypt JS:

public static function log($text) {
   echo "<script type='text/javascript'>console.log(\"$text\");</script>";
}

Poszukałem tagów <script> w wygenerowanym kodzie źródłowym. Były rozmieszczone bardzo dziko. Zapis:

console.log("InfoModule");

Znalazłem wewnątrz znacznika <table> generowanego przez CategoryModule.

Byłem już na tyle zdesperowany, że każde wystąpienie foreach zastąpiłem for, ale jasne było, że to nic nie da. Nadal nie rozumiem, dlaczego wykonuje się kilka iteracji na raz?

EDIT:
W akcie jeszcze głębszej desperacji po wywołaniu $module->showModule() dałem sleep(1). Nadal w pętli foreach oczywiście. Nic to nie zmieniło, poza czekaniem kilka sekund na odświeżenie strony.

1

PHP jest synchroniczny, więc nie ma takiej opcji, żeby coś zmieniło kolejność.

Pokaż wyprodukowany kod HTML (i nie wykręcaj się, tylko go pokaż, bo ostatnio prośby o więcej danych kończą się kolejnymi postami z wywodami, zamiast konkretów)

Bardzo możliwe, że to nie wina CSS, ale bardzo możliwe też, że to wina rozwalonego HTML, typu:

<table>
<tr>
<td>aaa</td>
costam
</tr>
</table>

demo: http://jsbin.com/qosedinoke/edit?html,output

0

Mnie też te wywody wkurzają :P
Straciłem dostęp do komputera; gdy tylko go odzyskam, podeślę, ale nie wiem nawet, kiedy to nastąpi.

0

Skrypt PHP nie jest wielowątkowy (zwykle), więc nie są potrzebne żadne sleep.
Raczej jest tak, że kod html do modułów wypluwasz nie od razu, a log masz bezpośredni - jakiś problem z aplikacyjnym lub phpowym buforem wyjściowym.

0

@dzek69 zbadałem dokładnie jeszcze raz wszystkie echo, choć wydawało mi się, że to nie w tym tkwi problem.
Oczywiście, że w tym tkwił problem.
Brak znaczników zamykających </tbody></table>.

Straszna głupota, a tak długo się z nią męczyłem. Aż wstyd.

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