За последние 24 часа нас посетили 206668 программистов и 2231 робот. Сейчас ищут 1464 программиста ...

Форма подписки один раз за сессию

Тема в разделе "PHP для новичков", создана пользователем zevilz, 3 сен 2012.

  1. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    На сайте на любой странице через определенный промежуток времени выезжает форма подписки в виде div контейнера. Как сделать так, чтобы при закрытии этой формы она больше не появлялась в течение текущей сессии? И каким образом лучше реализовать закрытие этой формы при нажатии, например, на кнопку?
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну так запиши в сессию при закрытии формы какую-нибудь переменную-флаг, говорящую о том, что форма была закрыта. И в скриптах проверяй - если есть эта переменная - то форму не отображать.
     
  3. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    а как в сессию переменную добавить? Я как понимаю это массив $_SESSION? С сессиями еще не связывался:)
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
  5. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Спасибо, будем осваивать)

    Добавлено спустя 38 минут 55 секунд:
    Блин, как кнопку "закрыть" сделать? не работает и все...

    Добавлено спустя 7 минут 44 секунды:
    Кнопка "Закрыть", как я понял реализуется с помощью js, а сессии при помощи php. Как вот здесь поступить тоже понять не могу
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    На JavaScript пишешь функцию, которую потом вызываешь при нажатии на кнопку "Закрыть". Эта функция должна убрать с экрана твою форму и отправить Ajax-запрос на сервер. Получив этот запрос, сервер должен записать в $_SESSION информацию о том, что форма была закрыта и при последующих перезагрузках страницы (в течении данной сессии) - не генерировать HTML-код этой формы.
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  8. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Форма подписки с кнопкой закрытия:

    Код (Text):
    1. if ($_SESSION[status] == '1') {
    2. echo '<a id="subscribeWindowClose"><img src="http://'.$_SERVER['SERVER_NAME'].'/img/cross.png"></a>
    3. <div id="subscribe">
    4. ...
    5. </div>';}
    Скрипт, который скрывает контейнер при нажатии на кнопку и отправляет данные обработчику:
    Код (Text):
    1. $('#subscribeWindowClose').click(function(){
    2.     $('#subscribe').addClass('display_none');
    3. $.post('http://mysite.net/s.php',{status:"1"}, ...
    Обработчик начинает сессию, устанавливает параметры сессии и заносит в переменную $_SESSION["status"] единицу:
    Код (Text):
    1. session_start();
    2. session_set_cookie_params(0, '/', $_SERVER['SERVER_NAME']);
    3. if ($_POST) {$_SESSION['status'] = $_POST["status"];}
    Проблемы:
    1. Если кнопку закрытия засунуть в контейнер #subscribe, то она не работает. А так она получается всегда будет висеть на странице.
    2. При закрытии страницы/браузера сессия не очищается. В $_SERVER['status'] так и стоит единица.
    Где я накосячил?
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Это странно. По идее - должно быть пофигу. Должна работать. Покажи код, который получается, когда засовываешь кнопку в контейнер #subscribe
    session_set_cookie_params() должна вызывать ДО session_start().
    Под закрытием браузера ты что понимаешь - именно полностью закрыл весь браузер, или только вкладку? Если только вкладку закрыть, то кука не удалится. Только если совсем браузер закрыть.
     
  10. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Код (Text):
    1. <div id="subscribe"><a id="subscribeWindowClose"><i mg src="http:// '.$_SERVER['SERVER_NAME'].'/img/cross.png"></a> . . . </div>
    Под закрытием браузера я понимаю понимаю закрытие браузера. А если через .htaccess настроить время жизни cookie, то это применится вообще ко всем cookie сайта или можно указать к каким именно?
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    zevilz, начни с самых простых тестов какие сумеешь придумать для отладки.
    для сессии с "флажком" в принципе не требуются ни js ни htaccess. когда научишься работать с сессией, тогда будешь добавлять фишки.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А что за тег такой i mg?

    Добавлено спустя 1 минуту 27 секунд:
    А также после http:// там пробел не нужен.
     
  13. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    это я на телефоне копировал со своего поста. Там между всеми символами пробелы автоматом были поставлены. Видимо не все удалил.

    Добавлено спустя 1 минуту 12 секунд:
    в самом коде нет этих ошибок

    Добавлено спустя 12 минут 33 секунды:
    А как тогда это осуществить? Для закрытия контейнера все равно необходим js(если без перезагрузки страницы). Так же для отправки флажка необходим запрос к базе либо занесение данных в cookie. А это только через php или js. При использовании только php возможно только с перезагрузкой страницы. Так как же Вы предлагаете сделать без js?
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Только что проверил. Вот такой код работает:
    Код (Text):
    1. <!DOCTYPE html>
    2. <html>
    3.     <head>
    4.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5.         <title>Test</title>
    6.         <script type="text/javascript" src="jquery.js"></script>
    7.         <script type="text/javascript">
    8.             $(document).ready(function() {
    9.                 $('#subscribeWindowClose').click(function() {
    10.                     $('#subscribe').addClass('display_none');
    11.                     $.post('s.php', {status: '1'});
    12.                 });
    13.             });
    14.         </script>
    15.         <style type="text/css">
    16.             .display_none {
    17.                 display: none;
    18.             }
    19.         </style>
    20.     </head>
    21.     <body>
    22.         <div id="subscribe">
    23.             <a id="subscribeWindowClose"><img src="close.png" /></a>
    24.             ...
    25.         </div>
    26.     </body>
    27. </html>
    Ищи проблему в другом месте.
     
  15. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Контейнер #subscribe генерирует еще один скрипт. Проверю его, отпишусь
     
  16. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Нашел проблему: #subscribe генерируется после определенного промежутка времени
    Код (Text):
    1. $(document).delay(25000).queue(function() {...}
    , а функция закрытия контейнера прописана
    Код (Text):
    1. $(document).ready(function() {...});
    , т.е. выполняется зразу после загрузки страницы. Переместил
    Код (Text):
    1. $('#subscribeWindowClose').click(function() {
    2.                $('#subscribe').addClass('display_none');
    3.                $.post('s.php', {status: '1'});
    4.             });
    в
    Код (Text):
    1. $(document).delay(25000).queue(function() {...}
    Затем вставил код кнопки закрытия в скрипт генерации контейнера, и все заработало:) Спасибо за помощь.
    На счет флажка сессии, я совсем не понял принцип работы. Поменял местами session_set_cookie_params() с session_start(). При закрытии браузера флажок не удаляется. Закрыл браузер, открываю страницу на следующий день - флажок все равно остался. Но заметил, если браузер остается открытым, то при простое около часа флажок удаляется. Может ли на это влиять движок интегрированного форума? Сам форум в отдельной папке, но его функции подключены ко всему сайту. В основном вход/выход, извлечение некоторых данных пользователей.