0

On one page (API page) I have a PHP array like this:

$arr = array("headline1" =>
         array("name" => "Headline 1",
               "description" => "Description of headline 1",
               "items" => array(
                        array("name"=>"John", "lastname"=>"Doe"),
                        array("name"=>"Peter", "lastname"=>"Pan")
                        )
                ),
         "headline2" => array("name" => "Headline 2",
               "description" => "Description of headline 2",
               "items" => array(
                        array("name"=>"Alexander", "lastname"=>"Doe"),
                        array("name"=>"Steven", "lastname"=>"Smith")
                        )
                ),
         "headline3" => array("name" => "Headline 3",
               "description" => "Description of headline 3",
               "items" => array(
                        array("name"=>"John", "lastname"=>"Doeh"),
                        array("name"=>"Peter", "lastname"=>"Pans")
                        )
                )
         );

And from this array the script creates json encoded version :

echo json_encode($arr);

So, my problem is with javascript on other page. I want to use jQuery $.getJSON function to retrieve this data and make var like this:

var categoryData = {
headline1: {
    name: "Headline 1",
    description: "Description of headline 1",
    items: [
        {
            name: "John",
            lastname: "Doe"
        },
        {
            name: "Peter",
            horoscope: "Pan"
        }
    ]
},

headline2: {
    name: "Headline 2",
    description: "Description of headline 2",
    items: [
        {
            name: "Alexander",
            lastname: "Doe"
        },
        {
            name: "Steven",
            horoscope: "Smith"
        }
    ]
},



headline3: {
    name: "Headline 3",
    description: "Description of headline 3",
    items: [
        {
            name: "John",
            lastname: "Doeh"
        },
        {
            name: "Peter",
            horoscope: "Pans"
        }
    ]
}
};

How can I achieve this with jQuery $.getJSON function?

EDIT :

My other Javascript function (jQuery mobile function)

    function showCategory( urlObj, options )
{

var categoryData = [];
$.getJSON('http://localhost/tst/sig.php', function(json) {
  categoryData = json;
});

var categoryName = urlObj.hash.replace( /.*category=/, "" ),

    // Get the object that represents the category we
    // are interested in. Note, that at this point we could
    // instead fire off an ajax request to fetch the data, but
    // for the purposes of this sample, it's already in memory.
    category = categoryData[ categoryName ],

    // The pages we use to display our content are already in
    // the DOM. The id of the page we are going to write our
    // content into is specified in the hash before the '?'.
    pageSelector = urlObj.hash.replace( /\?.*$/, "" );

if ( category ) {
    // Get the page we are going to dump our content into.
    var $page = $( pageSelector ),

        // Get the header for the page.
        $header = $page.children( ":jqmData(role=header)" ),

        // Get the content area element for the page.
        $content = $page.children( ":jqmData(role=content)" ),

        // The markup we are going to inject into the content
        // area of the page.
        markup = "<p>" + category.description + "</p>",

        // The array of items for this category.
        cItems = category.items,

        // The number of items in the category.
        numItems = cItems.length;

    // Generate a list item for each item in the category
    // and add it to our markup.
    for ( var i = 0; i < numItems; i++ ) {
        markup += "<div data-role='collapsible' data-theme='a' data-content-theme='e'><h3>" + cItems[i].name + "</h3><p>"+ cItems[i].horoscope +"</p></div>";
    }
    markup += "</ul><p><a href='#one' data-rel='back' data-role='button' data-inline='true' data-icon='back'>Vratite se nazad</a></p>   ";

    // Find the h1 element in our header and inject the name of
    // the category into it.
    $header.find( "h1" ).html( category.name );

    // Inject the category items markup into the content element.
    $content.html( markup );

    // Pages are lazily enhanced. We call page() on the page
    // element to make sure it is always enhanced before we
    // attempt to enhance the listview markup we just injected.
    // Subsequent calls to page() are ignored since a page/widget
    // can only be enhanced once.
    $page.page();

    // Enhance the listview we just injected.
    $content.find( ":jqmData(role=collapsible)" ).collapsible();
    $content.find( ":jqmData(role=button)" ).button();

    // We don't want the data-url of the page we just modified
    // to be the url that shows up in the browser's location field,
    // so set the dataUrl option to the URL for the category
    // we just loaded.
    options.dataUrl = urlObj.href;

    // Now call changePage() and tell it to switch to
    // the page we just modified.
    $.mobile.changePage( $page, options );
        }
    }
8
  • What problem are you having? Set the url in getJSON and call it. Commented Aug 17, 2012 at 13:11
  • I don't know how? I called like this and doesn't work $.getJSON('http://localhost/tst/sig.php', function(json) { var categoryData = []; categoryData = json; }); Commented Aug 17, 2012 at 13:13
  • $.getJSON('url-to-php-script.php', function(data) { /* do awesome stuff with data */ }) ... have a look at the documentation: api.jquery.com/jQuery.getJSON Commented Aug 17, 2012 at 13:13
  • What exactly does "doen't work" mean? What do you expect to happen? You have to do something categoryData, not just assign it. Please update your question and add your JavaScript code. Commented Aug 17, 2012 at 13:14
  • 1
    You will find many related questions here on SO. Ajax is asynchronous, the callback is executed some time later, after the whole script finished. Execution does not wait until the response was received. Why do you think you have to pass a callback? If this code was synchronous, it could return the result directly from $.getJSON. You have to put all the code that depends on the response into the callback. Commented Aug 17, 2012 at 13:26

1 Answer 1

0

jQuery.getJSON is asynchronous and needs a callback function, you can't directly assign the results to a variable. To use it, you need to make the output of your PHP script a single JSON string - no "var catData =" before the "object literal", and no semicolon behind. Also don't forget to serve the JSON with the appropriate MIME type.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.