[Помощь] Смена отображения вида в категории

rusdin

Постоялец
Регистрация
7 Фев 2013
Сообщения
61
Реакции
47
Всем привет! Озадачился реализацией одной функцией: чтоб в категории товаров где выводится список товаров была Сортировка вернее возможность выбора расположения товара ( По 1 товару в строку, по 2 товара и.т.д.) Увидел похожий вариант в шаблоне Для просмотра ссылки Войди или Зарегистрируйся (Не подумайте что реклама). Также реализовано подобное Для просмотра ссылки Войди или Зарегистрируйся рядом с сортировкой! Метод проб и ошибок выдергивания кода из шаблона, принесли больше ошибок и глюков. Обращаюсь к Вам возможно кто-то уже реализовывал или понимает что необходимо! Понимаю что править нужно default.php Многие начинающие создатели сайтов на virtuemart скажут спасибо за данную реализацию! Сильно не пинайте если подобное уже обсуждалось. Поиском пользовался но не нашел! Joomla 2.5.9, Virtuemart 2.0.18a
 
Работаю с этим шаблоном, купленным заказчиком, а вот и основной рабочий код, отвечающий за пересорт:
PHP:
$layout_type_link = $('#option_com .layout-type a');
$('#option_com .layout-type a.sort_listing').addClass('active');
$container.addClass('layout-listing');
$container.isotope('reLayout');
var f_layout = function (){
var $this = $(this);
$('#option_com .layout-type a').removeClass('active');
$this.addClass('active');
if ($this.hasClass('sort_listing')){
$container.removeClass('layout-table');
$container.addClass('layout-listing');
$container_table_search.find('.item .item-inner').css('height','auto');
$container.isotope('reLayout');
$.cookies.set('layout_container','layout-listing')
}
if ($this.hasClass('sort_grid')){
$container.removeClass('layout-listing');
$container.addClass('layout-table');
$container_table_search.find('.item .item-inner').css('height',h_search_item);
$container.isotope('reLayout');
$.cookies.set('layout_container','layout-table')
}
}
$layout_type_link.bind('click', f_layout);
 
var layout_cookies = $.cookies.get('layout_container');
if (layout_cookies == 'layout-listing'){
$('#option_com .layout-type a').removeClass('active');
$('#option_com .layout-type a.sort_listing').addClass('active');
$container.removeClass('layout-table');
$container.addClass('layout-listing');
$container_table_search.find('.item .item-inner').css('height','auto');
$container.isotope('reLayout');
}
 
// reLayout
$(window).resize(function(){
$container.isotope('reLayout');
// Keep main menu
if($(".group-main-top") && $('#content_main')){
offsetleft = $("#content_main").offset().left;
$(".group-main-top").css('left', offsetleft+'px');
$("#option_com").css('left', offsetleft+15+'px');
}
}
Все остальное должно быть понятно.
Так же в сети УЖЕ есть рабочие варианты решения задачи и под вирт 1 и вирт 2.
 
Для VM1

в browse_header_category.tpl.php

Код:
<form id="vid" name="vid" action="<?php echo JURI::getInstance()->tostring();?>" method="post">
<input type="submit" value="1" name="variant1">
<input type="submit" value="2" name="variant2">
</form>

в shop.browse.php - в самом низу кода заменить строку: echo $tpl->fetch( $tpl->config->get( 'productListStyle' ) );

Код:
<?php
$variant1 = JRequest::getVar('variant1', '');
$variant2 = JRequest::getVar('variant2', '');
$session =& JFactory::getSession();
if ($variant1) $session->set("variant", $variant1);
if ($variant2) $session->set("variant", $variant2);
$variant = $session->get("variant", 1);
if ($variant ==1  ) {
echo $tpl->fetch( 'browse/includes/browse_notables.tpl.php' ) ;
} else {
echo $tpl->fetch( 'browse/includes/browse_listtable.tpl.php' );
}
?>
 
Работаю с этим шаблоном, купленным заказчиком, а вот и основной рабочий код, отвечающий за пересорт:
PHP:
$layout_type_link = $('#option_com .layout-type a');
$('#option_com .layout-type a.sort_listing').addClass('active');
$container.addClass('layout-listing');
$container.isotope('reLayout');
var f_layout = function (){
var $this = $(this);
$('#option_com .layout-type a').removeClass('active');
$this.addClass('active');
if ($this.hasClass('sort_listing')){
$container.removeClass('layout-table');
$container.addClass('layout-listing');
$container_table_search.find('.item .item-inner').css('height','auto');
$container.isotope('reLayout');
$.cookies.set('layout_container','layout-listing')
}
if ($this.hasClass('sort_grid')){
$container.removeClass('layout-listing');
$container.addClass('layout-table');
$container_table_search.find('.item .item-inner').css('height',h_search_item);
$container.isotope('reLayout');
$.cookies.set('layout_container','layout-table')
}
}
$layout_type_link.bind('click', f_layout);
 
var layout_cookies = $.cookies.get('layout_container');
if (layout_cookies == 'layout-listing'){
$('#option_com .layout-type a').removeClass('active');
$('#option_com .layout-type a.sort_listing').addClass('active');
$container.removeClass('layout-table');
$container.addClass('layout-listing');
$container_table_search.find('.item .item-inner').css('height','auto');
$container.isotope('reLayout');
}
 
// reLayout
$(window).resize(function(){
$container.isotope('reLayout');
// Keep main menu
if($(".group-main-top") && $('#content_main')){
offsetleft = $("#content_main").offset().left;
$(".group-main-top").css('left', offsetleft+'px');
$("#option_com").css('left', offsetleft+15+'px');
}
}
Все остальное должно быть понятно.
Так же в сети УЖЕ есть рабочие варианты решения задачи и под вирт 1 и вирт 2.
Выдает ошибку! Копирую в default.php. Я не силен в php. Что не так делаю?

Parse error: syntax error, unexpected '(', expecting T_VARIABLE or '$' in /home/..../components/com_virtuemart/views/category/tmpl/default.php on line 54

Пытаюсь выдернуть код с шаблона указанного выше. Кнопки появляются но не рабочие!
Код:
<div id="option_com">
 
                    <?php //echo $this->orderByList['orderby']; ?>
 
                    <div class="sort_item">
 
                        <div class="sort_by">
 
                            <div class="active-order"><!--<span><?php //echo JTEXT::_('SORT_BY'); ?></span>--><span class="sort-style"><?php echo JTEXT::_('CHOOSE_AN_OPTION'); ?></span><span class="sort-ad" style=""></span></div>
 
                            <div style="display:none;" id="sort-by" class="option-set clearfix" data-option-key="sortBy">
 
                                <a href="#sortBy=original-order" data-option-value="original-order" class="selected"><?php echo JTEXT::_('ORIGINAL_ORDER'); ?></a>
 
                                <a href="#sortBy=random" data-option-value="random"><?php echo JTEXT::_('RANDOM_ORDER'); ?></a>
 
                                <a href="#sortBy=vm_price" data-option-value="vm_price"><?php echo JTEXT::_('PRICE_ORDER'); ?></a>   
 
                                <a href="#sortBy=vm_title" data-option-value="vm_title"><?php echo JTEXT::_('TITLE_ALPHABETICAL'); ?></a>
 
                                <a href="#sortBy=vm_category_name" data-option-value="vm_category_name"><?php echo JTEXT::_('CATEGORY_NAME_ORDER'); ?></a>
 
                                <a href="#sortBy=vm_mf_name" data-option-value="vm_mf_name"><?php echo JTEXT::_('MF_NAME_ORDER'); ?></a>
 
                                <a href="#sortBy=vm_product_s_desc" data-option-value="vm_product_s_desc"><?php echo JTEXT::_('PRODUCT_S_DESC_ORDER'); ?></a>
 
                                <a href="#sortBy=vm_product_in_stock" data-option-value="vm_product_in_stock"><?php echo JTEXT::_('PRODUCT_IN_STOCK_ORDER'); ?></a>
 
                                <a href="#sortBy=vm_product_sku" data-option-value="vm_product_sku"><?php echo JTEXT::_('PRODUCT_SKU_ORDER'); ?></a>                       
 
                              </div>
 
                          </div>
 
                        <div class="sort_direction" style="display:none;">
 
                            <h1>Sort direction</h1>
 
                            <div id="sort-direction" class="option-set clearfix" data-option-key="sortAscending">
 
                                <a href="#sortAscending=true" data-option-value="true" class="sort_ascending selected">sort ascending</a>
 
                                <a href="#sortAscending=false" data-option-value="false" class="sort_descending">sort descending</a>
 
                            </div>
 
                        </div>
 
                    </div>
 
                    <div class="layout-type">
 
                        <a href="javascript: void(0)" class="sort_grid">Table</a>
 
                        <a href="javascript: void(0)" class="sort_listing">Listing</a>
 
                    </div>
 
                </div>
 
Очень интересует эта тема, может кто нибудь разжевать поподробней на примере SJ AppStore Hi-tech.
Интересует как добавить другие виды отображения и какие файлы за это отвечают.
Немного полазив в интернете наткнулся на isotope.js он имеет к этому какое то отношение?
Не силен в сайтостроении, но очень хочется это освоить:)
 
еще можно переключать не через JS а через вид отображения - возможно так будет проще, а то без умных мыслей передирать чужой код - нехорошо...

/?view=table

/?view=price

можно как GET параметр и потом его обработать в шаблоне категории
PHP:
if ( $_GET['view']  == 'table') { /*вывод для таблицы*/ } else if ( $_GET['view']  == 'price') { /*вывод для прайса*/ }

или создать соотв. шаблоны с именами как в параметре передаваемом (где-то такое видел) - они подгружались автоматом...

ну и закрыть такие линки в роботс чтоб не плодить дубли

Сейчас вот делаю смену вывода товаров с вида "один товар в строке" на "таблица 3 товара в строке", делаю через JS

Вверх страницы вставил мой селектор
Код:
<div class="catalog-item-view">
            <a title="Список" id="change-list" class="list selected" href="#" onclick="return false;"></a>
            <a title="Таблица" id="change-table" class="table" href="#" onclick="return false;"></a>
    </div>

шаблон категории отдает разметку всю как для вида "Список".

Клики обрабатываю на jquery
Код:
$('#change-list').click(function() {
    display('list');
});

$('#change-table').click(function() {
    display('grid');
});

Далее ввел функцию display(view) на JS - обработчик того что надо делать с хтмл-ом

полный текст ее приводить нет смысла, скажу только что лучше всего сразу сделать верстку так чтоб добавлением класса весь вид менялся, и не нужно было модифицировать DOM - если вы будете перемещать блок где кнопка "купить" - нужно делать реинициализацию скриптов повешенных на нее- я взял код от разработчика плагина аякс-фильтра )))
Код:
    SqueezeBox.assign($$('a.modal'), {parse: 'rel'});
    jQuery(document).ready(function($) {
      $('.orderlist-container').hover(
        function() { $(this).find('.order-list').stop().show()},
        function() { $(this).find('.order-list').stop().hide()}
      );
      Virtuemart.product($("form.product"));
      $("form.js-recalculate").each(function(){
        if ($(this).find(".product-fields").length) {
          var id= $(this).find('input[name="virtuemart_product_id[]"]').val();
          Virtuemart.setproducttype($(this),id);

        }
      });
    });

в ней меняю хтмл код "налету", и пишу в куки выбранное состояние:

$.cookie('display', 'list');

или

$.cookie('display', 'grid');


А потом запихал код
Код:
view = $.cookie('display');
if (view) {
    display(view);
} else {
    display('list');
}
для проверки какой вид выбрал пользователь, и грузим его при обновлении страницы или переходе по магазину. Для использования метода $.cookie надо подгрузить библиотеку jquery.cookie.js
 
А если попробовать так:
сделать ссылку вида
<a href="<?php echo JURI::current()?>?layout=table/list">
И в шаблон прописать 2 варианта событий

Код:
$layout = JRequest::getCmd('layout', 'table');
 
switch ($layout)
{
case 'table':
?>
код 1
<?php
case 'list':
?>
код 2
<?php
}
 
Здравствуйте, кто может в более понятной для начинающих форме объяснить, как решить эту задачу для Virtuemart 2?
 
Вопрос актуален на ВМ2.
Ну неужели нет подобного модуля?
 
Последнее редактирование:
Назад
Сверху