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

0 Пользователей и 1 Гость просматривают эту тему.
  • 37 Ответов
  • 5665 Просмотров
*

grishin

  • Осваиваюсь на форуме
  • ***
  • 145
  • 0
Необходимо в карточке товара вывести количество просмотров пользователями данного товара.
Существует ли такое дополнение.

*

Gruz

  • JComments Tester
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
Такой статистики 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, 22:11:54 от Gruz »
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

grishin

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

*

Gruz

  • JComments Tester
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
В 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, 22:12:12 от Gruz »
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

grishin

  • Осваиваюсь на форуме
  • ***
  • 145
  • 0
А код в шаблон вывода товара в таком виде вставить?

*

Gruz

  • JComments Tester
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
Не имеет значения.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

grishin

  • Осваиваюсь на форуме
  • ***
  • 145
  • 0
БД добавил
Вставил в 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
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
Знаешь сказку про кашу из топора?

У тебя в коде в первой строчке лишнее echo
Код
<?php echo 
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

grishin

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

*

grishin

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

*

grishin

  • Осваиваюсь на форуме
  • ***
  • 145
  • 0
И ещё возник вопрос, а как избежать накруток и что бы за один сеанс (сессию) только один просмотр засчитывался

*

Gruz

  • JComments Tester
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
Да, видимо про кашу из топора ты сказку знаешь отлично.

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

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

По поводу модуля, то, скорее всего, надо свой написать модуль. Вобщем-то не сложно, но и не 5 минут.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

baloon

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

*

Gruz

  • JComments Tester
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
Отложил в закладки. По свободе, может, гляну.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

baloon

  • Давно я тут
  • ****
  • 376
  • 13
Для вывода только цифры нужно вот так прописать, да?
Код
// берём объект БД, чтобы далее с ним работать
$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
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
Для вывода только цифры нужно вот так прописать, да?
Код
// берём объект БД, чтобы далее с ним работать
$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
Не получается. Не знаю, как правильно прописать?


А слова "Количество хитов" выводятся?
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

baloon

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

*

Gruz

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

Так попробуй.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

baloon

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


*

baloon

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

*

baloon

  • Давно я тут
  • ****
  • 376
  • 13
Не получает 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

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

*

baloon

  • Давно я тут
  • ****
  • 376
  • 13
А можно код вывода количества просмотров сделать проще, меньше?
Сейчас у меня такой код работает.
      $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
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
А можно код вывода количества просмотров сделать проще, меньше?

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

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

Это вряд ли нужно.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

baloon

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

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


*

Gruz

  • JComments Tester
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
Нет.
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, 21:51:24 от Gruz »
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

baloon

  • Давно я тут
  • ****
  • 376
  • 13
Много там ботов перечислено, а яндекса вроде нету.
Вот такой нашел, здесь (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
  • *
  • 1276
  • 163
  • gruz@jabber.org | gruz.org.ua
В эту функцию не сложно добавить яндекс: 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
}
Життя має дві форми - горіння і гниття!
-
Со мной на "ты"
-
Вам лень развёрнуто формулировать вопрос? Нам лень отвечать.
Правильный вопрос:
- Версии J! и проблемного расширения?
- Что хотел?
- Что пробовал?
- Что получилось и что не получилось?
- Какие были ошибки?

*

baloon

  • Давно я тут
  • ****
  • 376
  • 13
Вот так написал, правильно?
Вместо имени бота поставил 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);
}
?>