VM 2.x Закладки в карточке товара

Открываем используемый flypage (напомню что он находится по пути /components/com_virtuemart/themes/default/templates/product_details) и, в любом месте этого файла дописываем

Код:
global $mainframe;
$comments = $mosConfig_absolute_path . '/components/com_jcomments/jcomments.php';
if (file_exists($comments)) {
require_once($comments);
$count = JComments::getCommentsCount($product_id, 'com_virtuemart');
}
Хочу обратить ваше внимание что эти строчки нужно добавлять там, где это не попадет под действие тега if, но будет между тегов
Код:
<?php и ?>
Этим действием мы задаем переменной $count значение количества комментариев. Теперь нам необходимо эту переменную вывести там, где необходимо, таким образом:
Код:
echo $count;
Замечу, что это также нужно добавить там, где это не попадет под действие тега if, но будет между тегов
Код:
<?php и ?>

Это ведь интеграция Jcomments для Virtuemart 1.X. А тут немного по иному. Надо както разобраться со стандартным модулем VM 2 "reviews" . И както через ID вывести сумарное количество отзывов по товару.
 
Это ведь интеграция Jcomments для Virtuemart 1.X. А тут немного по иному. Надо както разобраться со стандартным модулем VM 2 "reviews" . И както через ID вывести сумарное количество отзывов по товару.
Попробуй эти варианты - сам еще не пробовал
Для просмотра ссылки Войди или Зарегистрируйся
Смотри посты 10 и 15

Тут вдруг возникла такая ерунда - в VM1.1 такого не было.
Как сделать активной первую вкладку для J2.5+VM2?
А то при перезагрузке страницы или переходе на новую - остается открыта та вкладка, которая была просмотрена последней в любом другом товаре.
Пробовал через CSS решить - не получилось((
PHP:
.tabs>dt:first-child + dd{
        display: block;
    }
 
Попробуй эти варианты - сам еще не пробовал
Для просмотра ссылки Войди или Зарегистрируйся
Смотри посты 10 и 15
Это уже чтото. но я не хочу использовать компонент jcomments, а хочу пользоваться стандартными "виртумартовскими отзывами и коментариями"
Вот код для jcomments чтобы выводило все коментарии по товару
PHP:
$count = JComments::getCommentsCount($this->product->virtuemart_product_id, 'com_virtuemart');
echo $count;
и еще такой вариант есть
PHP:
<?php
            $comments = JPATH_SITE . '/components/com_jcomments/jcomments.php';
  if (file_exists($comments)) {
    require_once($comments);
    $options = array();
    $options['object_id'] = $product->virtuemart_product_id;
    $options['object_group'] = 'com_virtuemart';
    $options['published'] = 1;
    $count = JCommentsModel::getCommentsCount($options);
    echo $count ? ('Комментарии ('. $count . ')') : 'Добавить комментарий';
  }
        ?>

А как это подреставрировать под стандартные коментарии VM2 чтобы выводило число всех коментариев по товару?
И действительно "Как сделать активной первую вкладку для J2.5+VM2?" пока ничего не получается(
 

PHP:
<?php
            $comments = JPATH_SITE . '/components/com_jcomments/jcomments.php';
  if (file_exists($comments)) {
    require_once($comments);
    $options = array();
    $options['object_id'] = $product->virtuemart_product_id;
    $options['object_group'] = 'com_virtuemart';
    $options['published'] = 1;
    $count = JCommentsModel::getCommentsCount($options);
    echo $count ? ('Комментарии ('. $count . ')') : 'Добавить комментарий';
  }
        ?>
(
Этот код выводит общее количество комментариев. Чтобы выводило комментарии конкретно по одному товару нужно код:
Код:
$options['object_id'] = $product->virtuemart_product_id;
заменить на
Код:
$options['object_id'] = $this->product->virtuemart_product_id;
 
Спасибо DeNdY7777777. Может ты знаешь как сделать самую первую Закладку в карточке товара Текущей. А то если я за шел в товар и вошел во вкладку "Фото", а потом открываю другой товар, то открыта будет та вкладка , которая открывалась последней в предыдущем товаре. А вот хотелосьбы чтобы всегда при открывании любого товара, открыта была первая закладка (например "Описание"). Помогите...
 
Код этот тоже нормально работает
PHP:
$count = JComments::getCommentsCount($this->product->virtuemart_product_id, 'com_virtuemart');
echo $count;
 
вот скрипт Вкладок. components\com_virtuemart\assets\js\vmtabs.js
PHP:
function vm2tabs(pages) {
 
    pages.addClass("dyn-tabs");
    pages.first().show();
 
    var tabNavigation = jQuery('<ul id="tabs" />').insertBefore(pages.first());
 
    pages.each(function() {
        var listElement = jQuery("<li />");
        var label = jQuery(this).attr("title") ? jQuery(this).attr("title")
                : "Kein Label";
        listElement.text(label);
        tabNavigation.append(listElement);
    });
 
    var items = tabNavigation.find("li");
    items.first().addClass("current");
   
    items.click(function() {       
        items.removeClass("current");
        jQuery(this).addClass("current");
        pages.hide();
        pages.eq(jQuery(this).index()).fadeIn(200);
    });
 
}
 
jQuery(document).ready(function() {
 
    vm2tabs(jQuery("#ui-tabs .tabs"));
 
});

как сделать так чтобы первая вкладка(тоесть Описание)была всегда текущей.?чтобы при открытии товара именно она была всегда открыта
 

Это ведь интеграция Jcomments для Virtuemart 1.X. А тут немного по иному. Надо както разобраться со стандартным модулем VM 2 "reviews" . И както через ID вывести сумарное количество отзывов по товару.
Вот добрались руки и до встроенных отзывов.
Во вкладках, где выводим модуль отзывов пишем:
Код:
$output .= $myTabs->startPanel(''.$this->loadTemplate('countreview'), 'tab5' );
$output  .= '<div>'.$this->loadTemplate('reviews').'</div>';
где Template ('countreview') - отдельный файл из папки productdetails. Выглядит приблизительно так:
Код:
<?php
 
// Check to ensure this file is included in Joomla!
defined ('_JEXEC') or die ('Restricted access');
 
$i = 0;
if ($this->rating_reviews) {
    foreach ($this->rating_reviews as $review) {
        if (!empty($this->rating_reviews) && $review->published) {
            $i=$i+1;
        }
    }
}
 
if ($i<20) {
    if ($i==0) {
        ?>
        <span class="vote"><?php echo JText::_('Нет отзывов') ?></span>
        <?php
    } elseif ($i==1) {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзыв') ?></span>
        <?php
    } elseif ($i>1 and $i<5) {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзыва') ?></span>
        <?php
    } else {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзывов') ?></span>
        <?php
    }
} elseif ($i>19) {
    $y=10;
    $r=fmod ($i,$y);
    if ($r==1) {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзыв') ?></span>
        <?php
    } elseif ($r>1 and $r<5) {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзыва') ?></span>
        <?php
    } else {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзывов') ?></span>
        <?php
    }
} elseif ($i>100){
    $z=100;
    $y=10;
    $l=fmod ($i,$z);
    $r=fmod($l,$y);
    if ($r==1) {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзыв') ?></span>
        <?php
    } elseif ($r>1 and $r<5) {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзыва') ?></span>
        <?php
    } else {
        ?>
        <span class="vote"><?php echo $i. JText::_(' отзывов') ?></span>
        <?php
    }
}
?>
<br/>
Прошу прощения, если криво написано, я не программер, но главное что все работает.
В результате выводит кол-во отзывов так: "1 отзыв", "2 отзыва", "5 отзывов", "32 отзыва", "547 отзывов"...
forum1.gif

Подобным образом осуществлен и вывод рейтинга под фото:
Код:
//rating
if ($this->showRating) {
    $maxrating = VmConfig::get('vm_maximum_rating_scale', 5);
        $ratingwidth = $this->rating->rating * 24; //I don't use round as percetntage with works perfect, as for me
        ?>
        <span title=" <?php echo (JText::_("COM_VIRTUEMART_RATING_TITLE") . round($this->rating->rating) . '/' . $maxrating) ?>" class="ratingbox" style="display:inline-block;">
                <span class="stars-red" style="width:<?php echo $ratingwidth.'px'; ?>">
                </span>
                </span>
                      <span class="reviews_count">
            <?php
            echo $this->loadTemplate('countreview');
            ?>
            </span>
            <?php
}
?>
forum.gif
 
Нашел решение - как сделать активной первую вкладку на joomlaforum - пока тестирую :
Поганял в IE9, Opera, Chrome, Mozilla Firefox, Yandex - вроде нормально работает. :yahoo:

Корректируем файл tabs.js в папке \media\system\js
Начиная со строки 45 комментируем кусок кода:
PHP:
if (this.options.useStorage) {
    if (Browser.Features.localstorage) {
        this.options.display = localStorage[this.storageName];
    } else {
        this.options.display = Cookie.read(this.storageName);
    }
}

Теперь при перезагрузке страницы - первая вкладка открыта и при переходе на страницу другого товара - тоже первая вкладка.
 
Кстати, выложу тут решение проблемы с отображением звезд в табах в ИЕ, может кому пригодится.
Если в табах выводить родные VM отзывы, то возникает конфликт скриптов mootools и JQuery. В ИЕ и в браузерах на Android (то что увидел) при наведении на 5 звезду, их выводится еще штук 20.
Для решения проблемы в файле ..components/com_virtuemart/views/productdetails/tmpl/default_reviews.php нужно код
Код:
function refresh_counter() {
                    var form = document.getElementById('reviewform');
                    form.counter.value= form.comment.value.length;
                }
                jQuery(function($) {
                    var steps = " . $maxrating . ";
                    var parentPos= $('.write-reviews .ratingbox').position();
                    var boxWidth = $('.write-reviews .ratingbox').width();// nbr of total pixels
                    var starSize = (boxWidth/steps);
                    var ratingboxPos= $('.write-reviews .ratingbox').offset();
 
                    $('.write-reviews .ratingbox').mousemove( function(e){
                        var span = $(this).children();
                        var dif = e.pageX-ratingboxPos.left; // nbr of pixels
                        difRatio = Math.floor(dif/boxWidth* steps )+1; //step
                        span.width(difRatio*starSize);
                        $('#vote').val(difRatio);
                        //console.log('note = ', difRatio);
                    });
                });
заменить на
Код:
function refresh_counter() {
                    var form = document.getElementById('reviewform');
                    form.counter.value= form.comment.value.length;
                }
                jQuery(function($) {
                    var steps = " . $maxrating . ";
                    var parentPos= $('.write-reviews .ratingbox').position();
                    var boxWidth = $('.write-reviews .ratingbox').width();// nbr of total pixels
                    var starSize = (boxWidth/steps);
                    var ratingboxPos= $('.write-reviews .ratingbox').offset();
                    var ratingbox= $('.write-reviews .ratingbox')
 
                    $('.write-reviews .ratingbox').click( function(e){
                        var span = $(this).children();
                        var dif = Math.floor(e.pageX-ratingbox.offset().left); // nbr of pixels
                        difRatio = Math.floor(dif/boxWidth* steps )+1; //step
                        span.width(difRatio*starSize);
                        $('#vote').val(difRatio);
                        //console.log('note = ', difRatio);
                    });
                });
Теперь количество выбранных звезд будет нормально отображаться и меняться только при клике на одной из них.
 
Назад
Сверху