JuanFernandoz
JuanFernandoz

Reputation: 799

Jqgrid doesn't load XML data

I'm trying to use JqGrid without sucess. I've read this wiki post at trirand and I do exactly all the steps on that page.

I've tried using other exaples that I've searched but I keep having the same error. I really don't why and it's very frustating.

When I view the HTML, the table (mysql) doesn't show. It's like my code doesn't accept the XML data from the PHP code. I'm ussing Appserv.

HTML code (myfirstgrid.html):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>My First Grid</title>
        <link rel="stylesheet" type="text/css" media="screen" href="css/ui-lightness/jquery-ui-1.8.2.custom.css" />
        <link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />

        <style type="text/css">
            html, body {
                margin: 0;
                padding: 0;
                font-size: 75%;
            }
        </style>

        <script src="/jquery-1.7.2.min.js" type="text/javascript"></script>
        <script src="/i18n/grid.locale-en.js" type="text/javascript"></script>
        <script src="/jquery.jqGrid.min.js" type="text/javascript"></script>

        <script type="text/javascript">
        $(function(){ 
            $("#list").jqGrid({
                url:'example.php',
                datatype: 'xml',
                mtype: 'GET',
                colNames:['Inv No','Date', 'Amount','Tax','Total','Notes'],
                colModel :[ 
                    {name:'invid', index:'invid', width:55}, 
                    {name:'invdate', index:'invdate', width:90}, 
                    {name:'amount', index:'amount', width:80, align:'right'}, 
                    {name:'tax', index:'tax', width:80, align:'right'}, 
                    {name:'total', index:'total', width:80, align:'right'}, 
                    {name:'note', index:'note', width:150, sortable:false} 
                ],
                pager: '#pager',
                rowNum:10,
                rowList:[10,20,30],
                sortname: 'invid',
                sortorder: 'desc',
                viewrecords: true,
                gridview: true,
                caption: 'My first grid'
            }); 
        }); 
        </script>
    </head>
    <body>
        <table id="list"><tr><td/></tr></table> 
        <div id="pager"></div> 
    </body>
</html>

PHP script (example.php):

<?php 
    include ("conexion.php");

    $page = 1;
    $limit = 10;
    $sidx = 'tax';
    $sord = 'asc';

    $result = mysql_query("SELECT COUNT(*) AS count FROM invheader"); 
    $row = mysql_fetch_array($result,MYSQL_ASSOC); 
    $count = $row['count']; 

    if( $count > 0 && $limit > 0) { 
        $total_pages = ceil($count/$limit); 
    } else { 
        $total_pages = 0; 
    }

    if ($page > $total_pages) $page=$total_pages;

    $start = $limit*$page - $limit;

    // if for some reasons start position is negative set it to 0 
    // typical case is that the user type 0 for the requested page 
    if($start <0) $start = 0; 

    // the actual query for the grid data 
    $SQL = "SELECT invid, invdate, amount, tax,total, note FROM invheader ORDER BY    $sidx $sord LIMIT $start , $limit"; 
    $result = mysql_query( $SQL ) or die("Couldn't execute query.".mysql_error()); 

    // we should set the appropriate header information. Do not forget this.
    //header("Content-type: text/xml;charset=utf-8");

    $s = "<?xml version='1.0' encoding='utf-8'?>";
    $s .=  "<rows>";
    $s .= "<page>".$page."</page>";
    $s .= "<total>".$total_pages."</total>";
    $s .= "<records>".$count."</records>";

    // be sure to put text data in CDATA
    while($row = mysql_fetch_array($result,MYSQL_ASSOC))
    {
        $s .= "<row id='". $row['invid']."'>";
        $s .= "<cell>". $row['invid']."</cell>";
        $s .= "<cell>". $row['invdate']."</cell>";
        $s .= "<cell>". $row['amount']."</cell>";
        $s .= "<cell>". $row['tax']."</cell>";
        $s .= "<cell>". $row['total']."</cell>";
        $s .= "<cell><![CDATA[". $row['note']."]]></cell>";
        $s .= "</row>";
    }
    $s .= "</rows>";

    echo $s;
?>

This is the XML result that comes from th PHP script (the XML was indented for readability purposes. The server returns the xml without line breaks):

<?xml version='1.0' encoding='utf-8'?>
<rows>
    <page>1</page>
    <total>1</total>
    <records>3</records>
    <row id='1'>
        <cell>1</cell>
        <cell>0000-00-00</cell>
        <cell>0.00</cell>
        <cell>0.00</cell>
        <cell>0.00</cell>
        <cell><![CDATA[note]]></cell>
    </row>
    <row id='2'>
        <cell>2</cell>
        <cell>2001-01-10</cell>
        <cell>103.00</cell>
        <cell>45.00</cell>
        <cell>149.00</cell>
        <cell><![CDATA[This is record 1]]></cell>
    </row>
    <row id='3'>
        <cell>3</cell>
        <cell>2001-02-10</cell>
        <cell>104.00</cell>
        <cell>46.00</cell>
        <cell>151.00</cell>
        <cell><! [CDATA[This is record 2]]></cell>
    </row>
</rows>

These are my questions:

  1. Why the isn't my data shown in the HTML?
  2. If the problem is the XML data, what is the best way to check if the XML is valid or not?

Upvotes: 1

Views: 1087

Answers (1)

JuanFernandoz
JuanFernandoz

Reputation: 799

Ok, Im found the solution. I extensively revised My code.

The problem is this:

    include ("conexion.php");

For some reason if you have the connetion parameters in other document this document sent the headers before the headers in this part:

    header("Content-type: text/xml;charset=utf-8");

So you need to set this parameters in your grid php document and make sure that you sent the headers in this line.

And that's it...

So many people have this question problem maybe this is the solution for that.

Upvotes: 2

Related Questions