Собственно, это может произойти не только в Virtuemart, этим может заболеть любой сайт, когда в нем накручивается много разных плагинов jQuery от разных фреймворков. Например, у меня (одного из моих клиентов) такая бяка полезла после того, как в шаблоне, сгенерированном Artisteer, начало конфликтовать практически все, что могло (Joomla 1.5 + Virtuemart 2.0 + шаблон от Artisteer = [closed censorship]).
Короче. Если вываливается что-то типа «.fancybox is not a function» — это говорит только о том, что где-то что-то конфликтует.
Для исправления подобных недоразумений придумано это:
jQuery.noConflict();
В Artisteer это даже вынесено в отдельный файл. Убивал бы, да кодекс не дает…
Также существует большая вероятность того, что где-то переподключается jQuery или какой-то другой фреймворк. Такие дублированные подключения надо пресекать (найдите, убейте сами — тут все сильно индивидуально).
Итак, в моем случае, я, пофиксив дублирующиеся подключения фреймворков и путаницу в порядке подключения плагинов (убив, таким образом, другие попутные проблемы), добрался до файла /components/com_virtuemart/views/productdetails/tmpl/default_images.php
Там в строке 24 начинается следующее буйство:
$imageJS = ' jQuery(document).ready(function() { jQuery("a[rel=vm-additional-images]").fancybox({ "titlePosition" : "inside", "transitionIn" : "elastic", "transitionOut" : "elastic" }); }); ';
Тут делаем следующий АП:
$imageJS = ' var j$ = jQuery.noConflict(); j$(document).ready(function() { j$("a[rel=vm-additional-images]").fancybox({ "titlePosition" : "inside", "transitionIn" : "elastic", "transitionOut" : "elastic" }); }); ';
То есть, мы добавляем свой noConflict, с бэкджеком и разными тетями и его юзаем в своих корыстных целях. Добавляем
var j$ = jQuery.noConflict();
Заменяем jQuery на j$
Ну, вот, как-то так оно и происходит… В общем, если что-то где-то «is not a function» — это значит, что что-то где-то неправильно подключено, или конфликтует с соседями (юзаем noConflict).
Просто спасли! Огромное спасибо!!!