привет. в общем есть плагин и модуль на joomla. выводит последние просмотренные товары. но хранит инфу о них в сессии и при закрытии браузера или при обновлении сессии скидывает инфу. если бы он хранил всё в кукисах, то пользователь (теоретически), мог бы увидеть что просматривал год назад. нужен хотя бы совет (стаковерфлоу - не справился). код спрятал в спойлеры. загляните не поленитесь - для вас это может быть просто, а кто-то башку сломал... Спойлер: код плагина PHP: defined('_JEXEC') or die; class plgJshoppingproductsJshopping_last_visit_product extends JPlugin { function onBeforeDisplayProductView($view) { $session = JFactory::getSession(); $last_visited_products = $session->get('last_visited_products', array()); if (isset($last_visited_products[$view->product->product_id])) { unset($last_visited_products[$view->product->product_id]); } $product = new stdClass(); $product->name = $view->product->name; $product->orig_image = $view->product->image; $product->image = $view->product->image; $product->product_thumb_image = $view->product->product_thumb_image; $product->product_id = $view->product->product_id; $product->currency_id = $view->product->currency_id; $product->tax_id = $view->product->product_tax_id; $product->orig_product_price = $view->product->product_price; $product->product_price = $view->product->product_price; $product->product_old_price = $view->product->product_old_price; $product->min_price = $view->product->min_price; $product->different_prices = $view->product->different_prices; $product->product_manufacturer_id = $view->product->product_manufacturer_id; $product->vendor_id = $view->product->vendor_id; $product->delivery_times_id = $view->product->delivery_times_id; $product->label_id = $view->product->label_id; $product->category_id = $view->category_id; $last_visited_products[$product->product_id] = $product; $session->set('last_visited_products', $last_visited_products); } } Спойлер: код модуля PHP: defined( '_JEXEC' ) or die; if (!file_exists(JPATH_SITE.'/components/com_jshopping/jshopping.php')){ JError::raiseError(500,"Please install component \"joomshopping\""); } require_once JPATH_SITE.'/components/com_jshopping/lib/factory.php'; require_once JPATH_SITE.'/components/com_jshopping/lib/functions.php'; JSFactory::loadCssFiles(); JSFactory::loadLanguageFile(); $jshopConfig = JSFactory::getConfig(); $session = JFactory::getSession(); $count = $params->get('count_products', 5); $show_image = $params->get('show_image',1); $show_name = $params->get('show_name',1); $show_price = $params->get('show_price',1); $show_manufacturer = $params->get('show_manufacturer',1); $show_module = $params->get('show_module',1); $products = array(); $last_visited_products = array_reverse($session->get('last_visited_products', array())); $curent_product_id = JFactory::getApplication()->input->getInt('product_id'); foreach($last_visited_products as $product){ if ($product->product_id == $curent_product_id) { continue; } $product->product_price = $product->orig_product_price; $product->image = $product->orig_image; if (count($products) < $count) { $products[] = $product; } else { break; } } if (!count($products)) { return; } listProductUpdateData($products, 1); if (isset($jshopConfig->noimage)) { $noimage = $jshopConfig->noimage; } else { $noimage = 'noimage.gif'; } require JModuleHelper::getLayoutPath($module->module, $params->get('layout', 'default')); з.ы. всю инфу в кукисы прятать не надо (было такое предложение), достаточно спрятать $product_id, а по нему достать всё остальное.
Можно просто увеличить время жизни cookie которая отвечает за сессии и чтобы её файла на сервере по дольше не удалялись, ещё вариант перенести сессии из файлов в базу и тоже жизнь cookie с идентификатором сессии увеличить
1. увеличить время жизни cookie которая отвечает за сессии и чтобы её файла на сервере по дольше не удалялись, какой будет нагрузка на сервер при 500-1000 просмотров/день? 2. перенести сессии из файлов в базу это лучше или проще просто кукисов?
Возможно с этим и утюг справится. это проще так как ты хочешь скрыть https://secure.php.net/manual/en/session.customhandler.php https://secure.php.net/manual/en/function.session-set-save-handler.php https://github.com/sprain/PHP-MySQL-Session-Handler
Я про то что сервер даже слабый выдержит 500-1000 запросов в день. ага, но долго объяснять, я дал ссылки, по идее в них всё есть, логика такая, ты изменяешь поведение сессии, горя ей работать через твой класс, как это прописать и готовый код, всё по ссылкам, там есть example на github
я думал ветка называется «сделайте за меня»?! почему - найти ссылку - прислать - научить пользоваться - рассказать где лежит пример - обсудить сервер проще, чем изменить код (когда это «так просто»)?.. вопросов с этими ссылками больше чем ответов!
и будут годовалые сессии стадом лежать в папочке. Не профит Лучше авторизованному юзеру привязать инфу с бд что и почем а в куки хранить индификатор
и заставлять всех регаться?? эта тема для их удобства - типа, че я там смотрел только что? или - ого они запомнили что я смотрел прошлый раз! никто не будет для такого регаться - куки
ну так ещё не нашёл человек который сделает, я пока облегчил задачу и описал варианты с готовым кодом ну можно чистить, в базе легче это делать
нет. просто не уверен что понял смысл усложнения. насколько у меня получилось разобраться там будет один сплошной список, один для всех. каждый своим визитом/просмотром будет его только продлевать. но это насколько получилось. весьма вероятно что суть и не уловил. а еще - смутило, что автор сам лично этим не пользуется, т.к. решение толи старо, толи
мы переносим сессии в базу, которая лучше работает с диском и эффективнее нагружает его. смело можно увеличить жизнь сессии, в базе можно хранить миллионы записей и всё быстро будет работать. удалить записи из базу у которых нет можно будет 1 запросом и хоть каждый час. у тебя там вроде joomla, поищи компонент например для joomla session in mysql или настройку в самой joomla, при включении которой это делается из коробки --- Добавлено --- оно на mysqli которое поддерживается до сих пор, этого достаточно как минимум, определить как автор часто использует, можно спросить его
опять вопрос, ответьте пожалуйста (!!!), всё это проще обычных кукисы? Или кукисы очень сложно тут реализовать? просто глядя на документацию по кукисам и сессиям, у них есть точки пересечения...
сложнее, так как нужно будет писать код, а тут уже есть готовый, максимум один SQL запрос и поменять настройки сессии. Сессия хранится на сервере и к информации её есть доступ только у сервера, у пользователя в браузере только хранится cookie с идентификатором сессии и всё. Cookie хранятся у пользователя и всё содержимое ему доступно. По твоему вопросу, ты там что-то скрыть от пользователя хотел, значит нужно будет писать код, переделывать программу которая пишет сейчас в сессию. Так что проще сессии перенести в базу(код уже готов в example.php), увеличить срок их жизни и написать SQL запрос который будет удалять пустые сессии например.
@thctps 30.000 записей которые будут грубо говоря выбраться по id, то это совсем мало, чайник осилит.
видимо ты очень требовательный заказчик ))) хочется хранить в куке — храни. только имей в виду ограниченный размер куки. искусственно ограничивай длинну списка перед сохранением. расписывать бцквально по буквам не буду, оставлю радость творчества тебе. --- Добавлено --- @denis01если вопрос будет ставиться так, что список посещенных мест нужен не только пользователю, но и администрации, то конечно нужна база. а так, это лишняя зависимость, имхо. это персональные данные, которые нам нафиг не нужны.
Мужички, вопрос опять открыт. Его надо решать. Поменял немного код, получилось сохранить всё в базу, код ниже: Спойлер PHP: class plgJshoppingproductsJshopping_last_visit_product extends JPlugin { function onBeforeDisplayProductView($view) { $product_id = (int) $view->product->product_id; $session = JFactory::getSession(); $last_visited_products = $session->get('last_visited_products', array()); if (isset($last_visited_products[$view->product->product_id])) { unset($last_visited_products[$view->product->product_id]); } $product = new stdClass(); $product->name = $view->product->name; $product->product_thumb_image = $view->product->product_thumb_image; $product->product_id = $view->product->product_id; $product->orig_product_price = $view->product->product_price; $product->product_price = $view->product->product_price; $product->product_old_price = $view->product->product_old_price; $product->label_id = $view->product->label_id; $last_visited_products[$product->product_id] = $product; $session->set('last_visited_products', $last_visited_products); $db = JFactory::getDbo(); $query = "INSERT INTO `oewi4_jmb_jshopping_last_seen_products` (`product_id`, `time`, `data`)" . " VALUES ($product_id, NOW(), " . $db->quote(json_encode($last_visited_products)) . ")" . " ON DUPLICATE KEY UPDATE `time` = VALUES(`time`), `data` = VALUES(`data`)"; $db->setQuery($query); $db->execute(); } } Теперь при каждом новом просмотре появляется новая запись с $product_id, как связать ее с определенным пользователем???
Куки добавляешь пользователю идентификатор $product_id при добалвении новой записи в бд, а дальше при каждом вызове скрипта проверяешь по условию, если отсутствует или нету в БД строки, то добавляем новую запись и "то что в начале писал"
ок! PHP: $patch = "/"; if (JURI::base(true) != ""){ $patch = JURI::base(true); } setcookie('last_visited_products', session_id(), time() + 3600*24*30, $patch); что дальше?
Хорошо сказано! код: Спойлер PHP: class plgJshoppingproductsJshopping_last_visit_product extends Plugin { function onBeforeDisplayProductView($view) { $session = JFactory::getSession(); $last_visited_products = $session->get('last_visited_products', array()); if (isset($last_visited_products[$view->product->product_id])) { unset($last_visited_products[$view->product->product_id]); } $product = new stdClass(); $product->name = $view->product->name; $product->product_thumb_image = $view->product->product_thumb_image; $product->product_id = $view->product->product_id; $product->product_price = $view->product->product_price; $product->product_old_price = $view->product->product_old_price; $product->label_id = $view->product->label_id; $last_visited_products[$product->product_id] = $product; $session->set('last_visited_products', $last_visited_products); $patch = "/"; if (JURI::base(true) != ""){ $patch = JURI::base(true); } setcookie('last_visited_products', session_id(), time() + 3600*24*30, $patch); $inputCookie = JFactory::getApplication()->input->cookie; $cookie_id = $inputCookie->get('last_visited_products', null); $cookieExists = ($cookie_id === null); $db = JFactory::getDbo(); $query = "INSERT INTO `oewi4_jmb_jshopping_last_seen_products` (`product_id`, `time`, `data`)" . " VALUES (" . $db->escape($cookie_id) . ", NOW(), " . $db->quote(json_encode($last_visited_products)) . ")" . " ON DUPLICATE KEY UPDATE `time` = VALUES(`time`), `data` = VALUES(`data`)"; $db->setQuery($query); $db->execute(); } } результат: Спойлер ОШИБКА: 1054 Unknown column 'e9e066639d0d05e13cca3fcfdbf04a73' in 'field list' SQL=INSERT INTO `#__jmb_jshopping_last_seen_products` (`product_id`, `time`, `data`) VALUES (e9e066639d0d05e13cca3fcfdbf04a73, NOW(), '{\"310\":{\"name\": что дальше?