Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Почему не передаются данные в json?


Recommended Posts

Здравствуйте! Передаю данные о разрешении экрана пользователя в контроллер header с помощью json.

<script type="text/javascript">
$(function() {
    $.post('index.php?route=common/header', { width: screen.width, height: screen.height}, function(json) { 
        if(json.outcome == 'success') { 
            alert('success!');
        } else {
            alert('Unable to let PHP know what the screen resolution is!');
        }
    },'json');
});
</script>

В самом контроллере, внутри функции index() находится такой код, который почему-то не работает:

if(isset($this->request->post['width']) && isset($this->request->post['height'])) {
    $this->session->data['screen_width'] = $this->request->post['width'];
  $this->session->data['screen_height'] = $this->request->post['height'];
    echo json_encode(array('outcome'=>'success'));
} else {
    echo json_encode(array('outcome'=>'error','error'=>"Couldn't save dimension info"));
}

Т.е. ширина и высота остается не переданной и всегда отдается Couldn't save dimension info. ЧЯДНТ?

Надіслати
Поділитися на інших сайтах


Должно передаваться!

 

А что в консоли браузера?

В этом весь прикол. В консоли все нормально, post запрос уходит с данными о разрешении. Но вот почему-то до common/header они не доходят.

Надіслати
Поділитися на інших сайтах


В этом весь прикол. В консоли все нормально, post запрос уходит с данными о разрешении. Но вот почему-то до common/header они не доходят.

var_dump($this->request->post);
Надіслати
Поділитися на інших сайтах

Попробуйте "тык":

 

- замените && на ||

 

- "такой код" вынесите в отдельную функцию и вызывайте ее

- вместо $this->request->post [...] используйте $_POST

Это уже пробовал давно, результат нулевой. В отдельную функцию выносить не вариант, мне нужны данные именно в index.

Змінено користувачем reeditor
Надіслати
Поділитися на інших сайтах


Решение которое вам подсказали выше, о выносе в отдельную функцию - правильное. POST проходит, затем а вот когда идет GET - нет никого POST,

поэтому вы и получаете сначала а) на GET - {"outcome":"error","error":"Couldn't save dimension info"} (как не ожидается), и только потом на document.ready POST б) {"outcome":"success"} в ответе на POST (как ожидается)

Змінено користувачем tabook
Надіслати
Поділитися на інших сайтах

Решение которое вам подсказали выше, о выносе в отдельную функцию - правильное. POST проходит, затем а вот когда идет GET - нет никого POST,

поэтому вы и получаете сначала а) на GET - {"outcome":"error","error":"Couldn't save dimension info"} (как не ожидается), и только потом на document.ready POST б) {"outcome":"success"} в ответе на POST (как ожидается)

 

Отдельная функция - это не навечно, а только для локализации проблемы.

 

Исходник для получения разрешения экрана взяли отсюда?

Да, исходник отсюда. Отдельная функция заработала!

Только как мне теперь использовать полученные данные в основной функции index?

Змінено користувачем reeditor
Надіслати
Поділитися на інших сайтах


Через сессию, у вас же в коде

$this->session->data['screen_height']

Но естественно, первый раз не заработает. Сначала пройдет GET, клиент получит страницу от сервера, выполнится скрипт, который передаст разрешение обратно серверу.

 

А вы пытаетесь у незнакомого человека имя узнать до того как спросили? Например Вася? Здравствуйте, как вас зовут? Так вот в скрипте именно это вы и делаете. Даже если засунете в index() - пройдет сначала GET, а потом только POST

Надіслати
Поділитися на інших сайтах

Отдельная функция - это не навечно, а только для локализации проблемы.

 

Исходник для получения разрешения экрана взяли отсюда?

Проблема тут одна - я написал выше. Попытка получить ответ до того, как задан вопрос. Так не бывает. Если только не делать говнокод с принудительным рефрешем страницы.

Надіслати
Поділитися на інших сайтах

Отдельная функция заработала!

Только как мне теперь использовать полученные данные в основной функции index?

 

Во, уже лучше.

Теперь, если уж так хочется, можно вернуть "такой код" обратно, обеспечив его НЕВЫПОЛНЕНИЕ, когда index() выполняет GET-запрос

Надіслати
Поділитися на інших сайтах


Проблема тут одна - я написал выше. Попытка получить ответ до того, как задан вопрос. Так не бывает. Если только не делать говнокод с принудительным рефрешем страницы.

С рефрешем я делал, тут вообще не вариант. Как я понимаю, сначала отправить post, а потом получить get не выйдет, т.к. код скрипта находится в шаблоне, который рендерится с помощью get, так? Мне просто интересно, как реализовать задуманное. Нужно в зависимости от разрешения подключить модуль. Т.е. если разрешение <1000, то подключаем один вариант модуля, сделанный для мобильных, если больше - то другой, сделанный для ПК. Через css и js это в данном случае делать не вариант. Тут тоже камень о двух концах, т.к. модули подключаются в контроллере перед рендерингом.

 

Теперь, если уж так хочется, можно вернуть "такой код" обратно, обеспечив его НЕВЫПОЛНЕНИЕ, когда index() выполняет GET-запрос

Как это сделать до выполнения get-запроса?

Надіслати
Поділитися на інших сайтах


 

Как это сделать до выполнения get-запроса?

 

Если навскидку и псевдокодом, то как-то так

if (!isset($_GET) или $_SERVER['REQUEST_METHOD'] != 'GET')
  {
    "такой код"
  }

Этот фрагмент будет выполняться ВО ВРЕМЯ выполнения функцией index() и GET-, и POST-запросов.

Надіслати
Поділитися на інших сайтах


хе

$.post('index.php?route=common/header'

 

Вы когда передаете запрос?

 

И куда?

 

Рекомендую для этого запроса сделать отдельный  метод

index.php?route=common/header/screen

 

а затем уже использовать все как хотели

 

Т.е. первый заход по сессии

Отправка запроса на размеры экрана и установка сессионных переменных

 

Затем уже обрабатывать их

 

Кроме того.. можно эти данные тупо засунуть в куки навечно.

Надіслати
Поділитися на інших сайтах

To ТС

 

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

 

А для "начиная со второй" у Вас уже вроде все есть.

Надіслати
Поділитися на інших сайтах


вместо $this->request->post [...] используйте $_POST

Ни в коем случае.

Надіслати
Поділитися на інших сайтах

Мультиакки нынче снова в моде?

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.