Oj działo się dzisiaj, działo…
Zawziętość ma nie zna jednak granic. Zażyczyłem sobie bowiem mieć w swym panelu zarządzania TinyMCE taki edytor do dodawania wiadomości, aby przyszłym autorom na panteonie łatwiej pisanie przychodziło. Cóż począć miałem, skoro we wszelakich mych przeglądarkach (poza I.E. w wersji 6.0, odpalanej rzecz jasna w Debianie – więc tej nie liczę) poza Firefox’em (właściwie to Iceweasel) cudo to działało, a w tej jednej nie chciało… Przeszukałem cały światowy internet (Google.com – rządzi) i… natknąłem się na podobne historie nawet u nas. Ktoś się komuś żalił, że mu działało i przestało jak coś gdzieś doinstalował. Gówno prawda. Trzeba było nie okłamywać (tak jak ja to zrobiłem) z identyfikacją przeglądarki about:config, to by działało nadal! Zachciało się ściągać z MegaUpload przez Firefox’a, to teraz są skutki. Jako, że w Managera już nie grywam (z braku czasu), więc i dodatków do niego nie pobieram, zatem usunąłem ów feralny wpis identyfikujący mnie jako użytkownika MS Windows z przeglądarką I.E. 6.0 (właściwie przez chwile miałem nawet… 7.1, a co heh) i powróciłem do pierwotnej nazwy. TinyMCE ruszyło z kopyta. A podejrzewałem już, że gryzie się z prototype.js, ale nie… to tylko moja głupota wzięła chwilowo górę.
Przebrnąłem przez panel dodawania wiadomości, z bezproblemowym dodawaniem zdjęcia (już przesłanego na serwer), ale… zachciało mi się wgrywać je z poziomu strony (oczywiście bez jej zbędnego przeładowywania) i tu pojawił się problem…
Jako tako, AJAX nie zezwala na zapisywanie plików na serwerze (i całe szczęście!), przesyłając je przez tradycyjny formularz i zapisując przez PHP nie ma większych problemów, jednak strona musiałaby się w takim wypadku przeładować, a tego nie chciałem (co by było gdyby jakiś autor napisał niemal powieść sensacyjną, a przypomniał sobie, że chce umieścić zdjęcie… jeden klik i cały napisany materiał poleciałby w pizdu).
Zacząłem znowu grzebać i grzebać w sieci i okrężną drogą trafiłem na taką stronę. Jest tam opisany ciekawy sposób (podobne rozwiązanie wykorzystuje Google w GMail), zamierzam to przetestować i ewentualnie dostosować do moich potrzeb, w ostateczności wiedząc już co i jak napiszę od podstaw swoje rozwiązanie (ale wolałbym tego uniknąć).
Koniec końców dodawać wiadomości już można (to znaczy na moim lokalnym komputerze, jak będzie na wykupionym serwerze pojęcia nie mam), faktem jednak jest, że zintegrowałem TinyMCE z AJAXem, a tego z PHP i jakoś to się ciągnie. Na pytanie czy chciałbym korzystać z jakiegoś Frameworka, odpowiadam – już korzystam – z prototype, całą resztę wolę pisać sam, ewentualnie podglądać rozwiązania u innych, ale dzięki takiemu podejściu szybciej pojąłem całą zabawę
PHP->AJAX->Strona w przeglądarce->AJAX->PHP->Wciąż ta sama strona, ale z inną zawartością.
Nie musi mi wszystko pływać, fruwać czy podskakiwać (kojarzy mi się to z dawną modą na osadzanie bez ładu i składu animowanych gifów, które występowały w większej ilości niż treść na stronie, czy późniejszymi wstawkami w Javie (padający deszcz, śnieg i inne duperele), czy w końcu dużo późniejsze animacje Flashowe), za takie ekstra dodatki to ja serdecznie podziękuję. Zdecydowanie bardziej wolę skromnie, acz wygodnie…
I tym miłym akcentem zakończę kolejny wpis i powrócę do ciężkiej pracy…
P. S.
Okazało się bowiem, że miałem już własne rozwiązanie, ale zamiast pliku przesyłane były informacje skąd i co pobrać, wystarczyło to coś (wskazanie lokalizacji pliku na domowym komputerze) skopiować na serwer i dopiero później obrabiać jako plik… Tymczasem ja starałem się usilnie od razu traktować informacje przesłane przez AJAXa jako plik (tak jak ma to miejsce podczas normalnego przesyłania pliku z poziomu PHP) i była to swoista walka z wiatrakami, teraz wystarczy już jedynie dopracować skrypt umieszczający zdjęcie na serwerze, napisać jeszcze jedną funkcję w AJAXie, albo po prostu wykorzystać AJAX.UPDATER, a to rozwiązanie ze strony, które podawałem wyżej można potraktować jako ciekawostkę, gdyż u mnie nie zadziałało… Dlaczego? Właśnie tutaj przekazywana była jedynie nazwa pliku zamiast jego fizyczności czy nawet wskazania, albo może to ja nie wiedziałem co z tymi danymi dalej zrobić… Jednak jak już pisałem, wolę zdecydowanie proste – choć skuteczne – metody (rozwiązania)…
P.S.2
Jednak to ja dałem wczoraj dupy…
Okazało się bowiem, że moje rozwiązanie kopiowało plik z jednego katalogu na drugi, a nie przesyłało (późna pora dnia…), rozwiązanie proponowane na powyższej stronie działa z powodzeniem, jednak… i ono nie przesyłało pliku, a jedynie przekazywało tablicę $_POST. Można temu zaradzić, wystarczy w opcjach formularza dodać magiczny wpis enctype=”multipart/form-data”, w efekcie formularz przyjmie postać:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <form action="index.php" method="post" enctype="multipart/form-data" onsubmit="return AIM.submit(this, {'onStart' : startCallback, 'onComplete' : completeCallback})"> <div><input type="text" name="form[name]" /></div> <div> <input type="file" name="form[file]" /></div> <div><input type="submit" value="SUBMIT" /></div> </form> <div># of submited forms: <span id="nr">0</span></div> <div>last submit response (generated by form action - index.php file): <span id="r"></span> </div> <!-- w oryginale zamiast span id="r" było pre ale to cudo od kolorowania składni nie chciało mi przepuścić zamykającego tagu... --> |
A plik z formularza odbieramy przez
1 2 3 | $nazwa_pliku = $_FILES['form']['name']['file']; $typ_pliku = $_FILES['form']['type']['file']; $rozmiar_pliku = $_FILES['form']['size']['file']; |
Mam nadzieję, że wszystko jasne… Powyższy kod znakomicie nadaje się do stosowania w połączeniu PHP z AJAXem i działa tak jak na GMail.


