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

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

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

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


« Ответ #1 : 26.08.2010, 17:25:27 »

А как выглядит? - можно пример?
Записан
danik.html
Практически профи
*******

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

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



« Ответ #2 : 17.09.2010, 02:20:57 »

Народ, если кто так делал - киньте ссылку поглядеть ))
Тема то прикольная... Там люди чуть ли не тысячами бъются как оптимизировать вирт, а ведь проще добавить капельку ajax'а, и все будет красиво и быстро Wink
Записан
monah1983
Новичок
*

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

Сообщений: 3


« Ответ #3 : 23.09.2010, 22:38:48 »

Скинь ссылку... охота посмотреть, заранее благодарен
Записан
danik.html
Практически профи
*******

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

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



« Ответ #4 : 23.09.2010, 23:12:12 »

у меня примера нет. И никто видать ниделал. Наверно всем плевать на удобство для пользователей и их время.
Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #5 : 24.09.2010, 01:35:22 »

Грандиозная идея!
Вот только не заработала у меня. Как только не пробовал, всё-равно страница перезагружается как и без скрипта. Не знаю в чём дело, а разобраться хотелось бы.
Кстати, за модуль категорий СПАСИБО (+ уже поставил)   Wink
Записан
danik.html
Практически профи
*******

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

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



« Ответ #6 : 24.09.2010, 01:59:23 »

первым делом ставим FireBug. отслеживаем выполнение кода, отсутсвие ошибок js и тд. Если не получится - дай ссылку, посмотрю
Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #7 : 24.09.2010, 10:36:38 »

БЛИН! ПОТРЯСАЮЩЕ! Просто гениально...

Проблемы была в том, что я копирнул скрипт из этого поста и он не отрабатывал из-за наличия "&nbsp;" во вставленном коде. Теперь бы ещё подружить его как-нибудь с ЧПУ, было бы совсем круто.
Записан
mrhuge
Давно я тут
****

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

Сообщений: 234

http://muzalliance.ru/


« Ответ #8 : 24.09.2010, 10:37:31 »

Идея супер! Вставил код в index.php шаблона - вместо catalog поставил manufacturers, так как у меня один модуль имеет id manufacturers, а второй dopmenu. Если второй модуль такой же нужно сделать - то вставить еще раз этот код, но уже с dopmenu?

Что значит $$('.menu a') и далее .each(... не понял.

В общем поставил - вижу что при нажатии на категории и производителей появляется иконка загрузки, но ничего не грузит и зависает. См http://muzalliance.ru/shop/category/2-sintezatori.html
Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #9 : 24.09.2010, 11:00:20 »

Это у тебя из-за ЧПУ. Отключи-заработает, только что проверял у себя.

Есть ещё вопрос: у меня все без ЧПУ работает, но вот картинка загрузки не отображается. Тобишь фон затемняется, страница категории обновляется, но гиф-ка не показывается при этом... В чём может быть проблема.

Ну и на счет SEF тоже решить бы как-нибудь.
Записан
mrhuge
Давно я тут
****

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

Сообщений: 234

http://muzalliance.ru/


« Ответ #10 : 24.09.2010, 11:03:13 »

О точно Azn удалил роутер и запахало, только картинка товара не показывается Azn

но смотрится красиво Azn
Записан
danik.html
Практически профи
*******

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

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



« Ответ #11 : 24.09.2010, 11:13:05 »

Обновил код. теперь работает и с чпу!
Объясню чуток про селекторы, не помешает ))
в mootools функция $ принимает в качестве параметра строку-идентификатор, и возвращает только один элемент, с этим идентификатором, что логично.
для запроса css-селектора есть функция $$, аналогичная jquery'вскому $
тоесть в jquery это $('#catalog a'), а в мутулзе $$('#catalog a').
Тоже самое в мутулзе можно получить и так: $('catalog').getElements('a').

чтоб навесить на все менюшки можно написать либо так:
$$('.menu a')
либо так:
$$('#manufacturers a, #dopmenu a')
Записан
danik.html
Практически профи
*******

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

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



« Ответ #12 : 24.09.2010, 11:15:06 »

кстати имеется серьезная проблема... не меняется title страницы, что выглядит коряво (((
Кто предложит решение - тому пинок под зад (шутко) Wink
я думаю надо копать в сторону json'a...
Записан
mrhuge
Давно я тут
****

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

Сообщений: 234

http://muzalliance.ru/


« Ответ #13 : 24.09.2010, 11:20:25 »

Ее бэйби  Grin заработало с ЧПУ, но опять картинок нету

Про доллары это ты круто объяснил - теперь всё ясно  Grin

То что тайтл не меняется это  Cry

и нажимаю опять вывод по количеству - и опять not found http://muzalliance.ru/shop/category/2-sintezatori.html&limitstart=0&limit=20  Grin

под попу хотел бы получить - но не знаю даже куда копать  Grin

И всё так быстро прикольно - не перегружает страницу 20 раз - это мега ускоритель для Vmart
« Последнее редактирование: 24.09.2010, 11:23:50 от mrhuge » Записан
mrhuge
Давно я тут
****

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

Сообщений: 234

http://muzalliance.ru/


« Ответ #14 : 24.09.2010, 11:24:55 »

А нельзя также страницу товара подгружать аяксом?

Блин Даник может у тебя еще какиенибудь прикольные темы на этом форуме есть?  Grin У тебя столько клёвого всего!
Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #15 : 24.09.2010, 11:36:12 »

О title, это ты конечно метко заметил... Рад бы подумать на эту тему, но в JS вообще не рублю.

Подскажи пожалуйста, почему может не отображаться ГИФка с процессом загрузки (spinner.gif). Файлик этот есть...
Записан
xCoReLx
Давно я тут
****

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

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



« Ответ #16 : 24.09.2010, 12:12:38 »

чет я по ходу туплю всталяю в индекс, после перезагрузки страницы весь скрипт вылазит, чего забыл дописать?
« Последнее редактирование: 24.09.2010, 13:52:03 от xCoReLx » Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #17 : 24.09.2010, 12:14:17 »

скорее всего вставляещь в хтмл... поставь по сторонам <?php и ?>
Записан
danik.html
Практически профи
*******

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

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



« Ответ #18 : 24.09.2010, 12:16:34 »

Подскажи пожалуйста, почему может не отображаться ГИФка с процессом загрузки (spinner.gif). Файлик этот есть...

глянь через FireBug че там творится...
Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #19 : 24.09.2010, 12:19:05 »

Так я просто не очень понимаю, как именно это в нём глянуть...
Записан
danik.html
Практически профи
*******

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

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



« Ответ #20 : 24.09.2010, 12:22:57 »

А нельзя также страницу товара подгружать аяксом?

Думаю можно, для этого нужно навешивать на все ссылки внтури vmMainPage обработчики, сразу после загрузки страницы, а также после ajax-подгрузки.
пока решаю проблему с тайтлом. Пока нифига не выходит (((
нужно както передать тело компонента и тайтл либо через XML либо через json.
Сам метод такой: добавляем в шаблон новый файл, скажем XML.php. теперь при запросе http://site.ru/page.html?tmpl=xml загрузится не index.php а XML.php.
вот только я не могу засунуть в  xml г*вняный HTML вирта. тоже и с json'ом.
Пробую так:

{'title': '<?php echo $this->title ?>', 'body': '<?php echo $this->getBuffer('component')?>' }

не работает видать потому что в HTML компонента встречаются одинарные ковычки, которые закрывают строку раньше времени...

$this->getBuffer('component') - это тоже самое что и <jdoc:include type="component" />, просто "на пхп"
Записан
danik.html
Практически профи
*******

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

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



« Ответ #21 : 24.09.2010, 13:17:06 »

ухты. нештяг. вроде получилось с тайтлом Wink
и вобще навешал на все ссылки внутри компонента - терь по сайту лазить ваще кайф - все просто летает ))
Записан
DaVinchy
Завсегдатай
*****

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

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



« Ответ #22 : 24.09.2010, 13:22:33 »

Спасибо за скрипт  Wink

НО:
1.при выборе главного пункта меню подпункты не открываются (усовершенствованный модуль категорий, дефолтный шаблон)
2.при обновлении страницы (F5) товары пропадают и, чтобы их увидеть, надо снова выбирать категорию

P.S. Даник, продолжай в том же духе  drink
Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #23 : 24.09.2010, 13:26:33 »

Даник, ну заинтриговал! Делись теперь уже  Wink
Записан
danik.html
Практически профи
*******

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

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



« Ответ #24 : 24.09.2010, 13:46:56 »

1.при выборе главного пункта меню подпункты не открываются (усовершенствованный модуль категорий, дефолтный шаблон)
и не будут. обновляется только область компонента. Юзаем аккордион. или можно и default но придется заскриптовать его чуток.
2.при обновлении страницы (F5) товары пропадают и, чтобы их увидеть, надо снова выбирать категорию

Проблема вобщемто тоже решима. Целью было показать
Цитировать
пример простейшей реализации
А дальше либо сами доводим до ума, либо используем функцию $('danik'), которая возрващает желаемый результат Wink
Записан
delomac
Осваиваюсь на форуме
***

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

Сообщений: 55


« Ответ #25 : 24.09.2010, 14:21:37 »

Так и все-таки, как с тайтлом быть? Roll Eyes
Записан
danik.html
Практически профи
*******

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

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



« Ответ #26 : 24.09.2010, 14:33:37 »

судьба тайтла решается пока туто. Смотрю там Mitrich красным огоньком светится, глядишь намекнет на решение )
Записан
DaVinchy
Завсегдатай
*****

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

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



« Ответ #27 : 24.09.2010, 15:11:59 »

а каким образом решить отсутствие картинки товара?  Wink
Записан
danik.html
Практически профи
*******

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

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



« Ответ #28 : 24.09.2010, 16:02:28 »

почему это отсутствие?? в любом случае поможет FireBug
Записан
mrhuge
Давно я тут
****

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

Сообщений: 234

http://muzalliance.ru/


« Ответ #29 : 24.09.2010, 17:35:21 »

ухты. нештяг. вроде получилось с тайтлом Wink
и вобще навешал на все ссылки внутри компонента - терь по сайту лазить ваще кайф - все просто летает ))

решилось всё?! блин прикольно, если можно страницу товара да еще и с картинкой аяксом открывать!
Записан
Страниц: [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