PDA

Zobacz pełną wersję : Jak zmienić deklarację skryptu w mootools



Kris-n
10-01-2010, 00:23
Cześć
Postawiłem Joomla 1.5.15 stable, zainstalowana bez błędów, templatka: przerobiona ja_purity, działa poprawnie, PHP 5.2.11

Próbuję rozwiązać problem z phoca Gallery w IE (wykonanie skryptu przed załadowaniem wszystkich elementów).

Muszę dodać definicję defer=&quot;defer&quot;do deklaracji <script type=&quot;text/javascript&quot; > dla tego modułu.
Z tego co widzę w źródle - moduł jest ładowany przez mootools, ale nie wiem, gdzie mam szukać tej deklaracji, żeby dodać zmiany.

Jola
10-01-2010, 01:17
Witam,
mogę podać miejsce (niestety nie w komponencie phocaGallery ), gdzie możesz próbować to zmienić, ale wymaga to znajomości PHP (dodanie kodu warunkowego i pobranie parametrów).

Kris-n
10-01-2010, 01:23
Dzięki - dawaj - będę próbował :)

Jola
10-01-2010, 01:29
Plik libraries/joomla/document/html/renderer/head.php funkcja fetchHead()
Ten plik jest dosyć "istotny" dla działania Joomla, więc zrób kopię przed zmianami.
Podana funkcja "montuje" elementy należące do sekcji head, więc musisz dodać Twoją modyfikację tylko dla wybranego pliku (mootools) i dla wybranej sytuacji ładowania się strony (komponent phocagallery).

Kris-n
19-01-2010, 23:19
Jak na razie - wiele prób i marne efekty. Podpowiedzcie mi, jak rozpoznać komponent, który jest ładowany?

Jola
19-01-2010, 23:24
Przy wyłączonych prostych adresach pooglądaj adres strony (zmienne GET)

Kris-n
19-01-2010, 23:37
No niestety; próbuję tak:

// Generate script file links
foreach ($document->_scripts as $strSrc => $strType) {
//jeśli ładowana jest strona z galerią...
if (strpos($_SERVER['PATH_INFO'], 'gallery/category') !== false) {
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'" defer="defer"></script>'.$lnEnd;
} else {
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'"></script>'.$lnEnd;
Nie działa także przy parametrze 'com_phocagallery' (bez prostych linków) :mad:

Jolaass - zobacz, czy dobrze:
zamiast
(strpos($_SERVER['PATH_INFO'], 'gallery/category') !== false)
dałem
($_GET['option'] == 'com_phocagallery')
Wygląda na to, że działa (sprawdzę jutro w szkole na innych kompach), ale chciałbym mieć dobry kod.

Jednak kicha. Jak dodałem defer - działa pod IE, ale przestały działać wszystkie pokazy slajdów i wyskakujące zdjęcia - fotki otwierają się po prostu w nowym, gołym oknie. Jak widać mam wybór: albo ładna galeria, albo zgodność z wszystkimi przeglądarkami.
Efekty tutaj (http://www.ekonomik.rzeszow.pl/zse)

Jola
20-01-2010, 00:20
Chyba źle wybrałeś funkcję strpos() nie zwraca true, false.

foreach ($document->_scripts as $strSrc => $strType) {
if($_GET['option'] == 'com_phocagallery' && preg_match('/mootools/',$strSrc))
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'" defer="defer"></script>'.$lnEnd;
else
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'"></script>'.$lnEnd;
}Podczas testowania po dodaniu defer tylko do mootools pojawiły się problemy z działaniem niektórych modułów w js. Opuszczenie warunku mootools przywróciło ich funkcjonowanie.

Kris-n
20-01-2010, 00:35
Nie wie, czy wspominałem, że dość słabo znam php. W każdym razie - po daniu powyższego kodu wszystko padło. Ponieważ jednak, przynajmniej narazie - nie rozumiem, o czym do mnie rozmawiasz - odezwę się w najbliższym czasie, jak się poduczę :D

Jola
20-01-2010, 00:39
Przecież widzę, że działa.

Kris-n
20-01-2010, 00:48
Tak, działa ale na kodzie

if ($_GET['option'] == 'com_phocagallery')Jak spróbowałem wrzucić twój fragment kodu - wysiadło wszystko.
A na tym kodzie - nie formatuje pokazu slajdów. Może trzeba by dodatkowo wykryć przeglądarkę?

Jola
20-01-2010, 01:05
To musiałeś źle wkleić kod. Wystarczy błąd nawiasu....
U mnie w FF i IE 8 dodanie defer (w każdej postaci) psuje wyświetlanie grafiki galerii.

Kris-n
20-01-2010, 01:18
Miałaś rację, zostawiłem jeden nawias. Teraz działa, ale nie widzę różnicy pomiędzy moim kodem a Twoim - oba dodają "defer" do wszystkich deklaracji z plikami .js (mootools, modal i shadowbox).
Nie, pardon - Twój dodaje tylko do mootools, mój - do wszystkich. Ale pokazu slajdów i tak nie ma.

Kris-n
21-01-2010, 22:49
Kurka, próbuję dodatkowo wykryć przeglądarkę, żeby ingerować w kod tylko w przypadki IE, i nie wiem, dlaczego ten kod nie działa:

if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
foreach ($document->_scripts as $strSrc => $strType) {
if($_GET['option'] == 'com_phocagallery' && preg_match('/mootools/',$strSrc))
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'" defer="defer"></script>'.$lnEnd;

else
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'"></script>'.$lnEnd;
}
else {
foreach ($document->_scripts as $strSrc => $strType) {
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'"></script>'.$lnEnd;
}
}
}

Jola
21-01-2010, 23:19
Chyba zadam Ci pracę domową ( nie jestem nauczycielką)
- dowiedz się do czego służy funkcja strpos()
- dowiedz się jak się używa i zapisuje oraz jak działa warunek if else
Jest to niezbędne do sensownego pisania kodu php.

Kris-n
21-01-2010, 23:34
Hm, w manualu PHP znalazłem wpis, o strpos "If needle is not found, strpos() will return boolean FALSE.", co sprawdziłem na kodzie wykrywającym MSIE, i działało poprawnie.
Co do if - nie wiem, jak zostanie potraktowany ten kod bez pierwszego else (czyli [jeśli(1) MSIE to <jeśli(2) Phoca to defer>, jeśli nie(1) to bez zmian])

Jola
21-01-2010, 23:59
strpos() wyszukuje i zwraca pierwsze wystąpienie szukanego wyrażenia w ciągu znaków. Jeśli takie wyrażenie nie występuje zwraca false.
Jeśli chcesz sprawdzić czy ciąg coś zawiera to używaj funkcji, która to robi.
Poza tym chyba istotne będzie wybranie konkretnej wersji IE, wtedy można będzie użyć np.

<!--[if lte IE 6]>
..............
<![endif]-->Inna sprawa z if:

foreach ($document->_scripts as $strSrc => $strType) {
if(warunki:przeglądarka, mootools, galeria){
.................
..................
}
else {
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'"></script>'.$lnEnd;
}
}

Kris-n
22-01-2010, 00:12
Jednak zasadniczo, strpos robi to, czego chcę, czyli informuje mnie, że to jednak MSIE.
Warunki natomiast sprawdzałem też tak:


if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false && $_GET['option'] == 'com_phocagallery' && preg_match('/mootools/',$strSrc)) {
....................
....................
}
else {
foreach ($document->_scripts as $strSrc => $strType) {
$strHtml .= $tab.'<script type="'.$strType.'" src="'.$strSrc.'"></script>'.$lnEnd;}
}
}I też nie działa. Z ukrytymi komentarzami faktycznie jeszcze nie próbowałem
Poza tym, jestem już gotów dodać to dla wszystkich IE (niech się odczepią), zresztą, na razie i tak nie mam pomysłu, jak taki komentarz mógłbym tu wykorzystać. Pewnie dlatego, że już późno. :)

Jola
22-01-2010, 00:58
Jestem bardzo spokojna!
Dlaczego wyrzuciłeś if else z foreach?
Przecież podałam Ci schemat.

Kris-n
22-01-2010, 11:08
:) Spokój to podstawa. Właśnie - czemu wyrzuciłem??? Pewnie dlatego, że było późno. Popracuję nad tym.

Kris-n
23-01-2010, 00:27
Popracowałem. Zastosowałem się do Twoich ostatnich wskazówek i oczywiście zaczęło działać tak jak mówiłaś, tak, jak chciałem i tak, jak powinno. Wprawdzie IE pokazuje błędy na stronie i nadal nie rozpoznaję wersji IE - ale niech tak na razie zostanie - może jak będę miał więcej czasu to nad tym popracuję.
W każdym razie wielkie dzięki za cierpliwość i pomoc!!!:)

mackal
15-02-2010, 21:51
czy był byś tak miły wrzucając swój kod po przeróbkach ??

mam podobny problem z tą galerią i już zaczęło mniej więcej działać, ale to jeszcze nie jest to czego oczekuje, a widzę że na twojej stronie pod IE to lepiej chodzi

Kris-n
17-02-2010, 22:00
W zasadzie wszystko już jest wyżej opisane: Ostatnia składnia Jolaass z moim warunkiem i działa jak należy. I nie do przecenienia wiedza, którą można przy tym zdobyć.

mackal
08-04-2010, 10:05
Problem rozwiązany i opisany pod adresem http://maciej.pawlikowice.info/index.php/artykuly/35-joomla/44-joomla-i-phoca-gallery-problem-w-ie

Kris-n
08-04-2010, 12:46
W zasadzie wszystko już zostało opisane w naszym wątku. Nie spotkałem się z sytuacją, by ktoś potrzebował dodatkowo ingerować w skrypty .js. Miejmy tylko nadzieję, że, po w sumie dość głębokiej ingerencji w kod, osoby używające "gotowca" nie będą miały problemów.

mackal
08-04-2010, 14:54
Owszem zostało, jednak podczas usuwanie problemu zastosowałem rozwiązania z innych źródeł, które zebrałem i opisałem krok po kroku, tak aby potomni nie musieli się zastanawiać co muszą dalej zrobić. Gotowiec chociaż faktycznie trochę zmian wprowadza to nie nazwał bym ich głębokimi.
Po zastosowaniu rozwiązania tylko z tego forum na mojej stronie właśnie występowały problemy z lightboxem. Po zastosowaniu rozwiązania z innego forum problemów innych nie zarejestrowałem. Oczywiście nie ma rozwiązań idealnych i zawsze coś się znajdzie, ale wówczas zawsze można wrócić do tego wątku :)