Форум русской поддержки Joomla!® CMS
06.12.2016, 10:02:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Количество просмотров товара VirtueMart Существует?

 (Прочитано 5046 раз)
0 Пользователей и 1 Гость смотрят эту тему.
grishin
Осваиваюсь на форуме
***

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

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



« : 20.05.2011, 17:08:12 »

Необходимо в карточке товара вывести количество просмотров пользователями данного товара.
Существует ли такое дополнение.
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #1 : 20.05.2011, 18:45:06 »

Такой статистики VM не ведёт.
Но во флайпедж врезку сделать не сложно.
Создать таблицу в БД из двух колонок - id товара и колличество хитов.
При отображении флайпейджа вытягивать количество, выводить, добавлять и вставлять назад.

Скажем таблица
product_id  | hits

Код:
// берём объект БД, чтобы далее с ним работать
$db =& JFactory::getDBO();
// выбираем запись нашего товара
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$product_id.'"';
// передаём в объёкт запрос
$db->setQuery($query);
// загружаем результаты запроса
$stats = $db->loadObject();

// выводим текст
echo "Количество хитов: ".$stats->hits;
// увеличиваем значение
$stats->hits = $stats->hits+1;
// запрос - удаляем старую запись
$query = 'DELETE FROM #__vm_mycounyter  WHERE product_id = "'.$product_id.'"';
// передаём в объёкт запрос
$db->setQuery($query);
// выполняем запрос на удаление
$db->query();
// создаём новую такую же, но больше
$query = "INSERT INTO #__vm_mycounyter (`product_id`, `hits`) VALUES ('".$product_id."', '".$stats->hits."')";
// передаём в объёкт запрос
$db->setQuery($query);
// выолняем запрос
$db->query();
// освобождаем память
unset($db);

Писал тут, так что могут быть ошибки. Поиграйся, чтобы исправить.
При включенном системном плагине кеширования может не учитываться, надо проверять. Тогда это надо в другом месте ставить, с использованием user_class.

При удалении товара таблица не будет уменьшаться, это тоже минус. Но плюс, что в ядро магазина лезть не надо.
« Последнее редактирование: 20.05.2011, 20:11:54 от Gruz » Записан
grishin
Осваиваюсь на форуме
***

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

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



« Ответ #2 : 20.05.2011, 19:55:40 »

Спасибо ОГРОМНОЕ за помощь.
А можно описать по шагам, модификацию?
1-Какой запрос SQL выполнить на создание таблиц? или с какими параметрами они должны быть?
2-Куда вставлять этот код
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #3 : 20.05.2011, 20:01:59 »

В phpMyAdmin несложно руками добавить, не надо для этого запросы писать.

Вот так создастся таблица

Код:
CREATE TABLE IF NOT EXISTS `jos_vm_mycounyter` (
  `product_id` int(11) NOT NULL,
  `hits` int(11) NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

« Последнее редактирование: 20.05.2011, 20:12:12 от Gruz » Записан
grishin
Осваиваюсь на форуме
***

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

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



« Ответ #4 : 20.05.2011, 20:12:31 »

А код в шаблон вывода товара в таком виде вставить?
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #5 : 20.05.2011, 20:14:46 »

Не имеет значения.
Записан
grishin
Осваиваюсь на форуме
***

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

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



« Ответ #6 : 20.05.2011, 21:37:41 »

БД добавил
Вставил в flypage.tpl
Код:
<?php echo
 // берём объект БД, чтобы далее с ним работать
$db =& JFactory::getDBO();
// выбираем запись нашего товара
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$product_id.'"';
// передаём в объёкт запрос
$db->setQuery($query);
// загружаем результаты запроса
$stats = $db->loadObject();

// выводим текст
echo "Количество хитов: ".$stats->hits;
// увеличиваем значение
$stats->hits = $stats->hits+1;
// запрос - удаляем старую запись
$query = 'DELETE FROM #__vm_mycounyter  WHERE product_id = "'.$product_id.'"';
// передаём в объёкт запрос
$db->setQuery($query);
// выполняем запрос на удаление
$db->query();
// создаём новую такую же, но больше
$query = "INSERT INTO #__vm_mycounyter (`product_id`, `hits`) VALUES ('".$product_id."', '".$stats->hits."')";
// передаём в объёкт запрос
$db->setQuery($query);
// выолняем запрос
$db->query();
// освобождаем память
unset($db);?>

Полностью слетело форматирование и выдало ошибку
Catchable fatal error: Object of class JDatabaseMySQL could not be converted to string in Z:\home\site\www\components\com_virtuemart\themes\default\templates\product_details\flypage.tpl.php on line 63
Вот эта строчка $db =& JFactory::getDBO();
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #7 : 21.05.2011, 00:05:47 »

Знаешь сказку про кашу из топора?

У тебя в коде в первой строчке лишнее echo
Код:
<?php echo
Записан
grishin
Осваиваюсь на форуме
***

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

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



« Ответ #8 : 21.05.2011, 00:12:48 »

Все получилось)) спасибо огромное, количество хитов(просмотров выводит)
Можно ещё спросить?)
А как в разделе вывести десятку самых просматриваемых товаров этого раздела или всего магазина? под надписью "Недавно просмотренные товары"
1 - Товар1 - 9566 просмотров
2 - Товар4 - 8654 просмотров
3 - Товар5 - 3211 просмотров
.....
Это сложно реализовать?
« Последнее редактирование: 21.05.2011, 00:24:13 от grishin » Записан
grishin
Осваиваюсь на форуме
***

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

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



« Ответ #9 : 21.05.2011, 00:17:55 »

А если в таблице от 1000товаров это сильно нагрузит БД, сервер?
Записан
grishin
Осваиваюсь на форуме
***

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

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



« Ответ #10 : 21.05.2011, 00:23:43 »

И ещё возник вопрос, а как избежать накруток и что бы за один сеанс (сессию) только один просмотр засчитывался
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #11 : 21.05.2011, 00:29:26 »

Да, видимо про кашу из топора ты сказку знаешь отлично.

Далее уже не каша, а сервированный стол требуется с блюдами из кухонь разных народов.

Всё это можно реализовать, но уже не так просто. Я сходу не знаю. Копай сам по поводу сессии.
http://docs.joomla.org/JSession/1.5
В сессию добавлять значение, что уже был просмотр. И потом проверять, есть ли такое значение в сессии.

По поводу модуля, то, скорее всего, надо свой написать модуль. Вобщем-то не сложно, но и не 5 минут.
Записан
baloon
Давно я тут
****

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

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



« Ответ #12 : 01.11.2011, 11:56:59 »

Нужно тоже самое что ТС, но в админке. Пробовал нифига не получилось. Подскажите правильный код в адмику.
Надо в файл administrator\components\com_virtuemart\html\product.product_list.php
прописать вывод, а в файл карточки товара на сайте код сбора статистики, так?
Можно подробней?
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #13 : 01.11.2011, 13:22:20 »

Отложил в закладки. По свободе, может, гляну.
Записан
baloon
Давно я тут
****

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

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



« Ответ #14 : 27.01.2012, 10:54:41 »

Для вывода только цифры нужно вот так прописать, да?
Код:
// берём объект БД, чтобы далее с ним работать
$db =& JFactory::getDBO();
// выбираем запись нашего товара
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$product_id.'"';
// передаём в объёкт запрос
$db->setQuery($query);
// загружаем результаты запроса
$stats = $db->loadObject();
// выводим текст
echo "Количество хитов: ".$stats->hits;
// освобождаем память
unset($db);

Я пытаюсь это вывести в админке, файлы administrator\components\com_virtuemart\html\product.product_list.php
Не получается. Не знаю, как правильно прописать?
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #15 : 27.01.2012, 16:13:16 »

Для вывода только цифры нужно вот так прописать, да?
Код:
// берём объект БД, чтобы далее с ним работать
$db =& JFactory::getDBO();
// выбираем запись нашего товара
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$product_id.'"';
// передаём в объёкт запрос
$db->setQuery($query);
// загружаем результаты запроса
$stats = $db->loadObject();
// выводим текст
echo "Количество хитов: ".$stats->hits;
// освобождаем память
unset($db);

Я пытаюсь это вывести в админке, файлы administrator\components\com_virtuemart\html\product.product_list.php
Не получается. Не знаю, как правильно прописать?


А слова "Количество хитов" выводятся?
Записан
baloon
Давно я тут
****

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

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



« Ответ #16 : 27.01.2012, 16:36:54 »

А слова "Количество хитов" выводятся?
Неа. Выдает ошибку
Код:
Fatal error: Call to undefined method JDatabaseMySQL::f() in administrator\components\com_virtuemart\html\product.product_list.php on line 342
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #17 : 27.01.2012, 16:40:36 »

Код:
// берём объект БД, чтобы далее с ним работать
$db1 =& JFactory::getDBO();
// выбираем запись нашего товара
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$product_id.'"';
// передаём в объёкт запрос
$db1->setQuery($query);
// загружаем результаты запроса
$stats = $db1->loadObject();
// выводим текст
echo "Количество хитов: ".$stats->hits;
// освобождаем память
unset($db1);

Так попробуй.
Записан
baloon
Давно я тут
****

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

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



« Ответ #18 : 27.01.2012, 16:54:49 »

Так попробуй.
Теперь без ошибок выводит. Но выводит число просмотров товара с product_id 0
В таблицы vm_mycounyter от куда-то появился такой продукт сразу после ее создания.
Надо чтобы выводилось число просмотров каждого продукта.
product_id видимо неправильно получает. Или не там прописан код.
Записан
beagler
Moderator
*****

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

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


beagler dot ru


« Ответ #19 : 27.01.2012, 16:57:29 »

только не удивляйтесь цифрам - боты тоже будут считаться
Записан
baloon
Давно я тут
****

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

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



« Ответ #20 : 27.01.2012, 17:55:09 »

только не удивляйтесь цифрам - боты тоже будут считаться
Да. Но это можно исправить. Это потом.
Сейчас надо сделать так, чтобы все работало!
Как прописать product_id чтобы правильно выводилось - для каждого товара свое число просмотров?
« Последнее редактирование: 27.01.2012, 18:16:51 от baloon » Записан
baloon
Давно я тут
****

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

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



« Ответ #21 : 27.01.2012, 18:46:53 »

Не получает id товара видимо.
Вот эта строка
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$product_id.'"';
Вот как получает id ниже по коду в файле administrator\components\com_virtuemart\html\product.product_list.php
$listObj->addCell( $db->f('product_id') );

Можно ли привести первую строку кода в соответствие со второй?
Записан
baloon
Давно я тут
****

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

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



« Ответ #22 : 27.01.2012, 19:10:24 »

Вот так работает
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$db->f('product_id').'"';
Записан
baloon
Давно я тут
****

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

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



« Ответ #23 : 27.01.2012, 19:14:49 »

А можно код вывода количества просмотров сделать проще, меньше?
Сейчас у меня такой код работает.
      $db1 =& JFactory::getDBO();
      $query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$db->f('product_id').'"';
      $db1->setQuery($query);
      $stats = $db1->loadObject();
      $tmp_cell .= 'Просмотров:' .$stats->hits;
      unset($db1);
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #24 : 27.01.2012, 19:28:18 »

А можно код вывода количества просмотров сделать проще, меньше?

Нет. Вынеси код в функцию и её вызывай, будет нагляднее, возможно. Но строк кода от этого минимум на 3 прибавится в файле.

Код:
$tmp_cell .= 'Просмотров:' .$stats->hits;

Это вряд ли нужно.
Записан
baloon
Давно я тут
****

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

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



« Ответ #25 : 27.01.2012, 19:39:29 »

Нет. Вынеси код в функцию и её вызывай, будет нагляднее, возможно. Но строк кода от этого минимум на 3 прибавится в файле.
Тогда не надо. Спасибо за код! Azn  Я php не знаю, долго мучился бы.
Это вряд ли нужно.
Иначе число выводиться где-то не там где надо. Там структура файла такая, все через $listObj и $tmp_cell выводится.

А против ботов не дописывали код?

Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #26 : 27.01.2012, 19:43:28 »

Нет.
http://www.google.com.ua/search?q=php+check+if+bot&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:uk-UA:official&client=firefox-a

Найти функцию проверки, и на странице товара запись в БД загнать в условие - если не бот.

По-моему, первый линк самое оно: http://neo22s.com/function-to-check-if-visitor-is-a-bot/

С рекомендацие в коментах считать ботом, если $_SERVER['HTTP_USER_AGENT'] пусто.

Кроме того реализовать, то, что описано здесь: http://joomlaforum.ru/index.php/topic,165454.msg893338.html#msg893338

Да-да, ты не знаешь PHP. На таких задачах легче всего и научиться.
« Последнее редактирование: 27.01.2012, 19:51:24 от Gruz » Записан
baloon
Давно я тут
****

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

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



« Ответ #27 : 27.01.2012, 23:53:44 »

Много там ботов перечислено, а яндекса вроде нету.
Вот такой нашел, здесь (http://wp-kama.ru/id_55/schitaem-kolichestvo-posescheniy-stranits-na-wordpress.html)
Вот антибот от туда
Код:
        if(){ 
            $useragent = $_SERVER['HTTP_USER_AGENT']; 
            $notbot = "Mozilla|Opera"; //Chrome|Safari|Firefox|Netscape - все равны Mozilla 
            $bot = "Bot/|robot|Slurp/|yahoo"; //Яндекс иногда как Mozilla представляется 
            if ( !preg_match("/$notbot/i", $useragent) || preg_match("!$bot!i", $useragent) ) 
        } 
Нормальный?
Только я не знаю как его прикрутить. Если бы можно было сразу проверить...

А сессии пока думаю не надо. Да и... покупатель посмотрел товар, потом другие, потом опять вернулся к этому товару, а его не засчитает, но ведь раз вернулся, значит понравился, значит надо еще +1. Счетчик ведь надо для определения какие товары больше смотрят.

Кстати в Joomla есть ведь счетчик, показывает хиты просмотров статей. Наверное достаточно было бы его прикрутить к товарам. Я попробовал быстренько копнуть, но нифига не понял и оставил.
Записан
Gruz
JComments Tester
*

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

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


gruz@jabber.org | gruz.org.ua


« Ответ #28 : 28.01.2012, 00:09:56 »

В эту функцию не сложно добавить яндекс: http://neo22s.com/function-to-check-if-visitor-is-a-bot/

Как узнать Яндекс?
http://www.google.com/search?q=php+%D1%83%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+yandex&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:uk-UA:official&client=firefox-a

http://zalex.info/script/post1187914199-6.html


В коде ставляешь ту функцию, из первого линка. Но смотри, чтобы у тебя функция не был в середине другой функции. Можешь её сделать методом класса. Это основы синтаксиса PHP, не сложно понять.

Тогда  в коде, если функция глобальна, проверяшь
Код:
if (!is_bot()) {
  //тут код, который заганяет в БД +1
}

Если ты функцию is_bot сделал методом класса, то
Код:
if (!$this->is_bot()) {
  //тут код, который заганяет в БД +1
}
Записан
baloon
Давно я тут
****

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

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



« Ответ #29 : 29.01.2012, 17:35:06 »

Вот так написал, правильно?
Вместо имени бота поставил Opera и при посещение страницы через оперу счетчик не засчитывает.

Код:
<?php
function is_bot(){
$botlist = array("Yahoo Slurp", "WebAlta", "Yandex", "StackRambler",
"Teoma", "alexa", "froogle", "Gigabot", "inktomi",
"looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
"Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
"crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
"msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
"Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
"Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
"Butterfly","Twitturls","Me.dium","Twiceler");
 
foreach($botlist as $bot){
if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
return true; // Is a bot
}
return false; // Not a bot
}

if (!is_bot()) {
$db =& JFactory::getDBO();
$query = 'SELECT * from #__vm_mycounyter WHERE product_id="'.$product_id.'"';
$db->setQuery($query);
$stats = $db->loadObject();
$stats->hits = $stats->hits+1;
$query = 'DELETE FROM #__vm_mycounyter  WHERE product_id = "'.$product_id.'"';
$db->setQuery($query);
$db->query();
$query = "INSERT INTO #__vm_mycounyter (`product_id`, `hits`) VALUES ('".$product_id."', '".$stats->hits."')";
$db->setQuery($query);
$db->query();
unset($db);
}
?>
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | 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