LiveInternetMail.ru
Форум русской поддержки Joomla!® CMS
26.05.2012, 16:19:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 1.7 FAQ Joomla 1.5 FAQ Joomla 1.0 FAQ Правила форума Новости Joomla Войти Регистрация Помощь  
Страниц: 1 2 3 4 5 [6]   Вниз
  Добавить закладку  |  Печать  
Автор Тема: [howto] AJAX навигация по категориям  (Прочитано 21302 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
danik.html
Практически профи
*******

Репутация: +305/-3
Offline Offline

Пол: Мужской
Сообщений: 2978



« : 26.08.2010, 15:31:52 »

Однин из способов сделать магазин быстрее и удобнее для пользователя - использование AJAX подгрузки тела компонента VirtueMart.
Использование подгрузки только нужной части страницы вместо перезагрузки всей страницы имеет немало преимуществ:

1) Экономия трафика
2) Уменьшение нагрузки на сервер
3) Быстрота (как результат 1 и 2)
4) Отсутсвие "мерцания" страницы
5) Эффектно смотрится для юзера

Я приведу пример простейшей реализации, которая позволит перемещаться по категориям через ajax-подгрузку.
На сайте должен быть список категорий магазина: это может быть стандартный модуль меню mod_mainmenu или усовершенствованный модуль категорий VirtueMart - mod_virtuemart_categories.
Условимся что модуль присутсвует на всех страницах сайта, в параметрах модуля указан id списка - catalog

Теперь за дело: добавляем в index.php своего шаблона вот такой код:

Код
$script = "
window.addEvent('domready', function(){
 
loading = false;
$$('#catalog a').each(function (el) {
el.addEvent('click', function (e) {
 
if (!$('vmMainPage')) return;
 
(new Event(e)).preventDefault();
if (loading) return;
 
var container = $('vmMainPage').getParent();
 
var onComplete = function(responseText, responseXML){
var titleNode = responseXML.documentElement.getElementsByTagName('title')[0];
var bodyNode = responseXML.documentElement.getElementsByTagName('body')[0];
document.title = titleNode.textContent || titleNode.text;
container.setHTML(bodyNode.textContent || bodyNode.text);
loading = false;
}
 
container.setStyle('position', 'relative');
container.appendChild(
new Element(
'div',
{
'styles' : {
'height': container.offsetHeight,
'width': container.offsetWidth,
'position': 'absolute',
'top': 0,
'left': 0,
'background': '#fff',
'opacity': 0.4
}
}
)
);
container.appendChild(
new Element(
'img',
{
'src': '/media/system/images/spinner.gif',
'styles': {
'position': 'absolute',
'top': '50%',
'left': '50%'
}
}
)
);
 
loading = true;
new Ajax(el.href, {onComplete: onComplete}).request({tmpl: 'xml'});
 
});
 
});
});
"
;
JHTML::_('behavior.mootools');
$this->addScriptDeclaration($script);

Так как нам нужно подгрузить не только сам компонент, но и новый тайтл, нам нужно обернуть две эти составляющие в какойто контейнет. Это может быть либо JSON, либо XML. Со вторым у меня возникло меньше трудностей, поэтому использую его. Передав в запросе ?tmpl=xml мы тем самым заставляем Joomla запросить не index.php шаблона, а xml.php, который нужно создать рядом с index.php шаблона. Вот его код:
Код:
<?php

// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );


$this->setMimeEncoding('text/xml');


$title = $this->title;

$body = $this->getBuffer('component');
$body = str_replace('<![CDATA[', '', $body);
$body = str_replace(']]>', '', $body);
?>

<page>
<title><![CDATA[<?php echo $title ?>]]></title>
<body><![CDATA[<?php echo $body ?>]]></body>
</page>
Все, теперь если мы на странице VirtueMart, то клик по меню не приведет к переходу по ссылке, вместо этого сработает скрипт, который подгрузит тело VirtueMart и заголовок страницы.
Пояснения:
catalog - id тега меню(списка категорий) - настраивается в параметрах модуля. Можно использовать любой другой селектор, например $$('.menu a')
vmMainPage - id wrapperа VirtueMart, зашито в коде компонента
'background': '#fff' - цвет оверлея, белый.
'opacity': 0.4 - прозрачность оверлея, 40%
'src': '/media/system/images/spinner.gif' - путь к картинке анимации загрузки

Код протестирован в ff 3, opera 10, ie 8, 7

Впринципе этот скрипт можно вынести из шаблона куда угодно.
Я не касался вопросов хистори браузера, смены адреса (добавления хэша) и др.

Известный факт что Витр - самый популярный, и приэтом самый криворукий магазин на Joomla. Писали его индусы однозначно. И я, хоть и потомок индусов, все же стараюсь забыть свое происхождение и стать профессионалом. Стараюсь изо всех сил, придумываю всякие клевые фигнюшки для вирта, но он ставит палки в колеса повсеместно.
Очередная палка - document.write(бла бла) в дефолтном шаблоне вирта. Скрипты загруженные аяксом не исполняются, а значит не исполнится document.write. А именно этим методом выводятся картинки в попап  на странице категории.
Решение простое. Заменяем в файле \components\com_virtuemart\themes\default\templates\browse\browse_1.php
Код:
       <div class="browseProductImageContainer">
       <script type="text/javascript">//<![CDATA[
       document.write('<a href="javascript:void window.open(\'<?php echo $product_full_image ?>\', \'win2\', \'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=<?php echo $full_image_width ?>,height=<?php echo $full_image_height ?>,directories=no,location=no\');">');
       document.write( '<?php echo ps_product::image_tag( $product_thumb_image, 'class="browseProductImage" border="0" title="'.$product_name.'" alt="'.$product_name .'"' )?></a>' );
       //]]>
       </script>
       <noscript>
           <a href="<?php echo $product_full_image ?>" target="_blank" title="<?php echo $product_name ?>">
           <?php echo ps_product::image_tag( $product_thumb_image, 'class="browseProductImage" border="0" title="'.$product_name.'" alt="'.$product_name .'"' )?>
           </a>
       </noscript>
        </div>
на
Код:
       <div class="browseProductImageContainer">
           <a href="<?php echo $product_full_image ?>" target="_blank" title="<?php echo $product_name ?>" onclick="window.open('<?php echo $product_full_image ?>', 'win2', 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=<?php echo $full_image_width ?>,height=<?php echo $full_image_height ?>,directories=no,location=no'); return false">
           <?php echo ps_product::image_tag( $product_thumb_image, 'class="browseProductImage" border="0" title="'.$product_name.'" alt="'.$product_name .'"' )?>
           </a>
        </div>

Как видим кода в 2 стало меньше и мы избавились от документ.райт(). Почему изобретатели вирта не додумались до такой записи - загатка. Быть может их просто прикалывает метод document.write, и в новой версии вирта они будут весь код страницы выводить как document.write() и <noscript>обломайся - у тя выкл. js - ты лузер</noscript>

PS: изивинте накипело. решение не проверял, как меня и учил дедушка индус...
« Последнее редактирование: 06.10.2010, 23:55:39 от danik.html » Записан
 
Jurii
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Сообщений: 8


« Ответ #151 : 05.06.2011, 01:06:02 »

СПСБ! Работает, НО! Почемуто через РАЗ!
Т.е. жмешь ссылку, страница грузится полностью, жмешь вторую - грузиться АЯКС. И так далее через раз...
Что это может быть?


Аналогичная проблема, есть её решение?

Title так и не заработал

если кликнуть по фильтру с главной (фильтр тот, что слева), то нечего не происходит


// Разобрался, делал для mod_vm_cherry_picker

заходим в mod_vm_cherry_picker, открываем writer.php

строка примерно 365, там есть js:

static function addScript(){
      ?>
      <script type="text/javascript">
      <?php if(chpconf::option('type')==0 && chpconf::option('collapsehead')){ ?>
      $$('#chpNav<?php echo chpconf::option('module_id'); ?> .chp-collap').each(function(div){
         var trig=div.getElement('h2');
         var block=trig.getNext();\
                             ...
 </script>

стираем и вставляем:

Код:
$$('#chpNav32 .chp-collap').each(function(div){
var trig=div.getElement('h2');
var block=trig.getNext();
var fx=new Fx.Slide(block,{duration:200, onComplete:function(){
trig.getFirst().toggleClass('down');
var cont=block.getParent();
if(cont.getStyle('height').toInt()!=0) cont.setStyle('height','');
}
});
trig.addEvent('click', function(){
fx.toggle();
});
});
var currEffect;
$$('.chp-seemore').addEvent('click',function(){
var trig=this;
var list=trig.getNext(); if(list.hasClass('hid')){
trig.getFirst().innerHTML='-';
trig.getElement('.chp-smt').innerHTML='Свернуть...';
if(currEffect){currEffect.stop();currEffect=null;}
list.setStyle('opacity',0);
list.removeClass('hid');
var fade=list.effect('opacity', {
duration: 400,
transition: Fx.Transitions.Quad.easeInOut
});
currEffect=fade;
fade.start(0,1);
}else{
list.addClass('hid');
trig.getFirst().innerHTML='+';
trig.getElement('.chp-smt').innerHTML='Развернуть...';
}
});
$$('.chpNav a').addEvent('click',function(event){
var link=this.getAttribute('href');
var container=$('chpNav32');
var url='http://moisait.ru/modules/mod_vm_cherry_picker/ajax/getmodule.php';
href=link.substr(link.indexOf('?')+1);
href+='&mid=32';
container.setStyle('position', 'relative');
container.appendChild(
new Element(
'div',
{
'styles' : {
'height': container.offsetHeight,
'width': container.offsetWidth,
'position': 'absolute',
'top': 0,
'left': 0,
'background': '#fff',
'opacity': 0.4
}
}
)
);

new AJAX (url,{
method:'get',
data: href,
evalScripts:true,
onRequest: function(){
container.addClass('chp-loading');
},
onComplete: function(){
container.removeClass('chp-loading');
},
update: container
}).request();


event.preventDefault();
});


$$('.chpNav a').each(function (el) {
el.addEvent('click', function (e) {
 
if (!$('vmMainPage')) return;
 
//(new Event(e)).preventDefault();
//if (loading) return;
 
var container = $('vmMainPage').getParent();
 
var onComplete = function(responseText, responseXML){
var titleNode = responseXML.documentElement.getElementsByTagName('title')[0];
var bodyNode = responseXML.documentElement.getElementsByTagName('body')[0];
document.title = titleNode.textContent || titleNode.text;
container.setHTML(bodyNode.textContent || bodyNode.text);
loading = false;
}
 
container.setStyle('position', 'relative');
container.appendChild(
new Element(
'div',
{
'styles' : {
'height': container.offsetHeight,
'width': container.offsetWidth,
'position': 'absolute',
'top': 0,
'left': 0,
'background': '#fff',
'opacity': 0.4
}
}
)
);

 
loading = true;
new Ajax(el.href, {onComplete: onComplete}).request({tmpl: 'xml'});
 
});
 
});

chpNav32 и остальные 32 заменяем на свой id
moisait.ru - пишем свой
« Последнее редактирование: 05.06.2011, 12:26:34 от Jurii » Записан
victor9191
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 14



« Ответ #152 : 10.06.2011, 07:38:00 »

Помогите пожалуйста, при переходе по категориям, появляется анимация с загрузкой, и все зависает, FireBug находит ошибку titleNode is undefined
...„/index.php?option=com_virtuemart&page=shop.browse&category_id=5&vmcchk=1&Itemid=1  Line 29

Вопрос закрыт, это я ступил, не так создал XML.php =)))
« Последнее редактирование: 11.06.2011, 20:41:22 от victor9191 » Записан
Darkman
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 23



« Ответ #153 : 18.06.2011, 04:39:22 »

Вообще есть вот такая штука - http://extensions.joomla.org/extensions/site-management/site-performance/13293
addfulajax - работает прекрасно на всех страницах, правда глюки иногда бывают, но плагин отличный
Плагин действительно отличный, всё работает как надо, но вот только я не понял как сделать чтобы он работал только по категориям и flypage VirtueMart, ну или чтобы модули на главной по центру страницы исчезали.
Записан
vtx
Давно я тут
****

Репутация: +16/-0
Offline Offline

Сообщений: 231



« Ответ #154 : 05.07.2011, 14:28:32 »

Если серьезно то после многочасового ковыряния документации js и mootools у меня получилось корректно навесить дополнительную функцию на нужные ссылки и получить подгрузку флайпейджа товара через AJAX и успешные переходы. Что получилось и как это работает можно посмотреть здесь уже не посмотреть, переделываю на jquery.

Как успехи? Хотелосьбы посмотреть на результат
Записан
Roberta
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 214


« Ответ #155 : 30.08.2011, 22:30:25 »

подскажите, как реализовать открытие флайпейдж через AJAX? как на вот этом сайте http://p.fresimosushi.ru/products/piccy_1/#yatop здесь дополнительные ингридиенты (аналог свойств товара) открываются без перезагрузки
Записан
Infosakh
Живу я здесь
******

Репутация: +66/-0
Offline Offline

Сообщений: 1331



« Ответ #156 : 31.08.2011, 03:52:55 »

подскажите, как реализовать открытие флайпейдж через AJAX? как на вот этом сайте http://p.fresimosushi.ru/products/piccy_1/#yatop здесь дополнительные ингридиенты (аналог свойств товара) открываются без перезагрузки
ингридиенты это не флайпедж
Записан
Infosakh
Живу я здесь
******

Репутация: +66/-0
Offline Offline

Сообщений: 1331



« Ответ #157 : 31.08.2011, 03:53:56 »

хех, как подключить стили CSS в флайпедж сделанного в всплывающем окне, вот задачка   Grin
Записан
Roberta
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 214


« Ответ #158 : 31.08.2011, 12:03:32 »

ингридиенты это не флайпедж
а как это реализавать? сначала сделать отображение свойств в browse как здесь http://joomlaforum.ru/index.php/topic,104621.0.html
а потом?
Записан
Infosakh
Живу я здесь
******

Репутация: +66/-0
Offline Offline

Сообщений: 1331



« Ответ #159 : 31.08.2011, 12:23:02 »

да, здесь просто используется хак с выводом свойств товара в browse, а уже по ссылке "Ингридиенты" используется аджакс открытие этих свойств  Smiley
Записан
tkheun
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 114


« Ответ #160 : 06.09.2011, 15:00:21 »

У меня возникла проблема с зарегистрированными пользователями. Т.е. у простых посетителей всё пашет нормально, а вот если ввести свой логин и войти на сайт, то при клике по пункту меню аккордион-модуля сайт подвисает (лоадер крутится и всё, зарузга инфы о товарах не происходит).
Записан
terr
Завсегдатай
*****

Репутация: +10/-4
Offline Offline

Пол: Мужской
Сообщений: 750


Ученик html-я


« Ответ #161 : 16.09.2011, 22:17:49 »

Код:
loading = false;
$$('#vm-accordion a, .art-BlockContent-body, .art-BlockContent, .menu a').each(function (el)

Вроде все паставил и еще сверху на всякий случай а AJAX всеравно не пашет((( bumir.ru не посоветуете чвонить?

Консоль ошибок во чо показывает



Файербаг в консоле показал тож самое

Прерывать на этой ошибке

Код:
$script = "
« Последнее редактирование: 16.09.2011, 22:47:09 от terr » Записан
kikskoks
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 4


« Ответ #162 : 25.09.2011, 21:29:00 »

Ребят, кто поможет настроить AJAX для модуля Cherry Picker?

Mootools 1.2.4, Joomla 1.5.20
www.kikskoks.ru

За разумную плату разумеется.
e-mail: admin@kikskoks.ru
ICQ: 220404706
Записан
terr
Завсегдатай
*****

Репутация: +10/-4
Offline Offline

Пол: Мужской
Сообщений: 750


Ученик html-я


« Ответ #163 : 11.10.2011, 13:18:21 »

Код:
Ошибка: MooTools.upgradeLog is not a function
Источник: http://www.bumir.ru/plugins/system/mtupgrade/mootools.js
Строка: 1

Как победить
« Последнее редактирование: 11.10.2011, 13:30:11 от terr » Записан
Cergunya
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 13


« Ответ #164 : 11.11.2011, 13:13:58 »

Ребят, кто поможет настроить AJAX для модуля Cherry Picker?

Mootools 1.2.4, Joomla 1.5.20
www.kikskoks.ru

За разумную плату разумеется.
e-mail: admin@kikskoks.ru
ICQ: 220404706
Есть рабочий пример
_http://shop.trinitech.com.ua/periphery/monitors
Записан
4Gen
Давно я тут
****

Репутация: +6/-0
Offline Offline

Пол: Мужской
Сообщений: 229



« Ответ #165 : 18.11.2011, 20:25:46 »

-
« Последнее редактирование: 02.12.2011, 09:58:40 от 4Gen » Записан
Noralla
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Сообщений: 29


« Ответ #166 : 03.12.2011, 18:30:42 »

Есть рабочий пример
_http://shop.trinitech.com.ua/periphery/monitors

Удобно получилось!
« Последнее редактирование: 01.03.2012, 19:11:14 от Noralla » Записан
rewuxiin
Давно я тут
****

Репутация: +16/-1
Offline Offline

Сообщений: 365


« Ответ #167 : 22.12.2011, 15:46:34 »

способ конечно хорош. тем более учитывая то что меняется title!

но страница подгружается секунд эдак 40!
причем не важно сколько на ней товара, обычно не более 15.
Записан
Infosakh
Живу я здесь
******

Репутация: +66/-0
Offline Offline

Сообщений: 1331



« Ответ #168 : 22.12.2011, 15:59:42 »

значит это не аджакс  Smiley на аджаксе побырому должно получится  Grin
Записан
rewuxiin
Давно я тут
****

Репутация: +16/-1
Offline Offline

Сообщений: 365


« Ответ #169 : 22.12.2011, 17:36:14 »

собссно использовал код автора стартопа - ничего не изменяя.
Записан
Infosakh
Живу я здесь
******

Репутация: +66/-0
Offline Offline

Сообщений: 1331



« Ответ #170 : 23.12.2011, 02:38:25 »

там по определению должно грузиться быстрее так как не грузится шаблон сайта и т.д.  Smiley
Записан
Страниц: 1 2 3 4 5 [6]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Рейтинг@Mail.ru Rambler Top100 Powered by SMF 1.1.16 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet