Problem z żądaniem AJAX


(jacko1998) #1

Mam taki formularz:

<form method="get" action="language/change">
    <select name="language" id="language">
	<option value="en">English</option>
	<option value="pl">Polski</option>
    </select>
</form>

no i skrypt:

$(function()
{
    var $select = $("#language"),
	$type = $select.parent().attr('method'),
	$url = $select.parent().attr('action'),
	$data = {};

    $select.change(function()
    {

	$data['language'] = $(this).val();

	$.ajax(
	{
	    url: $url,
	    type: $type,
	    data: $data,
	    success: function()
	    {
	        console.log("Your language has been changed");
	    }
        });
    });
});

no i niby wszystko działa ponieważ w konsoli wyświetla sie napis ustalony w sekcji success , lecz nie wykonuje się część kodu php. Wyglada tak:

setcookie("language", $_GET['language'], time() + (60*60*24*365*15));

(Jim1961) #2

Spróbuj:

<?php

print_r($_GET);

i

$.ajax(
{
    url: $url,
    type: $type,
    data: $data,
    success: function(data, status, dummy)
    {
        console.log(status);
        console.log(data);
    }
 });

Co się pojawiło w konsoli ??

 

P.S.

Po co Ci te dolary w nazwach zmiennych ??


(jacko1998) #3

status: success

 

data:

Array
(
    [url] => language/change
    [language] => pl // lub en jezeli wybiore angielski
)

A te dolary, dlatego ze we wielu nowszych poradnikach widzialem, ze się je stosuje, aby wiedzieć, ze przechowuje ona jakiś element, pobrany za pomocą funkcji $. Podobnie do _ w metodach prywatnych w np. PHP


(Jim1961) #4

To teraz pytanie, skąd wiesz że setcookie się nie wykonało? Najlepiej zbadaj przez Firebuga/Dragonfly/whatever czy ciastko się ustawia.

 

W podpisie widzę Laravel; czy Ty czasem z niego tutaj nie korzystasz?

 

Ten dolar byłby logiczny gdyby przechowywał obiekt typu jQuery’owego; np listę elementów LI. Jak przechowujesz typy proste (int, string), nie ważne że pobrane za pomocą np. attr(), to konwencja myląca … i sądzę że przekonałbym każdego kodera w zespole. Podkreślenia w metodach prywatnych PHP się już podobno (w PHP5) nie stosuje; choć mi się to akurat podoba. W Pythonie chyba o stosują.


(jacko1998) #5

Akurat nie uzywam Laravel’a. Tworze maly cms. A co do tematu, to ciastko sie nie ustawia.


(Jim1961) #6

A spróbuj zrobić echo ‘cokolwiek’ po setcookie, bo jak zamykasz request bez body, to ciastko w przeglądarce może się nie odświeżać. W JS nie musisz tego odbierać, ważne żeby serwer coś wysłał.


(jacko1998) #7

To nic nie dalo. 


(Jim1961) #8

Zatem problem znajduje się tam gdzie zwykle; pomiędzy krzesłem a monitorem. Albo nam czegoś nie piszesz, albo nie umiesz sprawdzić/zdiagnozować prostych rzeczy.


(kostek135) #9
setcookie("language", $_GET['language'], time() + (60*60*24*365*15));

Jesteś pewny, że chcesz, aby ciastko było ustawione tylko dla obecnej ścieżki wraz z pod ścieżkami (/language/change/*)? Może ci się wydawać, że nie jest ustawione, bo część funkcjonalności, która z tego korzysta leży w innej gałęzi drzewa. Spróbuj ustawić je dla całej domeny i wtedy zobaczyć czy działa.

setcookie("language", $_GET['language'], time() + (60*60*24*365*15), "/");

(Jim1961) #10

Ale czy ścieżka ma znaczenie przy odbieraniu ciasteczek w PHP. Szybkie testy wskazuję, że nie, choć od zawsze (nie pamiętam dlaczego) dopisuję ukośnik przy ustawianiu … pewnie się już kiedyś przejechałem :]


(kostek135) #11

(jacko1998) #12

@kostek135: jest Pan GENIALNY ! Dodałem ukośnik i wszystko działa ! DZIĘKUJĘ !


(Jim1961) #13

Chciałbym Ci coś odpowiedzieć, ale nie wiem po co mi to napisałeś.