Здравствуйте, уважаемые. Ситуация такова При добавлении товара в корзину, в сессию пишется массив переменных для него. Задача в том, что при открытии страницы посетителем его корзина была уже заполненной. А посетитель удалил бы ненужные (воля заказчика). Для этого в сессии должны быть данные по всем товарам (их не много). Я подумал, что можно было бы самому набрать корзину и сохранить эту сессию в файл как шаблон для сессий при заходе посетителя. А для новых посетителей создавать сессию и загружать в неё данные из такого шаблона. Но я как нуб не уверен, что это технически возможно. В сети крайне мало примеров по работе с SessionHandler, увы.
Опиши задачу без своих догадок как ты это собираешся сделать. Просто напиши с точи зрения пользователя, без терминов вроде "сессия", "массив" и т.д.
посетитель заходит на страницу со списком товаров в левой колонке витрина с товарами, в правой содержимое корзины. Надо что бы изначально все товары были уже в корзине - без кликов по кнопке "Добавить" под каждым товаром.
Я хочу сделать дамп такой сессии. И при создании новой сессии новым посетителем помещать в неё дамп образцовой.
1. Корзина через сессии сделана? Если да - то $_SESSION['cart'] = ..... какой то код, наполняющий корзину если товары в БД, то делать какие то файлы дампов не имеет смысла.. так как данные надо брать свежие .. из БД
И такой момент: посетитель положил товар в корзину по одной цене, прошло обновление цен, в базе изменились цены, какова предполагается реакция корзины?
пробую, но спотыкаюсь. Подскажите почему ругается на строку 4 в этом массиве: syntax error, unexpected token "[", expecting ")" ? Вроде по вложенности всё верно Код (Text): Array ( [qt] => 2 [data] => Array ( [0] => stdClass Object ( [teg] => input[text] [custom] => class="d-none" [hide] => [math] => 340000 [label] => Сервер для малого предприятия DELL R730 [fieldid] => 12.7 [value] => 0 ) [1] => stdClass Object ( [teg] => calculatorSum [pos] => 1 [unit] => ₽ [fixed] => 0 [format] => 0 [class] => d-none [label] => [fieldid] => 12.3 [hide] => 1 ) ) [sum] => Array ( [0] => Array ( [0] => 340000 [1] => stdClass Object ( [teg] => calculatorSum [pos] => 1 [unit] => ₽ [fixed] => 0 [format] => 0 [class] => d-none [label] => [fieldid] => 12.3 [hide] => 1 ) ) ) [project] => stdClass Object ( [id] => 5 [access] => [published] => 1 [title] => Сервер для малого предприятия DELL R730 [params] => stdClass Object ( [cssform] => [jsform] => qf3.js [modal] => 0 [modallink] => [ajaxform] => 1 [qfkeepalive] => 1 [autocomplete] => off [thnq_message] => Спасибо за ваш заказ. Наш менеджер свяжется с вами в ближайшее время. [toemail] => [subject] => [tmpl] => default [showtitle] => 1 [showurl] => 0 [start_text] => [final_text] => [calculatortype] => default [calcformula] => [history] => 1 [cartimglink] => ) [language] => [hits] => 0 [calculated] => 1 ) )
print_r() на выходе даёт неисполняемый код, var_export(). Ты язык вообще не знаешь, синтаксис массивов?
Ну добавляй в сессию все товары (только не все на складе , а по одной штуке, например, т.е. все номенклатуры) по кнопке «Купить» и т.п. Можно и прямо в корзине это делать. Типа если сессия не существует, то отобразить все (а реально добавите в сессию при первом удалении; по GET добавлять не надо). --- Добавлено --- При обработке заказа аналогично: нет сессии – полный пакет. Или различайте параметры кнопки заказа в корзине для полного и неполного пакетов. --- Добавлено --- P.S. Если сессия «стартует» безусловно, можно говорить о пустой/непустой сессии, только добавляйте в нее какой-нибудь флажок, а то после удаления последнего товара, корзина НЕОЖИДАННО снова окажется полностью наполненной. Типа раз пришел, надо чЁ-то купить И лучше сразу всё
Спасибо за помощь! В итоге сделал так: Код (Text): $ssess = $_SESSION; $ssesser = serialize($ssess); file_put_contents( '/path/allinser.php', $ssesser); // разово записал полную корзину if ( !session_id() ) { $saved = file_get_contents( '/path/allinser.php' ); session_start(); $saved = unserialize( $saved ); $_SESSION = $saved; } Всё работает ) Позволяет потом изменять содержимое корзины
id у сессий разные есессно, а содержимое - да, для всех посетителей одинаковое. Это лэндинг, там 6 товаров всего.
Ну не стоит так ярлыки-то вешать, не разобравшись. Это пакетное предложение, состоящее из 6 позиций. Почему корзина не может быть одинаковой для всех? Посетитель видит её содержимое справа. Может удалить позиции, может изменить кол-во того или иного товара. Это требование заказчика. Только потом давит "Отправить" Есессно каждый посетитель управляет собственной корзиной
@hitower, понял, но набивать сессию и сохранять в файл при каждом хите по страницам сайта не есть оптимальное решение.
Нет, вы не так поняли. Сессию я сохранил 1 раз - она стала шаблоном для всех новых сессий. Этот шаблон загружается только когда открывается новая сессия.
Из кода в посте https://php.ru/forum/threads/zapis-sessii-v-fajl-i-chtenie-iz-nego.100376/#post-658815 сессия сохраняется в файл безусловно, дальше бодаться будем?
Зачем тебе обязательно в файле хранить, что-то там серилизовать/десерилозовать. При первом старте сессии из кода положи туда нужные товары. Что-то вроде PHP: session_start(); if (!($_SESSION["filled"] ?? false)) { $_SESSION["products"] = [......]; $_SESSION["filled"] = true; }
Код тоже можно вынести в отдельный файл, и не парить мозг сериализациями PHP: // session_products.php return [......]; PHP: $_SESSION["products"] = require("session_products.php"); Вместо сериализации используй var_export, он даёт корректный код