Jit.js, Jquery Json & PHP json_encode odd issues - php
I chose to use JIT.js rgraph for a project I am working on. What I've done was taken the examples and began slowly merging the js into the projects core files. Simple! The hang up I've run into has me literally stumped.
example.js has (assumed to be hand written at some point) json like so.
var json = {
id: "190_0",
name: "Pearl Jam",
children: [{
id: "306208_1",
name: "Pearl Jam & Cypress Hill",
data: {
relation: "<h4>Pearl Jam & Cypress Hill</h4><b>Connections:</b><ul><li>Pearl Jam <div>(relation: collaboration)</div></li><li>Cypress Hill <div>(relation: collaboration)</div></li></ul>"
},
children: [{
id: "84_2",
name: "Cypress Hill",
data: {
relation: "<h4>Cypress Hill</h4><b>Connections:</b><ul><li>Pearl Jam & Cypress Hill <div>(relation: collaboration)</div></li></ul>"
},
children: []
}]
},...
I need the json file dynamically generated in a sense and the most productive way for me to use the json is to create a static file if/when relative parts of the project are updated instead of generating json every time the page loads. Makes sense right?
json.php looks like this
$project = array(
"id" => "1",
"name" => "Testing Project",
"children" => array (
"id" => "2",
"name" => "Sub 1",
"data" => array(
"relation" => "<h4>Testing Project</h4><b>Structure:</b><ul><li>Sub1</li><li>Section 1</li></ul>"
),
"children" => array(
"id" => "3",
"name" => "Section 1",
"data" => array(
"relation" => "<h4>Section 1</h4><b>Structure:</b><ul><li>Testing Project</li><li>Sub 1</li></ul>"
),
"children" => ''
)
)
);
// header('Content-type: application/json'); /* DOES NOTHING */
echo json_encode($project);
my Arrays are hand written at the moment to make sure the process works as intended before programmatically generating the arrays from the database. There are other pieces to the puzzle I do not believe are at all involved at this time but the next piece we need to look at is the ajax call to fetch json.php which is in my custom.js file.
function init() {
var json = (function () {
var json = null;
$.ajax({
'async': false,
'global': true,
'url': 'js/json.php',
'dataType': "json",
'success': function (data) {
json = data;
console.log(data);
}
});
return json;
})(); ... continue with JIT.js functions
I added console.log(data) to see if the json was coming back formatted and this is what that looks like console.log screenshot using custom.js ajax call So then I reused the example.js file and console.log(data) give us console.log screenshot using example.js
The only obvisou difference is that the example.js json is be represented as an array, not an object. Even stranger still is that when I run the example using the custom.js file with the ajax call "Testing Project" does appear on the graph but no children elements. In the screenshot for custom.js console.log shows all the children elements as children: object, not children:Array[] like example.js
My first thought was to see if I can ensure that all json_encoding forced the associative arrays into "arrays". And yea... lots of time wasted looking at the obvious. So my next thought was it must be in the formatting. example.js used [{ for each child element but json_encode does not. I cannot locate any information to confirm if that really is the problem or not, but, none the less I cant rule that out. I also checked into sequential indexes. example.js certainly does not have sequential indexes. I even went ahead and sorted the arrays before encoding json_encode(array_values($project)); to see what happens and while it outputs to a browser with indexes it of course shows nothing in the graph.
I feel like im spinning in circles ( not in the good eagle circling prey kinda way ) but getting to far off focus to figure this out. I need some fresh perspective and ideas what might be going wrong.
**Edit
I've also tried to convert the strings manually with PHP. still not working. Any ideas?
WOW, Just over 24 hours and I end up doing something like this. It works by making each child with content an array of arrays.
$test = array(
'id' => "1",
'name' => "testing sample",
'children' => array(
array(
...
),array(
...
'children' =>array(),
),
)
);
echo json_encode($test);
Related
JSON getting data from multidimensional arrays
I have been populating a chart embed with data from a multidimensional PHP array ($result). When printing the array to JSON (using print json_encode($result, JSON_NUMERIC_CHECK);) i got the following array structure: [ { "name":"Array1", "data":[ 1, 2, 3 ] }, { "name":"Array2", "data":[ 1, 2, 3 ] } ] I used this array to populate my highcharts in the code below. This used to work just fine but after I changed the setup of my array it will now have to be reworked. $.getJSON("../data.php", {id: escape(tableName)}, function(json) { chartOptions.chart1.xAxis.categories = json[0]['data']; chartOptions.chart1.series[0].data = json[1]['data']; }); The new setup of my $result array after making some changes is the below: { "Array1":{ "data":[ "1", "2", "3" ] }, "Array2":{ "data":[ "1", "2", "3" ] } } As such, the code I used to populate my Highcharts no longer works. I would very much appreciate if anyone can help me understand how I can rework the $.getJSON code such that it would work with the new array structure. Or maybe inform me if I have to stick with the old array setup? Thanks.
From what I can tell (haven't tested), you just need to change: $.getJSON("../data.php", {id: escape(tableName)}, function(json) { chartOptions.chart1.xAxis.categories = json[0]['data']; chartOptions.chart1.series[0].data = json[1]['data']; }); To $.getJSON("../data.php", {id: escape(tableName)}, function(json) { chartOptions.chart1.xAxis.categories = json['Array1']['data']; chartOptions.chart1.series[0].data = json['Array2']['data']; }); The change in the JSON structure changed from an array of dictionaries, to a dictionary of dictionaries, so you no longer access it via index, instead you access it by key (Array1, Array2).
Turning my php array into [object Object] json/JavaScript
JSON is quite confusing and I haven't been able to find a post that can help me so I decided to ask the question myself. Quick Summary I need my php array to show up as [object Object] for every array containing an id, label,and type -- when passed through to my JavaScript using json. Here is what I've tried: if( $node_id == NULL ) { echo json_encode(array( 0 => array( array("id" => 1, "label" => "A lunch", "type" => "folder"), array("id" => 2, "label" => "A lunch", "type" => "folder")) )); } When I run this code I keep getting my alert to display: {"0":{"0":{"id":1,"label":"A lunch","type":"folder"},"1":{"id":2,"label":"A lunch","type":"folder"}}} when it should look like [object Object],[object Object] so could someone please help convert it to that format through json, or however it might be done?
You're alerting a string, so it seems that jQuery is not recognizing your response as JSON, and it is not being parsed. Try this: $.ajax({ url : "php/resource.php", data : { node_id: node_id }, dataType : "json" }).done(function(data) { alert(data); return callback(null, data); }).fail(function() { return callback("AJAX error"); });
Also, you may set content type to application/json in your php header('Content-Type','application/json');
DataTables with JSON, AJAX and PHP not displaying any data
I've been trying to get DataTables to work with my existing Ajax search function - which works by itself. I have the following code: $('#SearchResults').dataTable({ "bProcessing": true, "bServerSide": true, "bRetrieve": true, "sAjaxSource": "process.php?action=searchArtifact", "fnServerData": function (sSource, aoData, fnCallback){ aoData.push({ "name": "searchName", "value": $('#ArtifactSearch').attr('value') }); $.ajax({ "dataType": "json", "type": "POST", "url": sSource, "data": aoData, "success": fnCallback }); } }); The PHP is returning a valid JSON object (using JSON_FORCE_OBJECT): {"0":{"ARTIFACT_ID":"4E2FE3BCE356C","ARTIFACT_NAME":"123","ARTIFACT_TYPE":"UI","ARTIFACT_LABEL":"Test_Int_EAS_123","ARTIFACT_LOCATION":"Int","ARTIFACT_DOMAIN":"ABC","ARTIFACT_AUTHOR":null,"REGISTERED_EMAIL":"test#test.com","REGISTERED_DATE":"27-07-2011","REGISTERED_TIME":"11:09:00"} I can see this all fine in FireBug, but my empty table is not being populated with this data. Any ideas? #Kyle: Errr - thats it. I guess I don't have one? This is my first attempt (struggle) with DataTables and I'm just copying from the documentation: http://www.datatables.net/usage/callbacks#fnServerData #MarcB: Added that - but still no data displayed. Thanks for the help
I was having a similar problem. Turns out I wasn't forming the JSON response properly. This worked for me: <?php $arr = array ('aaData' => array( array('3','35','4', '$14,500', '$15,200','$16,900','5','1'), array('1','16','4', '$14,200', '$15,100','$14,900','Running','1'), array('5','25','4', '$14,500', '$15,600','$16,900','Not Running','1') ) ); echo json_encode($arr); ?>
This plugin expects the returned JSON object to be an object, with a property which is an array of arrays. This property should be called 'aaData'. You are not returning an object; you are just returning the array.
Check out this json resource example from DataTables.net: http://datatables.net/examples/examples_support/json_source.txt. Notice that you are returning json with brackets as compared to the example's braces.
you can remove the $.ajax part, instead you can use the $.getJSON method.
You can also add the following to avoid adding an extra object like "aaData": "sAjaxDataProp": ''
What are you setting sEcho to? Your JSON should have this structure: { "sEcho": 'refer to "sEcho" in $_GET or $_POST; don't forget to sanitize', "iTotalRecords": 'for pagination', "iTotalDisplayRecords": 'number displayed', "aaData" => { /* your data here */ } }
This is a few years late but might help someone. :) DataTable cannot render null values. See defaultContent to set content when data return is null. See link: https://datatables.net/reference/option/columns.defaultContent For legacy dataTables, see http://legacy.datatables.net/ref and search for sDefaultContent
MongoDB : How can i insert a javascript array with PHP (instead of an object)?
$update = $col->update(array('_id' => 'test'), array('$push' => array('friends' => 1)), array('safe' => true, 'upsert' => true)); $test = $col->findOne(array('_id' => 'test')); debug(compact('update', 'test')); Does not work as expected. I get (checking via RockMongo) : { "_id": "test", "friends": { "0": 1 } } I want/expect to have this : { "_id": "test", "friends": [ 1 ] } Any ideas ? Thanks !
I spent a good amount of time a while back troubleshooting why my data was getting inserted wrongly only to find out that RockMongo doesn't show the data correctly. It's belive its because RockMongo isn't really showing the data as a Mongo document, but instead as PHP. I found this to differ for a couple of different datatypes between firefox and chrome for some reason ... arrays, dates, MongoID's But in the end, I did a find() on the command line and it was correct. I wouldn't trust what RockMongo is telling you, see an example below. Also is there a reason you need to use "safe" ? Actual Data What RockMongo says (wrong)
jqGrid with JSON data renders table as empty
I'm trying to create a jqgrid, but the table is empty. The table renders, but the data doesn't show. The data I'm getting back from the php call is: { "page":"1", "total":1, "records":"10", "rows":[ {"id":"2:1","cell":["1","image","Chief Scout","Highest Award test","0"]}, {"id":"2:2","cell":["2","image","Link Badge","When you are invested as a Scout, you may be eligible to receive a Link Badge. (See page 45)","0"]}, {"id":"2:3","cell":["3","image","Pioneer Scout","Upon completion of requirements, the youth is invested as a Pioneer Scout","0"]}, {"id":"2:4","cell":["4","image","Voyageur Scout Award","Voyageur Scout Award is the right after Pioneer Scout.","0"]}, {"id":"2:5","cell":["5","image","Voyageur Citizenship","Learning about and caring for your community.","0"]}, {"id":"2:6","cell":["6","image","Fish and Wildlife","Demonstrate your knowledge and involvement in fish and wildlife management.","0"]}, {"id":"2:7","cell":["7","image","Photography","To recognize photography knowledge and skills","0"]}, {"id":"2:8","cell":["8","image","Recycling","Demonstrate your knowledge and involvement in Recycling","0"]}, {"id":"2:10","cell":["10","image","Voyageur Leadership ","Show leadership ability","0"]}, {"id":"2:11","cell":["11","image","World Conservation","World Conservation Badge","0"]} ]} The javascript configuration looks like so: $("#"+tableId).jqGrid ({ url:'getAwards.php?id='+classId, dataType : 'json', mtype:'POST', colNames:['Id','Badge','Name','Description',''], colModel : [ {name:'awardId', width:30, sortable:true, align:'center'}, {name:'badge', width:40, sortable:false, align:'center'}, {name:'name', width:180, sortable:true, align:'left'}, {name:'description', width:380, sortable:true, align:'left'}, {name:'selected', width:0, sortable:false, align:'center'} ], sortname: "awardId", sortorder: "asc", pager: $('#'+tableId+'_pager'), rowNum:15, rowList:[15,30,50], caption: 'Awards', viewrecords:true, imgpath: 'scripts/jqGrid/themes/green/images', jsonReader : { root: "rows", page: "page", total: "total", records: "records", repeatitems: true, cell: "cell", id: "id", userdata: "userdata", subgrid: {root:"rows", repeatitems: true, cell:"cell" } }, width: 700, height: 200 }); The HTML looks like: <table class="awardsList" id="awardsList2" class="scroll" name="awardsList" /> <div id="awardsList2_pager" class="scroll"></div> I'm not sure that I needed to define jsonReader, since I've tried to keep to the default. If the php code will help, I can post it too.
I got it to work! The dataType field should be datatype. It's case sensitive.
The problem also occures when you include script jquery.jqGrid.min.js before then grid.locale-en.js. Check this if there are any problems with controller's method call.
I experienced the same problem when migrating from jqGrid 3.6 to jqGrid 3.7.2. The problem was my JSON was not properly double-quoted (as required by JSON spec). jqGrid 3.6 tolerated my invalid JSON but jqGrid 3.7 is stricter. Refer here: http://simonwillison.net/2006/Oct/11/json/ Invalid: { page:"1", total:1, records:"10", rows:[ {"id":"2:1","cell":["1","image","Chief Scout","Highest Award test","0"]}, {"id":"2:2","cell":["2","image","Link Badge","When you are invested as a Scout, you may be eligible to receive a Link Badge. (See page 45)","0"]}, {"id":"2:3","cell":["3","image","Pioneer Scout","Upon completion of requirements, the youth is invested as a Pioneer Scout","0"]} ]} Valid: { "page":"1", "total":1, "records":"10", "rows":[ {"id":"2:1","cell":["1","image","Chief Scout","Highest Award test","0"]}, {"id":"2:2","cell":["2","image","Link Badge","When you are invested as a Scout, you may be eligible to receive a Link Badge. (See page 45)","0"]}, {"id":"2:3","cell":["3","image","Pioneer Scout","Upon completion of requirements, the youth is invested as a Pioneer Scout","0"]} ]}
I also got it to work: datatype is the correct spelling -- it's shown that way in the example but it is inconsistent with everything else in the library so it was easy to get wrong I'm getting very tired chasing this sparse documentation around and I really feel like JSON, which is right and proper to be using in JavaScript, has really been given short coverage in favor of XML. Python and JavaScript together, through JSON, is a really strong combination, but it's a constant struggle with this particular library. Anyone with an alternative that: 1> Properly supports jQuery UI themes (including rounded corners!) (http://datatables.net has much nicer support for themes) 2> Allows resizing of columns (http://datatables.net doesn't support this out of the box) 3> Allows sub-grids (http://datatables.net lets you do whatever you want here, through an event) please let me know. I'm spending more time on this one part of my interface than on the whole rest of it combined and it's all the time spent searching for working examples and "trying things" which is just getting annoying. S
This might be a older post but I will post my success just to help others. Your JSON needs to be in this format: { "rows": [ { "id": 1, "cell": [ 1, "lname", "fname", "mi", phone, "cell1", "cell2", "address", "email" ] }, { "id": 2, "cell": [ 2, "lname", "fname", "mi", phone, "cell1", "cell2", "address", "email" ] } ] } and I wrote this model in Zend so you can use it if you feel like it. Manipulate it how you want. public function fetchall ($sid, $sord) { $select = $this->getDbTable()->select(Zend_Db_Table::SELECT_WITH_FROM_PART); $select->setIntegrityCheck(false) ->join('Subdiv', 'Subdiv.SID = Contacts.SID', array("RepLastName" => "LastName", "Subdivision" => "Subdivision", "RepFirstName" => "FirstName")) ->order($sid . " ". $sord); $resultset = $this->getDbTable()->fetchAll($select); $i=0; foreach ($resultset as $row) { $entry = new Application_Model_Contacts(); $entry->setId($row->id); $entry->setLastName($row->LastName); $entry->setFirstName1($row->FirstName1); $entry->setFirstName2($row->FirstName2); $entry->setHomePhone($row->HomePhone); $entry->setCell1($row->Cell1); $entry->setCell2($row->Cell2); $entry->setAddress($row->Address); $entry->setSubdivision($row->Subdivision); $entry->setRepName($row->RepFirstName . " " . $row->RepLastName); $entry->setEmail1($row->Email1); $entry->setEmail2($row->Email2); $response['rows'][$i]['id'] = $entry->getId(); //id $response['rows'][$i]['cell'] = array ( $entry->getId(), $entry->getLastName(), $entry->getFirstName1(), $entry->getFirstName2(), $entry->getHomePhone(), $entry->getCell1(), $entry->getCell2(), $entry->getAddress(), $entry->getSubdivision(), $entry->getRepName(), $entry->getEmail1(), $entry->getEmail2() ); $i++; } return $response; }
Guys just want to help you in this. I got following worked: JSON var mydata1 = { "page": "1", "total": 1, "records": "4","rows": [{ "id": 1, "cell": ["1", "cell11", "values1" ] }, { "id": 2, "cell": ["2", "cell21", "values1"] }, { "id": 3, "cell": ["3", "cell21", "values1"] }, { "id": 4, "cell": ["4", "cell21", "values1"] } ]}; //Mark below important line. datatype "jsonstring" worked for me instead of "json". datatype: "jsonstring", contentType: "application/json; charset=utf-8", datastr: mydata1, colNames: ['Id1', 'Name1', 'Values1'], colModel: [ { name: 'id1', index: 'id1', width: 55 }, { name: 'name1', index: 'name1', width: 80, align: 'right', sorttype: 'string' }, { name: 'values1', index: 'values1', width: 80, align: 'right', sorttype: 'string'}], Regards,
In my case, the problem was caused by the following line of PHP code (which was taken from jqGrid demo): $responce->page = $page; What is wrong here is that: I am accessing property page of object $responce without creating it first. This caused Apache to display the following error message: Strict Standards: Creating default object from empty value in /home/mariusz/public_html/rezerwacja/apps/frontend/modules/service/actions/actions.class.php on line 35 And finally the error message used to be send to json reader within the script. I fixed the problem by creating empty object: $responce = new stdClass();
I don't think your ID is the correct type, I think it should be an int. For the given json you really don't need the jsonreader settings. What you have listed is the defaults anyway, plus you don't have a subgrid in your json. Try this: { "page":"1", "total":1, "records":"10", "rows":[ {"id":1 ,"cell":["1","image","Chief Scout","Highest Award test","0"]}, {"id":2,"cell":["2","image","Link Badge","When you are invested as a Scout, you maybe eligible to receive a Link Badge. (See page 45)","0"]}, {"id":3,"cell":["3","image","Pioneer Scout","Upon completion of requirements, the youth is invested as a Pioneer Scout","0"]}, {"id":4,"cell":["4","image","Voyageur Scout Award","Voyageur Scout Award is the right after Pioneer Scout.","0"]}, {"id":5,"cell":["5","image","Voyageur Citizenship","Learning about and caring for your community.","0"]}, {"id":6,"cell":["6","image","Fish and Wildlife","Demonstrate your knowledge and involvement in fish and wildlife management.","0"]}, {"id":7,"cell":["7","image","Photography","To recognize photography knowledge and skills","0"]}, {"id":8,"cell":["8","image","Recycling","Demonstrate your knowledge and involvement in Recycling","0"]}, {"id":9,"cell":["10","image","Voyageur Leadership ","Show leadership ability","0"]}, {"id":10,"cell":["11","image","World Conservation","World Conservation Badge","0"]} ]}
I was working with WAMP 2.4, I was being crazy with this problem, I tried lot of things, like install previous versions of PHP and like 5.2, een I tried in Windows XP, and lots of jqGrid options. Well thank to Oleg finally and Mariusz I find the only line: $responce = new stdClass(); Before the use of $responce could solve all, and now my grid is works Great!!! Thanks my friends.