Jump to content
Sign in to follow this  
reeditor

Почему не передаются данные в 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. ЧЯДНТ?

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

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

var_dump($this->request->post);

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

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

Edited by reeditor

Share this post


Link to post
Share on other sites

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

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

Edited by tabook

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

 

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

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

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

Edited by reeditor

Share this post


Link to post
Share on other sites

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

 

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

 

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

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

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

Share this post


Link to post
Share on other sites

хе

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

 

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

 

И куда?

 

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

index.php?route=common/header/screen

 

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

 

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

Последний мой пост прошу удалить, он как бы избыточен...

Share this post


Link to post
Share on other sites

To ТС

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

В контексте (для отладки!) это читается как "попробуйте использовать" :)

Share this post


Link to post
Share on other sites

Спасибо всем, кто отписался. Пришлось отказаться от решения с перезагрузкой страницы.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.