Запись текущего значения в сессию

163
25 апреля 2018, 05:30

Я пытаюсь реализовать что то вроде мультиязычности на сайте. Принцип такой: огда пользователь заходит на сайте, поставить ему язык его браузера, при желании он может изменить язык выбрав соответсвующий язык в форме.

Проблема в том что, до клика на кнопку (отправки выбранного языка на сервер) переменная $_POST пустая, и по этому я не могу записать его в сессию что бы сохранить язык выбранный пользователем, а после нажатия на кнопку другого языка запись в сессии не перезаписывается. Форма и ajax запрос:

$('#multilanguage li input').click(function select_lang() { 
  // id инпутов это сокращение от названия языка, так я определяю какая кнопка была нажата 
  // смотрим какая кнопка была нажата 
  var lang = $(this).attr('id'); 
  //отправляем запрос 
  $.ajax({ 
    type: "POST", 
    url: "php/header.php", 
    data: { 
      'lang': lang 
    }, 
    cache: false, 
    success: function(response) { 
      console.log(response); 
 
    }, 
    error: function(error) { 
      alert('bad'); 
      console.log(error); 
    } 
  }); 
});
<form method="post" action="javascript:void(null);" id="multilanguage"> 
  <li> 
    <input type="button" name="lang" value="English" id="en"> 
  </li> 
  <li> 
    <input type="button" name="lang" value="Russian" id="ru"> 
  </li> 
</form>

Вот php:

@session_start();
//массив с языками для выбора 
$lang_arr = [
    "en" => array('English', 'Russian', 'Ukrainian'), 
    "ru" => array('Английский', 'Русский', 'Украинский')
];
//определяем язык браузера
preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]), $matches); 
$langs = array_combine($matches[1], $matches[2]); 
foreach ($langs as $n => $v)
    $langs[$n] = $v ? $v : 1; 
arsort($langs); 
$default_lang = key($langs);
$default_lang = substr($default_lang, 0, 2); 
//если пользователь не выбирал язык
if (!isset($_POST['lang'])) {
    //проверяем совпадает ли его язык браузера с перечнем доступных языков
    if(array_key_exists($default_lang, $lang_arr)) {
        //если всё хорошо заносим его в сессию
        $_SESSION['lang'] = $default_lang;
    }else {
        //если нет, то заносим в сессию английский язык
        $_SESSION['lang']= 'en';
    }
}
//если пользователь выбрал другой язык
if(isset($_POST['lang'])) {
    //проверяем всё ли корректно
    if(array_key_exists($_POST['lang'], $lang_arr)) {
        //если всё хорошо заносим в сессию выбранный язык
        $_SESSION['lang'] = $_POST['lang'];
    }else {
        //иначе ставим английский 
        $_SESSION['lang'] = 'en';
    }
}

Суть в том что в сессию заноситься язык браузера пользователя но когда я нажимаю на другой язык в сессию ничего не перезаписывается. подскажите, как сделать так, что бы после нажатия на кнопку обновлялась страница и в сессии менялся язык?

Answer 1

Для начала измените немного вашу форму, чтобы язык был не как ID, а как свойство или атрибут кнопки. Например

<form id="multilanguage">
    <li>
        <input type="button" name="lang" value="English" data-lang="en">
    </li>
    <li>
        <input type="button" name="lang" value="Russian" data-lang="ru">
    </li>
</form>

Далее такой JS код, в консольке все работает четко

$(document).on('click', 'input[name="lang"]', function() {
    var btn = $(this);
    var fields = new Object();
    fields.title = btn.val(); // Тайтл 
    fields.lang  = btn.attr('data-lang'); // Код

    $.ajax({
        url: 'php/header.php',
        type: 'POST',
        data: fields,
        dataType: 'json',
        beforeSend: function() {
            console.log('beforeSend', fields);
        },
        success: function(json) {
            console.log('success', json);
        }
    });
    return false;
});
READ ALSO
Редактирование комментариев

Редактирование комментариев

Нужно реализовать редактирование комментариев в течении 1 одной минуты на PHPПодскажите, как лучше всего это сделать

137
Проблема с указанием маршрута в Route::resource

Проблема с указанием маршрута в Route::resource

Здравствуйте , я создал путь Route::resource(); Там все прописал как положеноМне нужно, чтобы в blade по клику переходило на статью выбраную

153
формирование и сохранение документов google docs

формирование и сохранение документов google docs

Недавно начал заниматься темой и возник следующая проблема: есть форма и то, что в нне введено нужно записать в гуглодоки в файл схожий с вордовскимПри...

166