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 );
        }
    }
Grunje_D_D
  • 97
  • 2
  • 8
  • What problem are you having? Set the url in getJSON and call it. – epascarello Aug 17 '12 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; });` – Grunje_D_D Aug 17 '12 at 13:13
  • `$.getJSON('url-to-php-script.php', function(data) { /* do awesome stuff with data */ })` ... have a look at the documentation: http://api.jquery.com/jQuery.getJSON/ – Felix Kling Aug 17 '12 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. – Felix Kling Aug 17 '12 at 13:14
  • "doesn't work" means that this array is not populated right. Because my other javascript function is not parsing it – Grunje_D_D Aug 17 '12 at 13:16
  • Which other function are you talking about? How are you calling it? How is the data passed between those functions? We cannot help you if you don't provide your actual code. I assume you have a scope/timing issue, but without code, this is just guessing. Help us to help you! – Felix Kling Aug 17 '12 at 13:18
  • Sorry I've just posted other javascript function – Grunje_D_D Aug 17 '12 at 13:22
  • 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. – Felix Kling Aug 17 '12 at 13:26

1 Answers1

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.

Community
  • 1
  • 1
Bergi
  • 630,263
  • 148
  • 957
  • 1,375